runmode:0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500;
if holding>0 and ma5<ma20 then sell(1,1,market);
if holding<0 and ma5>ma20 then sellshort(1,1,market);
if holding=0 and ma5>ma20 and entertime then buy(1,1,market);
if holding=0 and ma5<ma20 and entertime then buyshort(1,1,market);
if time>=150000 then begin
sell(1,1,market);
sellshort(1,1,market);
end
怎么改动上面的均线交易模型让它在图表固定轮询模式下执行的效果和上部分代码应用在走完K线模式下完全一样
简单的改法,自然是把各个条件“过去化”,如:ma5 改为 ref(ma(c,5),1);但这种方法碰到大型的、复杂的模型时,容易出错
可采用这种方法,把holding用全局变量cc替换,然后加入注释部分代码,注释色部分代码要放在信号语句的前面。
运行于图表固定轮询模式
runmode:0;
variable:cc=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500;
if holding>0 and cc<=0 then sell(1,1,limitr,o); //注释变化
if holding<0 and cc>=0 then sellshort(1,1,limitr,o); //注释变化
if holding=0 and cc>0 then buy(1,1,limitr,o); //注释变化
if holding=0 and cc<0 then buyshort(1,1,limitr,o); //注释变化
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then cc:=1;
if cc=0 and ma5<ma20 and entertime then cc:=-1;
if time>=150000 then begin cc:=0;
那么,下单条件可以K线走完,但止盈止损要盘中实时怎么处理呢?
这种逻辑就是代码实现K线走完模式和盘中模式并存,如下写法,就是在“开盘价下单语句”后面加入注释“盘中实时下单”就行了
运用于图表固定轮询模式
runmode:0;
variable:zs=0,cc=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500;
if holding>0 and cc<=0 then sell(1,1,limitr,o);
if holding<0 and cc>=0 then sellshort(1,1,limitr,o);
if holding=0 and cc>0 then buy(1,1,limitr,o);
if holding=0 and cc<0 then buyshort(1,1,limitr,o);
//盘中实时下单
if cc>0 and l<zs then begin
sell(1,1,limitr,min(o,zs-0.6));
cc:=0;
end
//盘中实时下单
if cc<0 and h>zs then begin
sellshort(1,1,limitr,max(o,zs+0.6));
cc:=0;
end
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then begin
cc:=1;
zs:=c-10;
end
if cc=0 and ma5<ma20 and entertime then begin
cc:=-1;
zs:=c+10;
end
if time>=150000 then begin
cc:=0;
end
runmode:0;
variable:zs=0,cc=0,hl=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500; //股指期货为例,其它品种自行修改时间
if holding>0 and cc<=0 then sell(1,1,limitr,o);
if holding<0 and cc>=0 then sellshort(1,1,limitr,o);
if holding=0 and cc>0 then buy(1,1,limitr,o);
if holding=0 and cc<0 then buyshort(1,1,limitr,o);
//移动止损多头离场
if cc>0 and l<zs then begin
sell(1,1,limitr,min(o,zs-0.6));
cc:=0;
end
//移动止损空头离场
if cc<0 and h>zs then begin
sellshort(1,1,limitr,max(o,zs+0.6));
cc:=0;
end
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then begin
cc:=1;
zs:=c-10;
hl:=h; //开仓后的最高值赋给hl
end
if cc=0 and ma5<ma20 and entertime then begin
cc:=-1;
zs:=c+10;
hl:=l; //开仓后的最低值赋给hl
end
//创新高后,上移hl
if cc>0 and h>hl then begin
hl:=h;
zs:=hl-10;
end
//创新低后,下移hl
if cc<0 and l<hl then begin
hl:=l;
zs:=hl+10;
end
//收盘平仓
if time>=150000 then begin
cc:=0;
end
runmode:0;
variable:cc=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500;
exitlong:cc<>1,tfilter;
exitshort:cc<>-1,tfilter;
enterlong:ref(cc,1)<>1 and cc=1,tfilter;
entershort:ref(cc,1)<>-1 and cc=-1,tfilter;
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then cc:=1;
if cc=0 and ma5<ma20 and entertime then cc:=-1;
if time>=150000 then cc:=0;
runmode:0;
input:cw(3,1,10,1);
variable:cc=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500; //开仓时间控制,商品时间自行修改
if holding>0 and cc<=0 then sell(1,cw,limitr,o);
if holding<0 and cc>=0 then sellshort(1,cw,limitr,o);
cond1:=cw+tholding2>=cw or not(islastbar); //平空成交后,"cw+tholding2>=cw "才会成立并开多
cond2:=cw-tholding2>=cw or not(islastbar); //平多成交后,"cw-tholding2>=cw "才会成立并开空
//此方法撤单和追单时间要控制在出信号的K线时间以内
if holding=0 and cc>0 and cond1 then buy(1,cw,limitr,o); //cond1为控制新增开多条件
if holding=0 and cc<0 and cond2 then buyshort(1,cw,limitr,o); //cond2位控制新增开空条件
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then cc:=1;
if cc=0 and ma5<ma20 and entertime then cc:=-1;
if time>=150000 then begin cc:=0;
zichan:asset,noaxis;
if barpos=1 then begin
MaxAsset:=zichan;
Maxhc:=0;
end
if zichan>MaxAsset then MaxAsset:=zichan;
if MaxAsset-zichan>Maxhc then Maxhc:=MaxAsset-zichan;
最大回撤:Maxhc,linethick0;
交易次数:totaltrade,linethick0;
正确率:percentwin,linethick0;
//这里的变量"MaxAsset”、"Maxhc" 其实是全局变量,可不必声明。有重新赋值变量值才会改变
runmode:0;
Globalvariable:hold=drawnull;
……//这里添加上你自己的模型
……//这里添加上你自己的模型
cc800988:=holding;//调用图表模型持仓,这句放在信号稳定的地方,即时下单的,就放图表下单语句的后面,K线走完下单的就放到图表下单语句的前面
drawtextex(1,1,800,0,'虚拟持仓为:'+numtostr(cc800988,0));//在图表上输出虚拟持仓以便监控
if not(islastbar) or workmode<>1 then exit;
xiadan800988:=cc800988-hold;
if xiadan800988>0.5 then begin
cang:=min(xiadan800988,abs(hold));
if hold<0 then tsellshort(1,cang,mkt,0,0,'800988'),allowrepeat;
cang:=xiadan800988+min(hold,0);
if cang>0 then tbuy(1,cang,mkt,0,0,'800988'),allowrepeat;
end
if xiadan800988<-0.5 then begin
cang:=min(abs(xiadan800988),abs(hold));
if hold>0 then tsell(1,cang,mkt,0,0,'800988'),allowrepeat;
cang:=abs(xiadan800988)-max(hold,0);
if cang>0 then tbuyshort(1,cang,mkt,0,0,'800988'),allowrepeat;
end
hold:=cc800988;
Globalvariable:hold=drawnull;
cc800988:=holding;//这句放在信号稳定的地方
//此部分改为你自己的模型(K线走完模型)
buycond:=count(c>o,2)=2;
sellcond:=count(c<o,2)=2;
if holding>0 and sellcond then sell(1,1,thisclose);
if holding<0 and buycond then sellshort(1,1,thisclose);
if holding=0 and buycond then buy(1,1,thisclose);
if holding=0 and sellcond then buyshort(1,1,thisclose);
//
drawtextex(1,1,800,0,'虚拟持仓为:'+numtostr(cc800988,0));//在图表上输入虚拟持仓以便监控
if not(islastbar) or workmode<>1 then exit;
xiadan800988:=cc800988-hold;
if xiadan800988>0.5 then begin
cang:=min(xiadan800988,abs(hold));
if hold<0 then begin
tsellshort(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平空 %.0f',cang);
end
cang:=xiadan800988+min(hold,0);
if cang>0 then begin
tbuy(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开多 %.0f',cang);
end
end
if xiadan800988<-0.5 then begin
cang:=min(abs(xiadan800988),abs(hold));
if hold>0 then begin
tsell(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平多 %.0f',cang);
end
cang:=abs(xiadan800988)-max(hold,0);
if cang>0 then begin
tbuyshort(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开空 %.0f',cang);
end
end
hold:=cc800988;
Globalvariable:hold=drawnull;
//蓝色部分改为你自己的模型
buycond:=h>ref(hhv(h,10),1);
sellcond:=l<ref(llv(l,10),1);
if holding>0 and sellcond then sell(1,1,market);
if holding<0 and buycond then sellshort(1,1,market);
if holding=0 and buycond then buy(1,1,market);
if holding=0 and sellcond then buyshort(1,1,market);
cc800988:=holding;//这句放在信号稳定的地方
drawtextex(1,1,800,0,'虚拟持仓为:'+numtostr(cc800988,0));//在图表上输入虚拟持仓以便监控
if not(islastbar) or workmode<>1 then exit;
xiadan800988:=cc800988-hold;
if xiadan800988>0.5 then begin
cang:=min(xiadan800988,abs(hold));
if hold<0 then begin
tsellshort(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平空 %.0f',cang);
end
cang:=xiadan800988+min(hold,0);
if cang>0 then begin
tbuy(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开多 %.0f',cang);
end
end
if xiadan800988<-0.5 then begin
cang:=min(abs(xiadan800988),abs(hold));
if hold>0 then begin
tsell(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平多 %.0f',cang);
end
cang:=abs(xiadan800988)-max(hold,0);
if cang>0 then begin
tbuyshort(1,cang,mkt,0,0,'800988'),allowrepeat;
debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开空 %.0f',cang);
end
end
hold:=cc800988;
input:cang1(1,0,10,1),cang2(1,0,10,1);
variable:cc1=0,cc2=0;
/////////////////////////////////模型1——10周期反手
hi:=ref(hhv(h,10),1);
lo:=ref(llv(l,10),1);
//
if cc1>0 and l<lo then begin
pc:=min(max(holding,0),cang1);///////////
kc:=cang1-pc;//////////
if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);//////////////
if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);////////////
cc1:=0;
end
if cc1<0 and h>hi then begin
pc:=min(abs(min(holding,0)),cang1);////////
kc:=cang1-pc;//////////////
if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);///////////////
if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);////////////
cc1:=0;
end
if cc1=0 and h>hi then begin
pc:=min(abs(min(holding,0)),cang1);
kc:=cang1-pc;
if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
cc1:=1;
end
if cc1=0 and l<lo then begin
pc:=min(max(holding,0),cang1);
kc:=cang1-pc;
if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
cc1:=-1;
end
/////////////////////////////////以上是模型1
/////////////////////////////////模型2——20周期反手
hi:=ref(hhv(h,20),1);
lo:=ref(llv(l,20),1);
if cc2>0 and l<lo then begin
pc:=min(max(holding,0),cang2); ///////////
kc:=cang2-pc;//////////////
if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);///////////////
if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);//////////////
cc2:=0;
end
if cc2<0 and h>hi then begin
pc:=min(abs(min(holding,0)),cang2);//////////////
kc:=cang2-pc;/////////////
if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);///////////
if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);///////////
cc2:=0;
end
if cc2=0 and h>hi then begin
pc:=min(abs(min(holding,0)),cang2);
kc:=cang2-pc;
if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
cc2:=1;
end
if cc2=0 and l<lo then begin
pc:=min(max(holding,0),cang2);
kc:=cang2-pc;
if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
cc2:=-1;
end
/////////////////////////////////以上是模型2
//有更多的模型,往后面添加即可
variable:lee=0;
kc1:=max(lee,0)-max(holding,0);
kc2:=min(lee,0)-min(holding,0);
if kc1<-0.5 then sell(1,abs(kc1),limitr,open);
if kc2>0.5 then sellshort(1,kc2,limitr,open);
if kc1>0.5 then buy(1,kc1,limitr,open);
if kc2<-0.5 then buyshort(1,abs(kc2),limitr,open);
//模型1
variable:cc1=0;
buycond1:=c>ref(c,1) and ref(c,1)>ref(c,2);
sellcond1:=c<ref(c,1) and ref(c,1)<ref(c,2);
if cc1>0 and sellcond1 then cc1:=0;
if cc1<0 and buycond1 then cc1:=0;
if cc1=0 and buycond1 then cc1:=1;
if cc1=0 and sellcond1 then cc1:=-1;
//模型2
variable:cc2=0;
buycond2:=ma(c,5)>ma(c,20);
sellcond2:=ma(c,5)<ma(c,20);
if cc2>0 and sellcond2 then cc2:=0;
if cc2<0 and buycond2 then cc2:=0;
if cc2=0 and buycond2 then cc2:=1;
if cc2=0 and sellcond2 then cc2:=-1;
//模型3
variable:cc3=0;
buycond3:=ma(c,10)>ma(c,30);
sellcond3:=ma(c,10)<ma(c,30);
if cc3>0 and sellcond3 then cc3:=0;
if cc3<0 and buycond3 then cc3:=0;
if cc3=0 and buycond3 then cc3:=1;
if cc3=0 and sellcond3 then cc3:=-1;
lee:=1*cc1+1*cc2+1*cc3;//每个模型乘以各自的下单系数
ma5:=ma(c,5);
ma10:=ma(c,10);
input:tq(5,3,60,1); //提前下单秒数,默认为5
abb:=(time0-timetot0(dynainfo(207))<=tq) or not(islastbar);
if abb then begin
if holding>0 and ma5<ma10 then sell(1,1,thisclose);
if holding<0 and ma5>ma10 then sellshort(1,1,thisclose);
if holding=0 and ma5>ma10 then buy(1,1,thisclose);
if holding=0 and ma5<ma10 then buyshort(1,1,thisclose);
end
SENDPHONEMSG('出现大阳线',0); //微信提示“出现大阳线”的消息.
SENDPHONEMSG('出现大阳线',1);//微信提示红色提示“出现大阳线”的消息。
第一步、首先在macd指标里加入以下2句:
ema12: ema(c,12),linethick0;
ema26: ema(c,26),linethick0;
第二步、复制以下代码即可
runmode:1;
em1:=stkindi(stklabel,'macd.ema12',0,17,-1);
em2:=stkindi(stklabel,'macd.ema26',0,17,-1);
ema12:=em1*11/13+c*2/13;
ema26:=25/27* em2 +c*2/27;
diff:ema12-ema26;
dea1:=stkindi(stklabel,'macd.dea',0,17,-1);
dea:dea1*4/5+diff/5;
runmode:0;
variable:ema12=c,ema26=c,dea=0;
if day<>ref(day,1) then begin
ema12:=c;
ema26:=c;
dea:=0;
end
ema12:=ema12*11/13+c*2/13;
ema26:=ema26*25/27+c*2/27;
diff:ema12-ema26;
dea:=dea*4/5+diff/5;
dea1:dea;
macd:2*(diff-dea),colorstick;
//4周转向
hh:=ref(hhv(h,20),1);
ll:=ref(llv(l,20),1);
entertime:=time<=143000;
if h>hh then begin//突破高点,平空做多
sellshort(1,1,limitr,max(o,hh+0.2)+0.6);
buy(holding=0 and entertime,1,limitr,max(o,hh+0.2)+0.6);
end
if l<ll then begin
sell(1,1,limitr,min(o,ll-0.2)-0.6);//突破低点,平多做空
buyshort(holding=0 and entertime,1,limitr,min(o,ll-0.2)-0.6);
end
if time>=150000 then begin//收盘平仓
sell(1,1,limitr,o);
sellshort(1,1,limitr,o);
end
咋一看,没啥问题。其实信号也是会消失的,或者出现“才买入,又立马卖出”的情况
比如某根K线,h>hh 和 l<ll 同时成立的时候。而盘后静态来看,是看不出问题的。
一般模型遵循的写法是先平后开,且要同时注意做多条件和做空条件同时成立时的处理
以上模型,改写为如下,信号就不会闪烁:
//4周转向hh:=ref(hhv(h,20),1);
ll:=ref(llv(l,20),1);
entertime:=time<=143000;
If holding<0 and h>hh then begin
sellshort(1,1,limitr,max(o,hh+0.2)+0.6);//先是平仓
buy(1,1,limitr,max(o,hh+0.2)+0.6);
goto skip@;
end
if holding>0 and l<ll then begin
sell(1,1,limitr,min(o,ll-0.2)-0.6);//先是平仓
buyshort(1,1,limitr,min(o,ll-0.2)-0.6);
end
skip@;
//注意做多条件和做空条件同时成立的处理方法,这里采用20周期均线向上才做多,向下才做空
if holding=0 and h>hh and ref(c,1)>ref(c,20) and entertime then buy(1,1,limitr,max(o,hh+0.2)+0.6);//后开仓
if holding=0 and l<ll and ref(c,1)<ref(c,20) and entertime then buyshort(1,1,limitr,min(o,ll-0.2)-0.6);//后开仓
if time>=150000 then begin
sell(1,1,limitr,o);
sellshort(1,1,limitr,o);
end
runmode:0;
globalvariable:cc=0,att=0;
islast:=islastbar;
bb:=c>o+0.6;
ss:=c<o-0.6;
if cc>0 and ss then cc:=0;
if cc<0 and bb then cc:=0;
if cc=0 and bb then cc:=1;
if cc=0 and ss then cc:=-1;
lcc:=ref(cc,1);
if islast then att:=barpos;
if (lcc>0 and cc<=0) or (islast and cc<=0 and barpos>att and tbuyholding(1)>0) then begin
exitlong:1;
if lcc>0 and cc<=0 and islast then att:=barpos;
end
if (lcc<0 and cc>=0) or (islast and cc>=0 and barpos>att and tsellholding(1)>0) then begin
exitshort:1;
if lcc<0 and cc>=0 and islast then att:=barpos;
end
if (lcc<=0 and cc>0) or (islast and cc>0 and barpos>att and tbuyholding(1)=0) then begin
enterlong:1;
if lcc<=0 and cc>0 and islast then att:=barpos;
end
if (lcc>=0 and cc<0) or (islast and cc<0 and barpos>att and tsellholding(1)=0) then begin
entershort:1;
if lcc>=0 and cc<0 and islast then att:=barpos;
end
cc:=holding;//用于获取理论持仓,请放在信号稳定的位置
if holding>0 and c<ref(c,1) then sell(1,1,market);
if holding<0 and c>ref(c,1) then sellshort(1,1,market);
if holding=0 and c>ref(c,1) then buy(1,1,market);
if holding=0 and c<ref(c,1) then buyshort(1,1,market);
if not(islastbar) or workmode<>1 then exit;
ac:='800988';//把800988改成自己的下单账户
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=-tsellholdingex(ac,stklabel,1);
wt:=tremainqty(0,ac,stklabel);
if wt>0.5 then exit;
else goal:=if((buyhold+sellhold)*cc<-0.5,0,cc);
duo:=max(goal,0)-buyhold;
kon:=min(goal,0)-sellhold;
if duo>0.5 then tbuy(1,duo,mkt,0,0,ac);
if duo<-0.5 then tsell(1,duo,mkt,0,0,ac);
if kon<-0.5 then tbuyshort(1,kon,mkt,0,0,ac);
if kon>0.5 then tsellshort(1,kon,mkt,0,0,ac);
Sub ORDER_OrderStatusEx2(OrderID, Status, Filled, Remaining, Price, Code, Market, OrderType, Aspect, Kaiping, Account, AccountType)
if Status="Tradeing" and filled>0 and Account="8000000000" then
if aspect=0 then
if kaiping=0 then order.Buy 1,filled,0,0,code,market,"800000",0
if kaiping>0 then order.sellshort 1,filled,0,0,code,market,"800000",0
end if
if aspect=1 then
if kaiping=0 then order.Buyshort 1,filled,0,0,code,market,"800000",0
if kaiping>0 then order.sell 1,filled,0,0,code,market,"800000",0
end if
end if
End Sub
//注意:不勾选软件自带追单功能,此模型自带
//固定1秒轮询
cc:=holding;
if holding>0 and c<ref(c,1) then sell(1,1,market);
if holding<0 and c>ref(c,1) then sellshort(1,1,market);
if holding=0 and c>ref(c,1) then buy(1,1,market);
if holding=0 and c<ref(c,1) then buyshort(1,1,market);
if not(islastbar) or workmode<>1 then exit;
tm:=30;//撤单时间
ac:='800988';//下单账户
wt:=tremainqty(0,ac,stklabel);
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=tsellholdingex(ac,stklabel,1);
if wt>0.5 and tsubmit(0)>tm then tcancelex(1,0,ac,stklabel);//如果用软件自带的撤单功能,这句删除。
if wt<0.5 then begin
kc1:=max(cc,0)-buyhold;
kc2:=abs(min(cc,0))-sellhold;
if kc1<-0.5 then tsell(1,abs(kc1),mkt,0,0,ac),allowrepeat;
if kc2<-0.5 then tsellshort(1,abs(kc2),mkt,0,0,ac),allowrepeat;
if sellhold<0.5 and kc1>0.5 then tbuy(1,kc1,mkt,0,0,ac),allowrepeat;
if buyhold<0.5 and kc2>0.5 then tbuyshort(1,kc2,mkt,0,0,ac),allowrepeat;
end
//方法示例如下:(这里股指上的简单的均线系统为例)
variable:sumwealth=0;
ma10:=ma(c,5);
ma25:=ma(c,25);
sxf:=0.01/100;//手续费0.01%
if holding>0 and ma10<ma25 then begin
sell(1,1,thisclose);
sumwealth:=sumwealth+1*c*300*(1-sxf);//卖出时减去交易额
end
if holding<0 and ma10>ma25 then begin
sellshort(1,1,thisclose);
sumwealth:=sumwealth-1*c*300*(1+sxf);//买入时加上交易额
end
if holding=0 and ma10>ma25 then begin
buy(1,1,thisclose);
sumwealth:=sumwealth-1*c*300*(1+sxf);
end
if holding=0 and ma10<ma25 then begin
buyshort(1,1,thisclose);
sumwealth:=sumwealth+1*c*300*(1-sxf);
end
zichan:sumwealth+holding*c*300-abs(holding)*c*300*sxf,noaxis;
if holding>0 and time>=150000 then sell(1,1,market);
if holding<0 and time>=150000 then sellshort(1,1,market);
if holding=0 and c>ref(c,y) and time<=100000 then buy(1,1,market);
if holding=0 and c<ref(c,y) and time<=100000 then buyshort(1,1,market);
zichan:asset,noaxis;
if barpos=1 then begin
MaxAsset:=zichan;
hc:=0;
end
if zichan>MaxAsset then MaxAsset:=zichan;
if MaxAsset-zichan>hc then hc:=MaxAsset-zichan;
cishu:=totaltrade,linethick0;
if islastbar then debugfile('c:\moxing.txt',numtostr(y,0)&' '&numtostr(zichan,0)&' '&numtostr(hc,0)&' '&numtostr((zichan-1000000)/cishu,0)&' %.1f',(zichan-1000000)/hc);
然后启动优化(要优化到最后一天的行情,如果不想优化这么长,注意相应地修改 if islastbar then 这个条件)
最后把C盘底下的moxing文本文件导入到excel,就可以进行排序、评估参数了。
补充:现有函数已支持自定义优化项,参考函数AddTestReport('资产',ASSET);表示在专业测试报告中添加'资产'这个自定义数据项.
技术003 发表于 2021-6-23 15:27
十二、突破模型信号也会消失的一个例子及其处理方法,大家小心。
比如,大家常用的四周法则,一般人都是这 ...
技术003 发表于 2021-6-11 16:00
一,“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法
以便把各个模型放在同一个框架内进 ...
snky888 发表于 2021-9-20 19:58
第6行和第17行,都有buy指令,不重复吗?
黄文 发表于 2021-9-22 11:09
对“可采用这种方法,把holding用全局变量cc替换,然后加入注释部分代码,注释色部分代码要放在信号语句 ...
欢迎光临 金字塔决策交易系统 (https://www.weistock.com/bbs/) | Powered by Discuz! X3.4 |