楼主: 挖矿专家
3871 2

[源码分享] Matlab量化交易策略源码分享之 克罗均线 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-2-27 10:17:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
克罗均线
策略原理:
         多头入场:当前价格大于5日均线,5日均线上穿10日均线,10日均线上穿20日均线,当前价格大于60日均线
         空头入场:当前价格小于5日均线,5日均线下穿10日均线,10日均线下穿20日均线,当前价格小于60日均线
         出场:跟踪止损出场


回测曲线(由Auto-trader 软件提供回测):


克罗均线.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;


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

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

        ma1=ma(close,5);

        ma2=ma(close,10);

        ma3=ma(close,20);

        ma4=ma(close,60);

        s(1).buycon=close(end)>ma1(end)  &&  ma1(end)>ma2(end)  &&  ma2(end)>ma3(end)  &&  close(end)>ma4(end);

        s(1).sellshortcon=close(end)<ma1(end)  &&  ma1(end)<ma2(end)  &&  ma2(end)<ma3(end)  &&  close(end)<ma4(end);


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

        s(1).sellcon=0;

        s(1).buytocovercon=0;


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

        %找到未平仓的订单

        remain=remainorder(entry,k);

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

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

                %  进仓以来的bar个数

                barsinceentry=barnum-remain.entrybar(i);

                backlen=20;        %  回溯的长度(进仓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;

                        stdlen=19;

                        initialstdparam=2;

                        minstdparam=1;

                        AF=0.2;

                        [longstopcon,shortstopcon,exitline]=exit5(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,stdlen,initialstdparam,minstdparam,AF);  

                end;

                %  出场执行

                if  longstopcon

                        totalunit=totalunit-remain.entryunit(i);

                        orderID1=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,remain.entryunit(i),0,'market','totalbuy');

                        if  orderID1==0;

                                continue;

                        end;

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

                end;

                if  shortstopcon

                        totalunit=totalunit+remain.entryunit(i);

                        orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,remain.entryunit(i),0,'market','totalbuy');

                        if  orderID1==0;

                                continue;

                        end;

                        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;

        %}


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

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

        %再次找到未平仓的订单

        remain=remainorder(entry,k);

        %  找到策略i的marketposition

        s=mptaking(s,remain);

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

        %{

        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;


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

克罗均线策略源码下载,http://www.atrader.com.cn/stra.php?mod=model&pid=137



二维码

扫码加我 拉你入群

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

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


本帖被以下文库推荐

沙发
yditjn 发表于 2017-2-27 18:20:28
波动幅度有点大啊

藤椅
挖矿专家 发表于 2017-3-6 10:44:07

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

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

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-5 21:00