楼主: 挖矿专家
4139 1

[交易策略] 【每日一策】Matlab量化交易策略之 网格加仓法则 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

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

楼主
挖矿专家 发表于 2017-2-16 11:21:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
策略名称:网格加仓法则
策略说明

用ATR轨道进仓

利用网格加仓法进行加仓:

每个入场点设置中线,止损线和止盈调整线
当到达止盈调整线,加仓1份资金,并将止损线抬高到原中线
当到达止损线,平仓


策略代码:


function  Strategy1(freq)%


targetList  =  traderGetTargetList();  

%获取目标资产信息

HandleList  =  traderGetHandleList();

%获取账户句柄

global  record;

for  k=1:length(targetList);


        %--------------------仓位、K线、当前bar的提取-----------------------------%

        %获取当前仓位

        [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);

        %策略中每次取数据的长度

        lags=100;

        dlags=11;

        barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);

        %数据长度限制

        if(barnum<lags)

                continue;

        end

        %获取K线数据

        [time,open,high,low,close,volume,~,~]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq,  0-lags,  0,false,'FWard');

        [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,~,~]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'day',1,  0-dlags,  0,false,'FWard');

        if  length(close)<lags  ||  length(Dclose)<dlags

                continue;

        end;        


        %---------------------  14:50  日内平仓  ---------------------------------%

        Y=datevec(time(end));

        X=Y(4)*100+Y(5);

        if  X==1455

                traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');

                record{k}.isopen(:)=0;

                continue;

        end;

        if  X>1455  &&  X<1600

                continue;

        end;

        %-------------------------交易逻辑-------------------------------%

        TRvalue=TR(Dclose,Dhigh,Dlow);

        ATR=ma(TRvalue,10);

        stoplossratio=0.2*ATR(end-1)/Dopen(end);                                  %  止损触发比例

        stopearnratio=stoplossratio*1.1;                                                  %  止盈触发比例

        %  未平仓的订单提取

        remain_num=find(record{k}.isopen==1);

        remain.isopen=record{k}.isopen(remain_num);

        remain.isearn=record{k}.isearn(remain_num);

        remain.pivotprice=record{k}.pivotprice(remain_num);

        remain.entrybar=record{k}.entrybar(remain_num);

        remain.unit=record{k}.unit(remain_num);

        remain.direction=record{k}.direction(remain_num);

        %  -------------------  计算购买手数  -----------------------------  %

        %  提取剩余可用资金

        [ValidCash,MarketCap,~,~,~]  =  traderGetAccountInfo(HandleList(1));

        [~,~,Multiple,~,~,~,~,LongMargin,ShortMargin]  =  traderGetFutureInfo(targetList(k).Market,targetList(k).Code);

        %  计算当前还有几分资金没使用

        num=0;      %  isopen==1  表示未平仓的资金

        for  i=1:length(record)

                aa=find(record{i}.isopen==1);

                num=num+length(aa);

        end;

        n=5;      %  分成5份资金

        remain_share=n*length(targetList)-num;

        %  con1:当n份资金都使用完了,con1=0,不继续开仓,因为没有足够的资金了

        con1=0;

        if  remain_share~=0;

                con1=1;

%                  openunit=fix(MarketCap/close(end)/Multiple/length(targetList)/n);    %  一份资金可以购买的手数(没有带杠杆买)

                openunit=fix(ValidCash/close(end)/Multiple/length(targetList)/remain_share/LongMargin);    %  一份资金可以购买的手数(带杠杆买)

        end;

        %  判断当前是多头持仓还是空头持仓

        posdir=0;  

        if  ~isempty(remain.direction)

                if  remain.direction(end)>0

                        posdir=1;

                elseif  remain.direction(end)<0

                        posdir=-1;

                end;

        end;

        %---------------------------------对未平仓的订单进行平仓或者调整止损线--------------------------------------------%

        for  i=1:length(remain_num)

                index=remain_num(i);

                if  remain.direction(i)==1

                        if  close(end)<remain.pivotprice(i)-stoplossratio*remain.pivotprice(i)  %  触发止损线

                                orderID3=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,remain.unit(i),0,'market','sell');

                                if  orderID3==0

                                        continue;

                                end;

                                record{k}.isopen(index)=0;

                        elseif  close(end)>remain.pivotprice(i)+stopearnratio*remain.pivotprice(i)  %  触发止盈线

                                record{k}.pivotprice(index)=close(end);

                                record{k}.isearn(index)=2;

                        end;

                elseif  remain.direction(i)==-1

                        if  close(end)>remain.pivotprice(i)+stoplossratio*remain.pivotprice(i)  %  触发止损线

                                orderID4=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,remain.unit(i),0,'market','buy');

                                if  orderID4==0

                                        continue;

                                end;

                                record{k}.isopen(index)=0;

                        elseif  close(end)<remain.pivotprice(i)-stopearnratio*remain.pivotprice(i)  %  触发止盈线

                                record{k}.pivotprice(index)=close(end);

                                record{k}.isearn(index)=2;

                        end;

                end;

        end;

        %-----------------------------入场条件--------------------------------------------%

        con2=isempty(find(remain.isearn==1,1));                            %  所有头寸都是盈利的才考虑进新的头寸

        upline=Dopen(end)+0.5*ATR(end-1);

        dnline=Dopen(end)-0.5*ATR(end-1);

        bcon=close(end)>upline;

        scon=close(end)<dnline;

        buycon=con1  &&  con2  &&  bcon  &&  posdir>=0;                      %  突破ATR轨道做多

        sellshortcon=con1  &&  con2  &&  scon  &&  posdir<=0;          %  突破ATR轨道做空

        %---------------------------入场操作--------------------------------%

        if  buycon

                orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','buy');

                if  orderID1==0

                        continue;

                end;

                record{k}.pivotprice=[record{k}.pivotprice,close(end)];

                record{k}.isearn=[record{k}.isearn,1];

                record{k}.isopen=[record{k}.isopen,1];

                record{k}.unit=[record{k}.unit,openunit];

                record{k}.entrybar=[record{k}.entrybar,barnum];

                record{k}.direction=[record{k}.direction,1];

        end;

        if  sellshortcon

                orderID2=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','sell');

                if  orderID2==0

                        continue;

                end;

                record{k}.pivotprice=[record{k}.pivotprice,close(end)];

                record{k}.isearn=[record{k}.isearn,1];

                record{k}.isopen=[record{k}.isopen,1];

                record{k}.unit=[record{k}.unit,openunit];

                record{k}.entrybar=[record{k}.entrybar,barnum];

                record{k}.direction=[record{k}.direction,-1];

        end;

end

end


function  TRvalue=TR(close,high,low)

        TRvalue=zeros(length(close),1);

        TRvalue(1)=high(1)-low(1);

        for  i=2:length(close)

                TRvalue(i)=max([high(i)-low(i),high(i)-close(i-1),close(i-1)-low(i)]);

        end;

end


function  aveline=ma(price,len)

        aveline=zeros(length(price),1);

        for  i=1:len-1

                aveline(i)=price(i);

        end;

        for  i=len:length(price)

                aveline(i)=mean(price(i-len+1:i));

        end;

end


策略代码请登录atrader社区-策略服务 下载:  www.atrader.com.cn/stra.php?mod=model&pid=63


回测曲线:


QQ图片20170216112036.png




二维码

扫码加我 拉你入群

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

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

关键词:加仓

沙发
挖矿专家 发表于 2017-2-23 19:02:55
顶!d=====( ̄▽ ̄*)b

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

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