恒温器策略(附源码)
策略原理:以最近50个交易周期的开高低收价格算出CMI值,
当CMI小于50且价格高于均线,定义为震荡上行
当CMI小于50且价格低于均线,定义为震荡下行
当CMI大于等于50,定义为趋势
不同行情使用不同的下单信号
策略代码:
function Strategy1(default_unit,default_exitway,freq)%
targetList = traderGetTargetList();
%获取目标资产信息
HandleList = traderGetHandleList();
%获取账户句柄
global entrybar;
global istrend;
for k=1:length(targetList);
%--------------------仓位、K线、当前bar的提取-----------------------------%
%获取当前仓位
=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
%策略中每次取数据的长度
lags=201;
dlags=20;
barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);
%数据长度限制
if(barnum<lags)
continue;
end
if(barnum<dlags)
continue;
end
%获取K线数据
= traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-lags, 0,false,'FWard');
= traderGetKData(targetList(k).Market,targetList(k).Code,'day',1, 0-dlags, 0,false,'FWard');
if length(close)<lags || length(Dclose)<dlags
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)<ma2(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社区-策略服务下载,http://www.atrader.com.cn/stra.php
恒温器策略下载:http://www.atrader.com.cn/stra.php?mod=model&pid=142
页:
[1]