一、前言
大家常常在问,如果想做期货多空交易,要怎么编写买入卖出代码才能实现。因此本文主要分享一个期货多空交易的策略模板,可以根据自己需求修改对应的买入卖出条件,实现快速因子验证。回测结果示例如图所示:
二、操作步骤:
1.修改,添加交易条件
示例给的是一个金叉BPK(买平开),死叉SPK(买平开)的示例策略,假如我们要叠加一个MACD指标,来辅助产生交易信号,那么应该像下面这样修改。且尤其要注意:修改模板的时候,注意不要修改买入卖出条件区域以外的内容。
2.绩效结果查看
想要查看某个品种,某个周期的回测收益曲线,只需要在对应的行情界面,双击这个因子公式就行。
3、代码如图所示:
- variable:TestHolding=0,maxhuiche=0,open_times=0,maxprofit=0,maxDhuiche=0,Dhuiche=0,maxshortprofit=0, 期货基准bp=0,hstmp=0,TMPzhishu=0,期货基准bp=0,profit=0,开仓成本:=0,delay=0;
- BK:0,nodraw();SK:0,nodraw();BP:0,nodraw();SP:0,nodraw();BPK:0,nodraw();SPK:0,nodraw(); // 此行不可修改,不可注释
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //-----------------------------------------------上面两行不要动----------------------------------------------------------------
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 双均线策略
- ma1:=ma(C,10);
- ma2:=ma(C,20);
- /////////////////////// 注意:策略信号需要用 := 赋值
- //BK:= 0,nodraw();// 买开指令,实际编写的时候进行替换
- //BP:= 0,nodraw();// 买平指令,同上
- //SK:= 0,nodraw();// 卖开指令,同上
- //SP:= 0,nodraw();// 卖平指令,同上
- BPK:=cross(ma1,ma2),nodraw(); // 可以自己修改BPK条件,同上
- SPK:=cross(ma2,ma1),nodraw(); // 可以自己修改SPK条件,同上
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // -------------------------------------------------下面的都不用动---------------------------------------------------------
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- 买入信号:BK OR BPK,nodraw();
- 卖出信号:SK OR SPK,nodraw();
- 卖平信号:SP,nodraw();
- 买平信号:BP,nodraw();
- 期货基准:= callstock('290000.BKZS',vtclose,-1,0); //引入商品期货市场指数
- t:BARSLAST(TestHolding=0),nodraw;//////////持仓周期
- 基准涨幅:=(期货基准-ref(期货基准,t))/ref(期货基准,t);//////持仓期间指数涨跌幅
- 持仓涨幅 := (C-ref(C,t))/ref(C,t);///////////
- 多头持仓收益 := 1*持仓涨幅;
- 空头持仓收益 := -1*持仓涨幅;
- 多头超额涨幅:= 1*(持仓涨幅 - 基准涨幅);
- 空头超额涨幅:= -1*(持仓涨幅 - 基准涨幅);
- 多头收益:= iff(TestHolding>0,(多头持仓收益 - ref(多头持仓收益,1)) * 100,0),LINETHICK0;////每个周期的多头收益
- 多头超额收益:=if(TestHolding>0,(多头超额涨幅-ref(多头超额涨幅,1))*100,0),LINETHICK0;//每个周期的对冲收益
- 空头收益:= iff(TestHolding<0,(空头持仓收益 - ref(空头持仓收益,1)) * 100,0),LINETHICK0;////每个周期的多头收益
- 空头超额收益:=if(TestHolding<0,(空头超额涨幅-ref(空头超额涨幅,1))*100,0),LINETHICK0;//每个周期的对冲收益
- 实时净值:= 1 + 1*(sum(多头收益,0) + sum(空头收益,0))/100,noaxis;
- 实时对冲净值:=1*(sum(多头超额收益,0) + sum(空头超额收益,0)),noaxis;
- /// SP
- if(ref(买平信号,delay) and TestHolding = -1) then begin
- TestHolding:=0;
- BBD:=0;
- DRAWTEXT(1,L*0.95,'买入平仓',colorwhite);
- VERTLINE(1,H+10,L-10,colorwhite,1,VTDOT);
- 期货基准sp:= callstock('290000.BKZS',vtclose,-1,0);
- thisprofit:=-1 * (C-开仓成本)/开仓成本;
- 期货thisprofit:=-1 * (期货基准sp-期货基准bp)/期货基准bp;
- 开仓成本:=0;
- 期货基准bp:=0;
- profit:=profit+thisprofit;
- open_times:=open_times+1;
- end
- /// BP
- if(ref(卖平信号,delay) and TestHolding = 1) then begin
- TestHolding:=0;
- BBD:=0;
- DRAWTEXT(1,L*0.95,'卖出平仓',colorwhite);
- VERTLINE(1,H+10,L-10,colorwhite,1,VTDOT);
- 期货基准sp:= callstock('290000.BKZS',vtclose,-1,0);
- thisprofit:=(C-开仓成本)/开仓成本;
- 开仓成本:=0;
- 期货基准bp:=0;
- profit:=profit+thisprofit;
- open_times:=open_times+1;
- end
- /// BK
- if(ref(买入信号,delay) and TestHolding=0) THEN begin
- TestHolding:=1;
- BBD:=BARPOS;
- DRAWTEXT(1 ,H+4,'买入开仓',colorred);
- //VERTLINE(1 ,H+10,L-10,coloryellow,1,VTDOT);
- 期货基准bp:= callstock('290000.BKZS',vtclose,-1,0);
- 开仓成本:=C;
-
- end
- /// SK
- if(ref(卖出信号,delay) and TestHolding = 0) then begin
- TestHolding:= -1;
- BBD:=BARPOS;
- DRAWTEXT(1 ,H+4,'卖出开仓',colorgreen);
- //VERTLINE(1 ,H+10,L-10,coloryellow,1,VTDOT);
- 期货基准bp:= callstock('290000.BKZS',vtclose,-1,0);
- 开仓成本:=C;
- end
- /// BPK
- if(ref(买入信号,delay) and TestHolding = -1) then begin
-
- DRAWTEXT(1,L*0.95,'空平',colorwhite);
- VERTLINE(1,H+10,L-10,colorwhite,1,VTDOT);
- 期货基准sp:= callstock('290000.BKZS',vtclose,-1,0);
- thisprofit:=-1 * (C-开仓成本)/开仓成本;
- 期货thisprofit:=-1 * (期货基准sp-期货基准bp)/期货基准bp;
- 开仓成本:=0;
- 期货基准bp:=0;
- profit:=profit+thisprofit;
- open_times:=open_times+1;
- TestHolding:=1;
- BBD:=BARPOS;
- DRAWTEXT(1 ,H+4,'多开',colorred);
- VERTLINE(1 ,H+10,L-10,coloryellow,1,VTDOT);
- 期货基准bp:= callstock('290000.BKZS',vtclose,-1,0);
- 开仓成本:=C;
- end
- /// SPK
- if(ref(卖出信号,delay) and TestHolding = 1) then begin
- BBD:=0;
- DRAWTEXT(1,L*0.95,'多平',colorwhite);
- VERTLINE(1,H+10,L-10,colorwhite,1,VTDOT);
- 期货基准sp:= callstock('290000.BKZS',vtclose,-1,0);
- thisprofit:=(C-开仓成本)/开仓成本;
- 开仓成本:=0;
- 期货基准bp:=0;
- profit:=profit+thisprofit;
- open_times:=open_times+1;
- TestHolding:= -1;
- BBD:=BARPOS;
- DRAWTEXT(1 ,H+4,'空开',colorgreen);
- VERTLINE(1 ,H+10,L-10,coloryellow,1,VTDOT);
- 期货基准bp:= callstock('290000.BKZS',vtclose,-1,0);
- 开仓成本:=C;
- end
- //…………………回撤统计开始…………………………………
- if profit>maxprofit THEN BEGIN
- maxprofit:=profit;
- Dhuiche:=0;
- END
- IF profit<maxprofit THEN BEGIN
- Dhuiche:=maxprofit-profit;
- END
- IF Dhuiche>maxDhuiche THEN BEGIN
- maxDhuiche:=Dhuiche;
- END
- BYL:=IF(开仓成本>0,C-开仓成本,0);
- 最近浮盈:=thisprofit,LINETHICK0;
- 最近指数涨跌:=期货thisprofit,LINETHICK0;
- 最近对冲收益:=thisprofit-期货thisprofit,LINETHICK0;
- 单位净值:实时净值,noaxis;
- 交易次数:open_times,LINETHICK0,nodraw();
- 持仓时间:=count(TestHolding>0,0),LINETHICK0;
- 交易时间:=count(期货基准>0,0),LINETHICK0;
- 当前持仓方向:TestHolding,LINETHICK0,nodraw();
复制代码
|
|