楼主: 挖矿专家
3002 5

[源码分享] 【每日一策】MATLAB量化交易策略之 海龟组合策略 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-2-24 11:19:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
策略名称:海龟组合策略
策略思路:
以多均线构造海龟系统,采取加速因子跟踪出场


回测曲线:


海龟组合策略.png

策略代码:

function  Strategy1(default_unit,default_exitway,freq)%


targetList  =  traderGetTargetList();  

%获取目标资产信息

HandleList  =  traderGetHandleList();

%获取账户句柄

global  entry;

for  k=1:length(targetList);


        %--------------------仓位、K线、当前bar的提取-----------------------------%

        %获取当前仓位

        [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);

        %策略中每次取数据的长度

        dlags=10;

        lags=150;

        barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);

        %数据长度限制

        if(barnum<lags)

                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,Dturnover,Dopeninterest]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'day',1,0-dlags,  0,false,'FWard');

        if  length(close)<lags

                continue;

        end

        %  虚拟交易所初始手数

        totalunit=0;


        %-------------------------交易逻辑-------------------------------%

        %----------入场信号--------------------%

        n1=100;

        p=0.015;

        mclose=close(end-n1:end-1);

        midvalue=mean(mclose);

        upvalue=midvalue*(1+p);

        dnvalue=midvalue*(1-p);

        con1=0;

        for  i=1:length(mclose)

                if  mclose(i)>upvalue  ||  mclose(i)<dnvalue

                        con1=1;

                end;

        end;

        s(1).buycon=close(end)>max(mclose);

        s(1).sellshortcon=close(end)<min(mclose);


        ma0=ma(close,5);

        ma1=ma(close,20);

        ma2=ma(close,50);

        s(2).buycon=ma0(end)>ma1(end)  &&  ma0(end-1)<ma1(end-1)  &&  ma0(end)>ma2(end);

        s(2).sellshortcon=ma0(end)<ma1(end)  &&  ma0(end-1)>ma1(end-1)  &&  ma0(end)<ma2(end);

        %----------主动出场信号----------------%

        s(1).sellcon=0;

        s(1).buytocovercon=0;

        s(2).sellcon=0;

        s(2).buytocovercon=0;   

        %------------被动出场操作------------------%

        %找到未平仓的订单

        remain=remainorder(entry,k);

        %对未平仓的订单进行平仓判断及操作

        for  i=1:length(remain.entrybar);

                %  进仓以来的bar个数

                barsinceentry=barnum-remain.entrybar(i);

                backlen=10;        %  回溯的长度(进仓bar之前)

                %  回溯的信息提取

                [backtime,backopen,backhigh,backlow,backclose,~,~,~]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq,  0-barsinceentry-backlen,  0,false,'FWard');

                %  根据出场方式计算出场条件

                if  remain.entryexitway(i)==1;

                        AFinitial=0;

                        AFparam=0.02;

                        AFmax=0.2;

                        Firstbarmultp=1;    %影响第一根bar的止损价,调高表示可忍受的回撤越多

                        [longstopcon,shortstopcon,exitline]=exit1(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,AFinitial,AFparam,AFmax,Firstbarmultp);

                elseif  remain.entryexitway(i)==2;

                        initialATRparam=2;

                        AF=0.02;

                        minATRparam=1;

                        [longstopcon,shortstopcon,exitline]=exit2(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,initialATRparam,AF,minATRparam);

                elseif  remain.entryexitway(i)==3;

                        [longstopcon,shortstopcon,exitline]=exit3(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen);

                elseif  remain.entryexitway(i)==4

                        startpoint=10;

                        percent=0.3;

                        TRmutlp=1;

                        [longstopcon,shortstopcon,exitline]=exit4(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,startpoint,percent,TRmutlp);

                elseif  remain.entryexitway(i)==5;

                        initialATRparam=1.4;

                        AF=0.02;

                        minATRparam=1;

                        [longstopcon,shortstopcon,exitline]=exit2(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,initialATRparam,AF,minATRparam);

                end;

                %  出场执行

                if  longstopcon

                        totalunit=totalunit-remain.entryunit(i);

                        entry.record{k}(remain.num(i))=0;

                end;

                if  shortstopcon

                        totalunit=totalunit+remain.entryunit(i);

                        entry.record{k}(remain.num(i))=0;

                end;

        end;


        %{

        %-------------------  主动出场操作  --------------------%

        %再次找到未平仓的订单

        remain=remainorder(entry,k);

        %  找到策略i的marketposition

        s=mptaking(s,remain);

        %----------------策略1----------------------%

        if  s(1).sellcon  &&  s(1).marketposition>0

                totalunit=totalunit-abs(s(2).marketposition);

                %  把已经平掉的订单的开关关掉

                for  j=1:length(s(1).num)

                        entry.record{k}(remain.num(s(1).num(j)))=0;

                end;

        end;

        if  s(1).buytocovercon  &&  s(1).marketposition<0

                totalunit=totalunit+abs(s(2).marketposition);

                %  把已经平掉的订单的开关关掉

                for  j=1:length(s(1).num)

                        entry.record{k}(remain.num(s(1).num(j)))=0;

                end;

        end;


        %----------------策略2----------------------%

        if  s(2).sellcon  &&  s(2).marketposition>0

                totalunit=totalunit-s(2).marketposition;

                %  把已经平掉的订单的开关关掉

                for  j=1:length(s(2).num)

                        entry.record{k}(remain.num(s(2).num(j)))=0;

                end;

        end;

        if  s(2).buytocovercon  &&  s(2).marketposition<0

                totalunit=totalunit+s(2).marketposition;

                %  把已经平掉的订单的开关关掉

                for  j=1:length(s(2).num)

                        entry.record{k}(remain.num(s(2).num(j)))=0;

                end;

        end;

        %}


        %---------------------------加仓--------------------------------%

        %再次找到未平仓的订单

        remain=remainorder(entry,k);

        %  找到策略i的marketposition

        s=mptaking(s,remain);

        %  找到最近的加仓点和加仓价格

        %----------------策略1----------------------%

        if  s(1).marketposition~=0;

                lastentrybar=max(remain.entrybar(s(1).num));

                lastbarsinceentry=barnum-lastentrybar;

                lastentryprice=open(end-lastbarsinceentry+1);

                vector=remain.entrydirection(s(1).num);

                lastdirection=vector(end);

                TRvalue=TR(close,high,low);

                ATR=ma(TRvalue,10);

                s(1).addbuycon=0;

                s(1).addsellshortcon=0;

                if  lastdirection>0

                        s(1).addbuycon=close(end)-lastentryprice>ATR(end);

                elseif  lastdirection<0

                        s(1).addsellshortcon=lastentryprice-close(end)>ATR(end);

                end;

                %---------------加仓操作-------------------------%

                if  s(1).addbuycon  &&  s(1).marketposition>=2  &&  s(1).marketposition<4

                        addbuyunit=1;

                        totalunit=totalunit+addbuyunit;

                        [~]=entryalter(k,barnum,1,1,addbuyunit,5,1);

                        %  合约号,barnum,方向,开关,手数,出场,策略

                end;


                if  s(1).addsellshortcon  &&  s(1).marketposition<=-2  &&  s(1).marketposition>-4

                        addsellshortunit=1;

                        totalunit=totalunit-addsellshortunit;

                        [~]=entryalter(k,barnum,-1,1,addsellshortunit,5,1);

                        %  合约号,barnum,方向,开关,手数,出场,策略

                end;

        end;


更多免费策略源码下载,请登录atrader社区-策略服务下载~



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
3862161 在职认证  发表于 2017-2-24 16:02:26
跳舞似的~~

藤椅
ghjktdf 发表于 2017-2-25 15:58:24

板凳
ghjktdf 发表于 2017-2-27 11:44:59
帮顶~

报纸
挖矿专家 发表于 2017-3-1 11:17:12
感谢支持~

地板
挖矿专家 发表于 2017-3-6 10:45:55

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

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

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-28 16:54