楼主: 挖矿专家
1064 5

[源码分享] Matlab量化交易策略之 海龟改进策略 [分享]

  • 0关注
  • 70粉丝

讲师

22%

还不是VIP/贵宾

-

威望
0
论坛币
2016 个
通用积分
5.2622
学术水平
21 点
热心指数
21 点
信用等级
21 点
经验
6055 点
帖子
403
精华
0
在线时间
151 小时
注册时间
2017-2-8
最后登录
2017-6-27

挖矿专家 发表于 2017-2-24 11:11:00 |显示全部楼层
策略名称:海龟改进


策略思路:
入场:价格突破50日高点,或者跌破50日低点
被动出场:多头情况下跌破20日低点
                空头情况下突破20日高点
主动出场:每个加仓点单独出场,以每个加仓点下的N倍ATR出场,且每次调整对每个止损点调整N


回测曲线:


海龟改进.png


策略代码:

%加仓逻辑:加仓间隔逐渐扩大,每次扩大1倍ATR

%止损逻辑:止损间隔逐渐扩大,每次扩大1倍ATR

function  Turtle3(len1,len2,len3,Freq,ShareNum,multi)


targetList  =  traderGetTargetList();

HandleList  =  traderGetHandleList();


global  s;


lens=60;

n=length(targetList);

PsnLimit=4;


for  j=1:n

        [time,open,high,low,close,volume,turnover,openinterest]  =  traderGetKData(targetList(j).Market,targetList(j).Code,'day',1,  0-lens,  0,false,'FWard');

        [mp,~,AvgPrice]  =  traderGetAccountPosition(HandleList,targetList(j).Market,targetList(j).Code);


        %---------------------策略计算与基本逻辑---------------%

        if  length(close)<lens+1  ||  volume(end)==0

                continue;

        end


        value1  =  high(end-lens+1:end)  -  low(end-lens+1:end);%  当日最高价减去当日最低价

        value2  =  abs(high(end-lens+1:end)-close(end-lens:end-1));%  当日最高价减去前日收盘价的绝对值

        value3  =  abs(low(end-lens+1:end)-close(end-lens:end-1));%    当日最低价减去前日收盘价的绝对值

        TRlist=max(value1,max(value2,value3));

        ATR_len3=mean(TRlist(end-len3+1:end));


        %  四条轨道

        High_len1=max(high(end-len1:end-1));

        Low_len1=min(low(end-len1:end-1));

        High_len2=max(high(end-len2:end-1));

        Low_len2=min(low(end-len2:end-1));


        %          ValidCash  =  traderGetAccountInfo(HandleList);

        %

        %          s(j).Cap=ValidCash/n+mp*close(end);

        %          PsnLimit=floor(s(j).Cap*0.01*plus/(ATR_len3*s(j).Multiple));



        con1=close(end)>High_len1;

        con2=close(end)<Low_len1;

        con3=close(end)>High_len2;

        con4=close(end)<Low_len2;


        %%    出场

        if  mp>0

                if  con4


                        OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');

                        if  OrderID~=0

                        s(j).openprice=[];

                        s(j).stoploss=[];

                        s(j).addprice=0;

                        end

                else

                        for  i=1:length(s(j).stoploss)

                                if  ~isempty(s(j).stoploss)  &&  close(end)<s(j).stoploss(end)

                                        OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','close');

                                        if  OrderID~=0

                                        s(j).stoploss(end)=[];

                                        s(j).openprice(end)=[];


                                        end

                                end

                        end

                end

        end


        if  mp<0

                if  con3

                          OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');

                        if  OrderID~=0

                        s(j).openprice=[];

                        s(j).stoploss=[];

                        s(j).addprice=0;

                        end

                else

                        for  i=1:length(s(j).stoploss)

                                if  ~isempty(s(j).stoploss)  &&  close(end)>s(j).stoploss(end)


                                        OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','close');

                                        if  OrderID~=0

                                        s(j).stoploss(end)=[];

                                        s(j).openprice(end)=[];

                                        end


                                end

                        end

                end

        end


        mp  =  traderGetAccountPosition(HandleList,targetList(j).Market,targetList(j).Code);


        %%  进场

        if  mp==0

                if  con1

                        OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');

                        if  OrderID~=0

                                s(j).openprice(1)=traderOrderFilledPrice(HandleList(1),OrderID);

                                s(j).addprice=s(j).openprice+multi*ATR_len3;

                                s(j).stoploss(1)=s(j).openprice(1)-0.5*multi*ATR_len3;

                        end

                elseif  con2

                        OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');

                        if  OrderID~=0

                                s(j).openprice(1)=traderOrderFilledPrice(HandleList(1),OrderID);

                                s(j).addprice=s(j).openprice-multi*ATR_len3;

                                s(j).stoploss(1)=s(j).openprice(1)+0.5*multi*ATR_len3;

                        end

                end

        end



        %%  加仓

        if  mp>0  &&  mp<  PsnLimit


                if    close(end)>=(s(j).addprice)

                        OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');

                        if  OrderID~=0

                                s(j).openprice(end+1)=traderOrderFilledPrice(HandleList(1),OrderID);

                                N=length(s(j).openprice);

                                s(j).addprice=s(j).openprice(end)+N*multi*ATR_len3;

                                stoploss=s(j).openprice(end)-(N-1)*multi*ATR_len3;

                                s(j).stoploss(end+1)=stoploss;

                        end

                end

        end


        if  mp<0  &&  abs(mp)<  PsnLimit

                if  close(end)<=(s(j).addprice)

                        OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');

                        if  OrderID~=0

                                s(j).openprice(end+1)=traderOrderFilledPrice(HandleList(1),OrderID);

                                N=length(s(j).openprice);

                                s(j).addprice=s(j).openprice(end)-N*multi*ATR_len3;

                                stoploss=s(j).openprice(end)+(N-1)*multi*ATR_len3;

                                s(j).stoploss(end+1)=stoploss;

                        end

                end

        end

end


更多免费策略源码下载请登录atrader社区-策略服务,http://www.atrader.com.cn/stra.php


关键词:加仓

海龟改进.png
stata SPSS
peppep 发表于 2017-3-2 14:47:33 |显示全部楼层
厉害!!!!
回复

使用道具 举报

挖矿专家 发表于 2017-3-3 10:31:24 |显示全部楼层
感谢支持,后续可以持续关注
回复

使用道具 举报

ghjktdf 发表于 2017-3-3 14:42:49 |显示全部楼层
感谢楼主分享~
回复

使用道具 举报

挖矿专家 发表于 2017-3-6 10:46:47 |显示全部楼层

atrader 社区已经更名为 digquant 社区,迁移至 www.digquant.com.cn
回复

使用道具 举报

小小说小小很棒 学生认证  发表于 2017-9-19 16:04:01 |显示全部楼层
楼主可以解释一下代码的思路吗?有些变量不是很明白,小白求带
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2019-12-11 23:30