设为首页收藏本站

 找回密码
 注册
查看: 3546|回复: 2

均线通道+突破+加仓(附源码) [复制链接]

精华
0
UID
247176
积分
162
帖子
72
主题
68
阅读权限
0
注册时间
2017-2-14
最后登录
2017-5-18
发表于 2017-3-21 11:05:23 |显示全部楼层
均线通道突破+加仓
策略原理:
         20均线为中轴,上下一个单位的标准差构成一个均线通道
         多头入场:价格突破通道上轨,且成为近期高点
         空头入场:价格突破通道下轨,且成为近期低点
         加仓:价格每变动2倍ATR
         出场:动态跟踪止损

策略源码:

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;
end
end

精华
0
UID
247176
积分
162
帖子
72
主题
68
阅读权限
0
注册时间
2017-2-14
最后登录
2017-5-18
发表于 2017-3-21 11:05:40 |显示全部楼层
更多免费策略源码下载请登录DigQuant社区-策略资源,http://www.digquant.com.cn/stra.php

均线通道+突破+加仓策略源码下载:http://www.digquant.com.cn/stra.php?mod=model&pid=135

使用道具 举报

Rank: 1

精华
0
UID
219312
积分
14
帖子
12
主题
2
阅读权限
10
注册时间
2015-9-10
最后登录
2019-3-17
发表于 2019-3-6 18:49:30 |显示全部楼层
本帖最后由 qqylp263 于 2019-3-6 18:51 编辑

到那个网站注册就要叫你下载什么东西

使用道具 举报

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

bottom

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

GMT+8, 2024-3-29 01:03

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部