图片
1.ORB突破思想
1.1起源
ORB突破交易最早于1988年由美国基金经理托比提出。他通过衡量开盘价与最高价、最低价距离的较小者,为失败突破幅度,后市一旦超过这个幅度,便认为是真正的突破。在实际应用中,早盘的突破、窄幅波动后的突破,可作为有效的过滤条件。
1.2主要特点:
日内交易策略,收盘平仓;
ORB失败突破基于过去N个交易日ORB指标;
上轨=今日开盘价+N天ORB*M;
下轨=今日开盘价-N天ORB*M;
当价格突破上轨,买入开仓;
当价格跌穿下轨,卖出开仓。
2.对于ORB思想的改进
2.1发现问题
通过行情图研究发现突破ORB下轨做空需要比突破ORB上轨做多更为严格
一日内多次突破ORB轨道导致多次开平仓抬高了手续费又降低了胜率
仅每日收盘平仓对于行情的把握太过迟钝
2.2改进想法
设定ORB上轨于下轨振幅比为1:2
在开仓条件中加入均线过滤与日历过滤去噪,同时控制每一天最多开仓一次
平仓条件加入滚动止盈止损平仓同时止盈止损基础价格为每次开仓时刻的均价
3.策略代码分享
3.1策略文件
function ORB(Bint,beginD,cellPar)
%提取参数
freq=cellPar{1};
stop_rate=cellPar{2};
global idex
global Tlen
global TT
global newprice
global timeTT
global ORBvalue
global s
global maketime
%初始化
if Bint
traderSetParalMode(false);
idex=traderRegKData(‘min’,freq);
Tlen=length(idex(:,1));
newprice=zeros(Tlen,1);
TT=zeros(Tlen,1);
timeTT=zeros(Tlen,1);
ORBvalue=0;
else
if isempty(s)
[ValidCash,MarketCap,,,~] = traderGetAccountInfoV2(1);
s=ValidCash+MarketCap;
end
%获取数据
iddexK = traderGetRegKData(idex, 61, false);
for i=1:Tlen
idddexK=iddexK(1+8*(i-1):8i,:);
time=idddexK(1,:);
open=idddexK(2,:);
high=idddexK(3,:);
low=idddexK(4,:);
close=idddexK(5,:);
[Position,~,AvgPrice] = traderGetAccountPositionV2(1,i);
[Multiple, ~, ~, ~, ~, ~, ~] = traderGetFutureInfoV2(i);
%时间格式转换
gettime=datevec(time(end));
nowtime=10000gettime(end,4)+100gettime(end,5)+gettime(end,6);
%时间控制
if nowtime>=90000&&nowtime<=110000
timeTT=1;
elseif nowtime>=123000&&nowtime<=143000
timeTT=2;
else
timeTT=0;
end
%资金管理
sharenum=floor(s0.8/Multiple/close(end)/Tlen);
%ORB振幅描述
if nowtime>=110500&&nowtime<111500
a=mean(open(end-5:end));
b=mean(high(end-5:end));
c=mean(low(end-5:end));
ORBvalue=max(abs(a-b),abs(a-c));
end
%开仓
if Position0&&timeTT2
if close(end)>(open(end)+ORBvalue)&&close(end)>mean(close(end-19:end))&&weekday(time(end))~=6&&maketime0
orderID= traderPositionToV2(1,i,sharenum,0,‘market’,‘buy’);
if orderID~=0
TT(i)=1;
maketime=1;
end
elseif close(end)<(open(end)-2*ORBvalue)&&close(end)<mean(close(end-19:end))&&weekday(time(end))~=6&&maketime0
orderID= traderPositionToV2(1,i,-sharenum,0,‘market’,‘sell’);
if orderID~=0
TT(i)=1;
maketime=1;
end
end
end
%开仓时刻均价记录
if TT(i)1
newprice(i)=AvgPrice;
TT(i)=0;
end
%时间控制平仓
if timeTT0
traderPositionToV2(1,i,0,0,‘market’,‘stop’);
maketime=0;
end
%滚动止盈止损平仓
if Position<0
if close(end)> newprice(i)(1+stop_rate)
traderPositionToV2(1,i,0,0,‘market’,‘stop’);
if close(end)< newprice(i)(1-3stop_rate)
newprice(i)=close(end);
end
end
end
if Position>0
if close(end)<newprice(i)(1-stop_rate)
traderPositionToV2(1,i,0,0,‘market’,‘stop’);
if close(end)>newprice(i)(1+3stop_rate)
newprice(i)=close(end);
end
end
end
end
end
3.2执行文件
TargetList(1).Market = ‘CFFEX’;
TargetList(1).Code = ‘IF0000’;
stop_rate=0.02;
freq=10;
AccountList(1) = {‘FutureBackReplay’};
traderRunBacktestV2(‘ORB’,@ORB,{freq,stop_rate},AccountList(1),TargetList,‘min’,10,20100101,20170820,‘FWard’);
4.回测表现
对沪深300指数期货2010年至2017年进行回测
图片图片