LZ选择的通道为:上轨=今日开盘价+0.25*range;下轨=今日开盘价-0.25*range。与其他突破类策略一样,价格突破上轨做多,价格突破下轨做空。(当然,你也可以选择进行反趋势交易)
而出场条件同样由上下轨决定,多头出场条件为:价格下跌上轨-0.25*range;空头出场条件为:价格上穿下轨+0.25*range。如果不能主动出场,那么在收盘前,也会进行强制平仓操作。下为源代码:
- %-------------------------------------------------------主体函数------------------------------------------------%
- function RangeBreak(freq)%
- targetList = traderGetTargetList();
- %获取目标资产信息
- HandleList = traderGetHandleList();
- %获取账户句柄
- global state;
- for k=1:length(targetList);
-
- %--------------------仓位、K线、当前bar的提取-----------------------------%
- %获取当前仓位
- [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
- %策略中每次取数据的长度
- lags=40;
- dlags=31;
- 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;
- %设置交易时间-----------%
- gettime=datevec(time);
- numtime=gettime(end,4)*100+gettime(end,5);
- cont=0;
- if numtime>=0900&&numtime<1400||numtime>=2100&&numtime<=2400||numtime>0000&&numtime<0100
- cont=1;
- end
- %--------------------- 止损/入场条件计算 ------------------------------------%
- range=Dhigh(end-1)-Dlow(end-1);%昨日震荡幅度
- upline=Dopen(end)+0.25*range;%今日上轨
- dnline=Dopen(end)-0.25*range;%今日下轨
- buycon=close(end)>upline &&cont; % 突破range上轨道做多
- sellshortcon=close(end)<dnline && cont; % 突破 range下轨道做空
- buycon0=close(end)<upline-0.25*range;
- sellcon0=close(end)>dnline+0.25*range;
- shareNum=10;%交易手数的设置
- %--------------------------------------仓位操作-----------------%
- if cont~=0
- if marketposition==0
- if buycon
- traderBuy(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','buy');%开多单
- elseif sellshortcon
- traderSellShort(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','sellshort');%开空单
- end
- end
-
- if marketposition>0 && buycon0
- traderSell(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','sell');%平多单
- end
-
- if marketposition<0 && sellcon0
- traderBuyToCover(HandleList(1),targetList(k).Market,targetList(k).Code,shareNum,0,'market','buytocover');%平空单
- end
- end
- if cont==0
- traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0 ,0,'market','out');
- end
- end
- end
- function ATRValue=ATR(High,Low,Close,Length)
- ATRValue=zeros(length(High),1);
- TRValue=zeros(length(High),1);
- TRValue(2:end)=max([High(2:end)-Low(2:end) abs(High(2:end)-Close(1:end-1)) abs(Low(2:end)-Close(1:end-1))],[],2);
- ATRValue=MA(TRValue,Length);
- end
- function MAValue=MA(Price,Length)
- MAValue=zeros(length(Price),1);
- for i=Length:length(Price)
- MAValue(i)=sum(Price(i-Length+1:i))/Length;
- end
- MAValue(1:Length-1)=Price(1:Length-1);
- end
- %--------------------------------------------------------------------------分割线,下面是另一个.m文件---------------------%
- %策略回测函数
- clear
- clc;
- %-----------获取targetList-----------------%
- targetList(1).Market = 'CFFEX';
- targetList(1).Code = 'IF0000';
- targetList=targetList(1);
- %指定交易频率
- freq=3;
- %-----------------------回测----------------------------------%
- % 在回测时设置初始资本10000000000元、手续费率0.000026、无风险利率0.02、滑价0、默认1下一个bar的开盘价、默认0成交价、默认0直接成交
- % traderSetBacktest(1000000,0.000026,0.02,0,1,0,0);
- AccountList(1) = {'FutureBackReplay'};
- traderRunBacktest('rangebreak',@RangeBreak,{freq},AccountList,targetList,'min',freq,20150101,20160815,'FWard');
利润靠前的交易资料:
多头&空头&权益曲线的表现
策略绩效表现: