全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
2124 3
2017-03-21
分市场状态的布林通道系统
策略原理:根据均线斜率的变化将市场分为三种情况:上涨,下跌,震荡
          上涨:突破布林带上轨做多
          下跌:跌破布林带下轨做空
          震荡:突破布林带上轨做空,跌破布林带下轨做多
          出场:动态止损出场

回测曲线(由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;        %-------------------------交易逻辑-------------------------------%    %----------入场信号--------------------%    % pattern recognition    BOLLmid=ma(close,20);    BOLLup1=BOLLmid+stdev(close,20);    BOLLdn1=BOLLmid-stdev(close,20);    BOLLup2=BOLLmid+2*stdev(close,20);    BOLLdn2=BOLLmid-2*stdev(close,20);    ma0=ma(close,10);    ma1=ma(close,20);    ma2=ma(close,30);    slope0=slope(ma0,10);    slope1=slope(ma1,10);    slope2=slope(ma2,10);    if slope0(end)>5 && slope1(end)>5 && slope2(end)>5;        pattern=1;    elseif slope0(end)<-5 && slope1(end)<-5 && slope2(end)<-5;        pattern=2;    else        pattern=3;    end;    s(1).buycon=0;    s(1).sellshortcon=0;    if pattern==1;        if close(end)>BOLLup1(end) && close(end-1)<BOLLup1(end-1)            s(1).buycon=1;        end;    elseif pattern==2;        if close(end)<BOLLdn1(end) && close(end-1)>BOLLdn1(end-1)            s(1).sellshortcon=2;        end;    elseif pattern==3;        if close(end)<BOLLup2(end) && close(end-1)>BOLLup2(end-1)            s(1).sellshortcon=3;        end;        if close(end)>BOLLdn2(end) && close(end-1)<BOLLdn2(end-1)            s(1).buycon=3;        end;    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=close(end)<BOLLmid(end) && close(end-1)>=BOLLmid(end-1);        elseif remain.entryexitway(i)==7;            shortstopcon=close(end)>BOLLmid(end) && close(end-1)<=BOLLmid(end-1);        elseif remain.entryexitway(i)==8;            if remain.entrydirection(i)==1;                longstopcon=close(end)>BOLLup2(end) && close(end-1)<=BOLLup2(end-1);            elseif remain.entrydirection(i)==-1;                shortstopcon=close(end)<BOLLdn2(end) && close(end-1)>=BOLLdn2(end-1);            end;        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;        %------------------- 主动出场操作 --------------------%    %{    s(1).sellcon=close(end)>upline(end);    s(1).buytocovercon=close(end)<dnline(end);    %再次找到未平仓的订单    remain=remainorder(entry,k);    % 找到策略i的marketposition    s=mptaking(s,remain);    %----------------策略1----------------------%    if s(1).sellcon && s(1).marketposition>0        totalunit=totalunit-abs(s(1).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(1).marketposition);        % 把已经平掉的订单的开关关掉        for j=1:length(s(1).num)            entry.record{k}(remain.num(s(1).num(j)))=0;        end;    end;    %}    %---------------------------加仓--------------------------------%    %----------------策略1----------------------%    %再次找到未平仓的订单    remain=remainorder(entry,k);    % 找到策略i的marketposition    s=mptaking(s,remain);    %---------------------------入场操作--------------------------------%    %----------------策略1----------------------%    if s(1).buycon==1 && s(1).marketposition==0        buyunit=default_unit;        totalunit=totalunit+buyunit;        [~]=entryalter(k,barnum,1,1,buyunit,6,1);        % 合约号,barnum,方向,开关,手数,出场,策略    end;        if s(1).sellshortcon==2 && s(1).marketposition==0        sellshortunit=default_unit;        totalunit=totalunit-sellshortunit;        [~]=entryalter(k,barnum,-1,1,sellshortunit,7,1);        % 合约号,barnum,方向,开关,手数,出场,策略    end;         if s(1).buycon==3 && s(1).marketposition==0        buyunit=default_unit;        totalunit=totalunit+buyunit;        [~]=entryalter(k,barnum,1,1,buyunit,8,1);        % 合约号,barnum,方向,开关,手数,出场,策略    end;        if s(1).sellshortcon==3 && s(1).marketposition==0        sellshortunit=default_unit;        totalunit=totalunit-sellshortunit;        [~]=entryalter(k,barnum,-1,1,sellshortunit,8,1);        % 合约号,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社区-策略资源下载~


附件列表
二维码

扫码加我 拉你入群

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

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

全部回复
2017-3-30 00:17:17
thanks
二维码

扫码加我 拉你入群

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

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

2017-3-30 10:25:01
感谢关注~
二维码

扫码加我 拉你入群

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

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

2017-4-1 10:39:35
感谢分享~
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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