sdfg123 发表于 2017-2-27 14:14:47

恒温器策略(附源码)

策略原理:
         以最近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]
查看完整版本: 恒温器策略(附源码)