楼主: 挖矿专家
3454 2

[源码分享] 【每日一策】Matlab量化交易策略之 均线通道+突破+加仓 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-3-21 10:11:31 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
均线通道突破+加仓
策略原理:
         20均线为中轴,上下一个单位的标准差构成一个均线通道
         多头入场:价格突破通道上轨,且成为近期高点
         空头入场:价格突破通道下轨,且成为近期低点
         加仓:价格每变动2倍ATR
         出场:动态跟踪止损

回测曲线(由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=11;    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 || length(Dclose)<dlags        continue;    end    % 虚拟交易所初始手数    totalunit=0;        %-------------------------交易逻辑-------------------------------%    %----------入场信号--------------------%%     len=80;%     p=0.3;    ma0=ma(close,5);    ma1=ma(close,20);    std1=stdev(close,20);    upline=ma1+std1;    dnline=ma1-std1;%     HC=max(Dclose(end-len:end-1));%     LC=min(Dclose(end-len:end-1));%     HH=max(Dhigh(end-len:end-1));%     LL=min(Dlow(end-len:end-1));%     range=max(HH-LC,HC-LL);%     upline=Dopen(end)+range*p1;%     dnline=Dopen(end)-range*p2;%     HH=max(high(end-len+1:end));%     LL=min(low(end-len+1:end));%     con1=close(end)<LL+p*(HH-LL);%     con2=close(end)>HH-p*(HH-LL);%     con3=ma0(end)>ma1(end) && ma0(end-1)<ma1(end-1);%     con4=ma0(end)<ma1(end) && ma0(end-1)>ma1(end-1);%     s(1).buycon=con1 && con3;%     s(1).sellshortcon=con2 && con4;    len1=20;    con1=ma0(end)>upline(end);    con2=ma0(end)<dnline(end);    con3=close(end)>max(close(end-len1+1:end-1));    con4=close(end)<min(close(end-len1+1:end-1));    s(1).buycon=con1 && con3;    s(1).sellshortcon=con2 && con4;    %----------主动出场信号----------------%    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=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;    %}        %---------------------------加仓--------------------------------%    %----------------策略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>2*ATR(end);        elseif lastdirection<0            s(1).addsellshortcon=lastentryprice-close(end)>2*ATR(end);        end;        %---------------加仓操作-------------------------%        if s(1).addbuycon && s(1).marketposition>=default_unit && s(1).marketposition<default_unit*2            addbuyunit=default_unit*0.5;            totalunit=totalunit+addbuyunit;            [~]=entryalter(k,barnum,1,1,addbuyunit,5,1);            % 合约号,barnum,方向,开关,手数,出场,策略        end;        if s(1).addsellshortcon && s(1).marketposition<=-default_unit && s(1).marketposition>-default_unit*2            addsellshortunit=default_unit*0.5;            totalunit=totalunit-addsellshortunit;            [~]=entryalter(k,barnum,-1,1,addsellshortunit,5,1);            % 合约号,barnum,方向,开关,手数,出场,策略        end;    end;    %---------------------------入场操作--------------------------------%    %----------------策略1----------------------%    if s(1).buycon && s(1).marketposition==0        buyunit=default_unit;        totalunit=totalunit+buyunit;        [~]=entryalter(k,barnum,1,1,buyunit,default_exitway,1);        % 合约号,barnum,方向,开关,手数,出场,策略    end;        if s(1).sellshortcon && s(1).marketposition==0        sellshortunit=default_unit;        totalunit=totalunit-sellshortunit;        [~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,1);        % 合约号,barnum,方向,开关,手数,出场,策略    end;         %{    %----------------策略2----------------------%    if s(2).buycon && s(2).marketposition==0        buyunit=default_unit;        totalunit=totalunit+buyunit;        [~]=entryalter(k,barnum,1,1,buyunit,default_exitway,2);        % 合约号,barnum,方向,开关,手数,出场,策略    end;    if s(2).sellshortcon && s(2).marketposition==0        sellshortunit=default_unit;        totalunit=totalunit-sellshortunit;        [~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,2);        % 合约号,barnum,方向,开关,手数,出场,策略    end;      %}    %---------------------- 虚拟交易所最终执行买卖 ------------------------------%    if totalunit>0        orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,abs(totalunit),0,'market','totalbuy');    elseif totalunit<0        orderID2=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,abs(totalunit),0,'market','totalsell');    end;endend




更多免费策略源码下载请登录DigQuant社区-策略资源获取~


二维码

扫码加我 拉你入群

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

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

关键词:加仓 通道

已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 66 + 66 精彩帖子

总评分: 经验 + 66  论坛币 + 66   查看全部评分

沙发
peppep 发表于 2017-3-21 16:35:28
期待下一篇~~已关注楼主~~~

藤椅
挖矿专家 发表于 2017-3-21 18:59:16
感谢支持~

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

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