全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
2210 3
2017-03-21
策略原理:
         构造布林带通道,跌破下轨做多,突破上轨做空
         动态跟踪止损出场

回测曲线(由Auto-Trader提供回测报告)

布林通道+追踪出场.png

策略源码:

function Strategy1(default_unit,default_exitway,freq)%targetList = traderGetTargetList(); %获取目标资产信息HandleList = traderGetHandleList();%获取账户句柄global entry;global record;global stopprice;for k=1:length(targetList);        %--------------------仓位、K线、当前bar的提取-----------------------------%    %获取当前仓位    [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);    %策略中每次取数据的长度    dlags=10;    lags=50;    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;        %-------------------------交易逻辑-------------------------------%    %----------入场信号--------------------%    len=30;    p=2.5;    p2=0;    ma0=ma(close,len);    std0=stdev(close,len);    upline=ma0+p*std0;    dnline=ma0-p*std0;    upline2=ma0+p2*std0;    dnline2=ma0-p2*std0;    s(1).buycon=0;    s(1).sellshortcon=0;%     slope1=slope(close,30);%     slope2=slope(close,60);%     con1=slope1(end)>0;%     con2=slope1(end)<0;    if record==1        s(1).buycon=low(end)>dnline(end) && low(end-1)<dnline(end-1);    end;    if record==-1        s(1).sellshortcon=high(end)<upline(end) && high(end-1)>upline(end-1);    end;    if barnum==3520;        aa=1;    end;    %------------被动出场操作------------------%    %找到未平仓的订单    remain=remainorder(entry,k);    %对未平仓的订单进行平仓判断及操作    for i=1:length(remain.entrybar);        % 进仓以来的bar个数        longstopcon=0;        shortstopcon=0;        barsinceentry=barnum-remain.entrybar(i);        backlen=30;    % 回溯的长度(进仓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=3;            AF=0.1;            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=20;            initialstdparam=3;            minstdparam=1;            AF=0.25;            [longstopcon,shortstopcon,exitline]=exit5(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,stdlen,initialstdparam,minstdparam,AF);         elseif remain.entryexitway(i)==6;            longstopcon=0;            shortstopcon=0;            sellcon=0;            buytocovercon=0;            if remain.entrydirection(i)==1;                sellcon=high(end)>upline2(end);                longstopcon=close(end)<stopprice;            elseif remain.entrydirection(i)==-1                buytocovercon=low(end)<dnline2(end);                shortstopcon=close(end)>stopprice;            end;            longstopcon=longstopcon || sellcon;            shortstopcon=shortstopcon || buytocovercon;        elseif remain.entryexitway(i)==7;            ATRparam=1.5;            [longstopcon,shortstopcon,exitline]=exit7(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,len,stopprice,p2,ATRparam);        end;        % 出场执行        if longstopcon            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            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;    %---------------------------加仓--------------------------------%    %----------------策略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) && close(end)>ma0(end);        elseif lastdirection<0            s(1).addsellshortcon=lastentryprice-close(end)>ATR(end) && close(end)<ma0(end);        end;        %---------------加仓操作-------------------------%        if s(1).addbuycon && s(1).marketposition>=2 && s(1).marketposition<4            addbuyunit=default_unit*0.5;            totalunit=totalunit+addbuyunit;            [~]=entryalter(k,barnum,1,1,addbuyunit,2,1);            % 合约号,barnum,方向,开关,手数,出场,策略        end;        if s(1).addsellshortcon && s(1).marketposition<=-2 && s(1).marketposition>-4            addsellshortunit=default_unit*0.5;            totalunit=totalunit-addsellshortunit;            [~]=entryalter(k,barnum,-1,1,addsellshortunit,2,1);            % 合约号,barnum,方向,开关,手数,出场,策略        end;    end;    %}    %---------------------------入场操作--------------------------------%    %----------------策略1----------------------%    if s(1).buycon && s(1).marketposition==0        buyunit=default_unit;        orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,buyunit,0,'market','totalbuy');        if orderID1==0;            continue;        end;        [~]=entryalter(k,barnum,1,1,buyunit,default_exitway,1);        stopprice=ma0(end)-4*std0(end);        record=-1;        % 合约号,barnum,方向,开关,手数,出场,策略    end;        if s(1).sellshortcon && s(1).marketposition==0        sellshortunit=default_unit;        orderID1=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,sellshortunit,0,'market','totalbuy');        if orderID1==0;            continue;        end;        [~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,1);        stopprice=ma0(end)+4*std0(end);        record=1;        % 合约号,barnum,方向,开关,手数,出场,策略    end;     %---------------------- 虚拟交易所最终执行买卖 ------------------------------%endend


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

二维码

扫码加我 拉你入群

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

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

全部回复
2017-3-21 16:33:39
期待下一篇~~已关注楼主~~~
二维码

扫码加我 拉你入群

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

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

2017-3-23 10:48:19
已关注楼主~
二维码

扫码加我 拉你入群

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

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

2017-3-23 19:57:58
感谢支持~
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群