策略原理:
以最近50个交易周期的开高低收价格算出CMI值,
当CMI小于50且价格高于均线,定义为震荡上行
当CMI小于50且价格低于均线,定义为震荡下行
当CMI大于等于50,定义为趋势
不同行情使用不同的下单信号
回测曲线:
-2-24 10:52:56 上传
下载附件 (79.57 KB)
策略代码:
functionStrategy1(default_unit,default_exitway,freq)%
targetList=traderGetTargetList();
%获取目标资产信息
HandleList=traderGetHandleList();
%获取账户句柄
globalentrybar;
globalistrend;
fork=1:length(targetList);
%--------------------仓位、K线、当前bar的提取-----------------------------%
%获取当前仓位
[marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
%策略中每次取数据的长度
lags=201;
dlags=20;
barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);
%数据长度限制
if(barnum
continue;
end
if(barnum
continue;
end
%获取K线数据
[time,open,high,low,close,volume,turnover,openinterest]=traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq,0-lags,0,false,'FWard');
[Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,~,~]=traderGetKData(targetList(k).Market,targetList(k).Code,'day',1,0-dlags,0,false,'FWard');
iflength(close)
continue;
end;
%-------------------------交易逻辑-------------------------------%
%----------入场信号--------------------%
len=50;
CMIvalue=CMI(close,high,low,len);
len1=20;
ma1=ma(close,len1);
ma2=ma(close,120);
upline1=ma1+stdev(close,len1);
dnline1=ma1-stdev(close,len1);
upline2=ma1+2*stdev(close,len1);
dnline2=ma1-2*stdev(close,len1);
position=zeros(length(close),1);
fori=1:length(position)
ifclose(i)>upline2(i)
position(i)=3;
elseifclose(i)>upline1(i)&&close(i)<=upline2(i)
position(i)=2;
elseifclose(i)>ma1(i)&&close(i)<=upline1(i)
position(i)=1;
elseifclose(i)<=ma1(i)&&close(i)>dnline1(i)
position(i)=-1;
elseifclose(i)<=dnline1(i)&&close(i)>dnline2(i)
position(i)=-2;
elseifclose(i)<=dnline2(i)
position(i)=-3;
end;
end;
state=0;
ifCMIvalue(end)<50&&close(end)>ma2(end)%震荡上行
state=1;
elseifCMIvalue(end)<50&&close(end)
state=2;
elseifCMIvalue(end)>=50%趋势
state=3;
end;
buycon=0;
sellshortcon=0;
sellcon=0;
buytocovercon=0;
ifstate==1
ifposition(i)==-2&&position(i-1)==-3;
buycon=1;
istrend(k)=-1;
end;
elseifstate==2
ifposition(i)==2&&position(i-1)==3;
sellshortcon=1;
istrend(k)=-1;
end;
elseifstate==3
ifposition(i)==2&&position(i-1)==1;
buycon=1;
istrend(k)=1;
end;
ifposition(i)==-2&&position(i-1)==-1;
sellshortcon=1;
istrend(k)=1;
end;
end;
ifdefault_exitway==1
ifistrend(k)==-1
sellcon=position(i)==1;
buytocovercon=position(i)==-1;
elseifistrend(k)==1
sellcon=position(i)==-1;
buytocovercon=position(i)==1;
end;
end;
%---------------------------入场操作--------------------------------%
ifsellcon&&marketposition>0
orderID1=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');
iforderID1==0
continue;
end;
istrend(k)=0;
end;
ifbuytocovercon&&marketposition<0
orderID2=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');
iforderID2==0
continue;
end;
istrend(k)=0;
end;
ifbuycon&&marketposition<=0
buyunit=default_unit;
orderID3=traderBuy(HandleList(1),targetList(k).Market,targetList(k).Code,buyunit,0,'market','buy');
iforderID3==0
continue;
end;
entrybar(k)=barnum;
end;
ifsellshortcon&&marketposition>=0
sellshortunit=default_unit;
orderID4=traderSellShort(HandleList(1),targetList(k).Market,targetList(k).Code,sellshortunit,0,'market','sell');
iforderID4==0
continue;
end;
entrybar(k)=barnum;
end;
end
end
来源:Atrader社区-策略服务