全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
1221 2
2017-03-22
策略原理:
          将资金分为N份,采取随机抛点的形式入场,止损为10%,止盈为11%
          如果该份资金获利超过11%,则上移止盈止损线,且启动下一份资金抛点入场。
          同时在原策略的基础上加上空头入场

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

网格资金管理(多空).png

策略源码:

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=121;    dlags=31;    barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);    %数据长度限制    if(barnum<lags)        continue;    end    if(barnum<dlags)        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;        %-------------------------交易逻辑-------------------------------%%     TRvalue=TR(close,high,low);%     ATR=ma(TRvalue,50);%     p=5;%     stoplossratio=p*mean(ATR(end-20:end-1))/mean(Dclose(end-20:end-1));               % 止损触发比例    stoplossratio=0.02;    stopearnratio=stoplossratio*1.1;                                                  % 止盈触发比例    % 未平仓的订单提取    remain_num=find(record.isopen==1);    remain.isopen=record.isopen(remain_num);    remain.isearn=record.isearn(remain_num);    remain.pivotprice=record.pivotprice(remain_num);    remain.entrybar=record.entrybar(remain_num);    remain.unit=record.unit(remain_num);    remain.direction=record.direction(remain_num);%     remain.stoplossratio=record.stoplossratio(remain_num);%     remain.stopearnratio=record.stopearnratio(remain_num);    % 计算购买手数    [ValidCash,MarketCap,OrderFrozen,MarginFrozen,PositionProfit] = traderGetAccountInfo(HandleList(1));    [~,~,Multiple,~,~,~,~,~,~] = traderGetFutureInfo(targetList(k).Market,targetList(k).Code);    remain_share=10-length(remain_num);    con1=0;    if remain_share~=0;        con1=1;   % 表示仍有可用资金购买        openunit=fix(ValidCash/remain_share/close(end)/Multiple);    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.isopen(index)=0;            elseif close(end)>remain.pivotprice(i)+stopearnratio*remain.pivotprice(i) % 触发止盈线%                 record.stoplossratio(index)=(close(end)-record.pivotprice(index))/close(end);%                 record.stopearnratio(index)=record.stoplossratio(index)*1.1;                record.pivotprice(index)=close(end);                record.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.isopen(index)=0;            elseif close(end)<remain.pivotprice(i)-stopearnratio*remain.pivotprice(i) % 触发止盈线%                 record.stoplossratio(index)=(record.pivotprice(index)-close(end))/close(end);%                 record.stopearnratio(index)=record.stoplossratio(index)*1.1;                record.pivotprice(index)=close(end);                record.isearn(index)=2;            end;        end;    end;    % 入场条件%     ma0=ma(close,5);    ma1=ma(close,20);    std1=stdev(close,20);    con2=isempty(find(remain.isearn==1,1));              % 所有头寸都是盈利的才考虑进新的头寸    bcon=close(end)>ma1(end)+2*std1(end) && close(end-1)>ma1(end-1)+2*std1(end-1);    scon=close(end)<ma1(end)-2*std1(end) && close(end-1)<ma1(end-1)-2*std1(end-1);    buycon=con1 && con2 && bcon && posdir>=0;    sellshortcon=con1 && con2 && scon && posdir<=0;    %---------------------------入场操作--------------------------------%    if buycon        orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','buy');        if orderID1==0            continue;        end;        record.pivotprice=[record.pivotprice,close(end)];        record.isearn=[record.isearn,1];        record.isopen=[record.isopen,1];        record.unit=[record.unit,openunit];        record.entrybar=[record.entrybar,barnum];        record.direction=[record.direction,1];%         record.stoplossratio=[record.stoplossratio,stoplossratio];%         record.stopearnratio=[record.stopearnratio,stopearnratio];    end;    if sellshortcon        orderID2=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','sell');        if orderID2==0            continue;        end;        record.pivotprice=[record.pivotprice,close(end)];        record.isearn=[record.isearn,1];        record.isopen=[record.isopen,1];        record.unit=[record.unit,openunit];        record.entrybar=[record.entrybar,barnum];        record.direction=[record.direction,-1];%         record.stoplossratio=[record.stoplossratio,stoplossratio];%         record.stopearnratio=[record.stopearnratio,stopearnratio];    end;endend


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

二维码

扫码加我 拉你入群

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

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

全部回复
2017-3-23 10:45:40
资金管理类策略很少见啊
二维码

扫码加我 拉你入群

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

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

2017-3-23 19:58:28
嗯嗯,感谢关注~
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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