cmi matlab,【每日一策】Matlab量化交易策略之 恒温器策略

策略原理:

以最近50个交易周期的开高低收价格算出CMI值,

当CMI小于50且价格高于均线,定义为震荡上行

当CMI小于50且价格低于均线,定义为震荡下行

当CMI大于等于50,定义为趋势

不同行情使用不同的下单信号

回测曲线:

08b05ce0d596c72a04d00d75c1365631.gif

2017-2-24 10:52:56 上传

下载附件 (79.57 KB)

策略代码:

function  Strategy1(default_unit,default_exitway,freq)%

targetList  =  traderGetTargetList();

%获取目标资产信息

HandleList  =  traderGetHandleList();

%获取账户句柄

global  entrybar;

global  istrend;

for  k=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');

if  length(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);

for  i=1:length(position)

if  close(i)>upline2(i)

position(i)=3;

elseif  close(i)>upline1(i)  &&  close(i)<=upline2(i)

position(i)=2;

elseif  close(i)>ma1(i)  &&  close(i)<=upline1(i)

position(i)=1;

elseif  close(i)<=ma1(i)  &&  close(i)>dnline1(i)

position(i)=-1;

elseif  close(i)<=dnline1(i)  &&  close(i)>dnline2(i)

position(i)=-2;

elseif  close(i)<=dnline2(i)

position(i)=-3;

end;

end;

state=0;

if  CMIvalue(end)<50  &&  close(end)>ma2(end)  %  震荡上行

state=1;

elseif  CMIvalue(end)<50  &&  close(end)

state=2;

elseif  CMIvalue(end)>=50  %  趋势

state=3;

end;

buycon=0;

sellshortcon=0;

sellcon=0;

buytocovercon=0;

if  state==1

if  position(i)==-2  &&  position(i-1)==-3;

buycon=1;

istrend(k)=-1;

end;

elseif  state==2

if  position(i)==2  &&  position(i-1)==3;

sellshortcon=1;

istrend(k)=-1;

end;

elseif  state==3

if  position(i)==2  &&  position(i-1)==1;

buycon=1;

istrend(k)=1;

end;

if  position(i)==-2  &&  position(i-1)==-1;

sellshortcon=1;

istrend(k)=1;

end;

end;

if  default_exitway==1

if  istrend(k)==-1

sellcon=position(i)==1;

buytocovercon=position(i)==-1;

elseif  istrend(k)==1

sellcon=position(i)==-1;

buytocovercon=position(i)==1;

end;

end;

%---------------------------入场操作--------------------------------%

if  sellcon  &&  marketposition>0

orderID1=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');

if  orderID1==0

continue;

end;

istrend(k)=0;

end;

if  buytocovercon  &&  marketposition<0

orderID2=traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');

if  orderID2==0

continue;

end;

istrend(k)=0;

end;

if  buycon  &&  marketposition<=0

buyunit=default_unit;

orderID3=traderBuy(HandleList(1),targetList(k).Market,targetList(k).Code,buyunit,0,'market','buy');

if  orderID3==0

continue;

end;

entrybar(k)=barnum;

end;

if  sellshortcon  &&  marketposition>=0

sellshortunit=default_unit;

orderID4=traderSellShort(HandleList(1),targetList(k).Market,targetList(k).Code,sellshortunit,0,'market','sell');

if  orderID4==0

continue;

end;

entrybar(k)=barnum;

end;

end

end

来源:Atrader社区-策略服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值