设为首页收藏本站

 找回密码
 注册
查看: 2545|回复: 1

布林通道+高低点(附源码) [复制链接]

精华
0
UID
247176
积分
162
帖子
72
主题
68
阅读权限
0
注册时间
2017-2-14
最后登录
2017-5-18
发表于 2017-3-21 11:08:31 |显示全部楼层
策略原理:
          通过布林带以及突破后的高低点的形成产生交易信号
          采取跟踪止损出场

策略源码:

function Strategy1(default_unit,default_exitway,freq)%

targetList = traderGetTargetList();
%获取目标资产信息
HandleList = traderGetHandleList();
%获取账户句柄
global entry;
global record;
global stopprice;
global boll;
for k=1:length(targetList);
   
    %--------------------仓位、K线、当前bar的提取-----------------------------%
    %获取当前仓位
    [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
    %策略中每次取数据的长度
    dlags=10;
    lags=60;
    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;
    percent=0.1;
    percent2=0.5;
    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;
    if boll.switch==0;
        if close(end)>upline(end)
            boll.num=boll.num+1;
            boll.value(boll.num)=close(end);
            boll.switch=1;
        elseif close(end)<dnline(end)
            boll.num=boll.num+1;
            boll.value(boll.num)=close(end);
            boll.switch=-1;
        end;
    elseif boll.switch==1;
        if close(end)>upline(end) && close(end)>boll.value(boll.num)
            boll.value(boll.num)=close(end);
        elseif close(end)<dnline(end)
            boll.num=boll.num+1;
            boll.value(boll.num)=close(end);
            boll.switch=-1;
        end;
    elseif boll.switch==-1;
        if close(end)<dnline(end) && close(end)<boll.value(boll.num)
            boll.value(boll.num)=close(end);
        elseif close(end)>upline(end)
            boll.num=boll.num+1;
            boll.value(boll.num)=close(end);
            boll.switch=1;
        end;
    end;
    if length(boll.value)>=2;
        if record==1
            con1=boll.value(end)<boll.value(end-1);
            con2=close(end)>(boll.value(end-1)-boll.value(end))*percent+boll.value(end);
            s(1).buycon=con1 && con2;
        end;
        if record==-1
            con3=boll.value(end)>boll.value(end-1);
            con4=close(end)<-(boll.value(end)-boll.value(end-1))*percent+boll.value(end);
            s(1).sellshortcon=con3 && con4;
        end;
    end;
    %------------被动出场操作------------------%
    %找到未平仓的订单
    remain=remainorder(entry,k);
    %对未平仓的订单进行平仓判断及操作
    for i=1:length(remain.entrybar);
        % 进仓以来的bar个数
        longstopcon=0;
        shortstopcon=0;
        barsinceentry=barnum-remain.entrybar(i);
        backlen=50;    % 回溯的长度(进仓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);
        elseif remain.entryexitway(i)==8;
            ATRparam=1.5;
            [longstopcon,shortstopcon,exitline]=exit8(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,len,stopprice,p2,ATRparam);
%             sellcon=0;
%             buytocovercon=0;
%             if remain.entrydirection(i)==1;
%                 sellcon=high(end)>upline(end);
%                 longstopcon=close(end)<stopprice.loss;
%             elseif remain.entrydirection(i)==-1
%                 buytocovercon=low(end)<dnline(end);
%                 shortstopcon=close(end)>stopprice.loss;
%             end;
%             longstopcon=longstopcon || sellcon;
%             shortstopcon=shortstopcon || buytocovercon;
        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);
    %---------------------------入场操作--------------------------------%
    %----------------策略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.loss=boll.value(end)-10;
        stopprice.earn=(boll.value(end-1)-boll.value(end))*percent2+boll.value(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.loss=boll.value(end)+10;
        stopprice.earn=-(boll.value(end)-boll.value(end-1))*percent2+boll.value(end);
        record=1;
        % 合约号,barnum,方向,开关,手数,出场,策略
    end;
    %---------------------- 虚拟交易所最终执行买卖 ------------------------------%
end
end

更多免费策略源码下载请登录DigQuant社区-策略资源,http://www.digquant.com.cn/stra.php

布林通道+高低点策略源码下载:http://www.digquant.com.cn/stra.php?mod=model&pid=153

Rank: 1

精华
0
UID
251762
积分
23
帖子
21
主题
2
阅读权限
10
注册时间
2017-5-27
最后登录
2018-9-12
发表于 2017-7-15 09:16:07 |显示全部楼层
这个不错

使用道具 举报

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

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-3-29 19:11

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部