策略基本概念是基于区间突破, 当前close突破n天前的均值+m倍的标准差,就long或short。加了一个过滤器,另外收盘价在均线之上。 然后利用移动止损, n天前的ATR,滚动式的获利方式。 策略的概念其实很简单, 核心是回望窗口n天。 n不是固定值, 是实时根据当前市场的状态(波动性等等)计算的。本策略采用60分钟,每隔10分钟进行一次采样。
测试时间较长,从11年到17年,绩效曲线相对稳定。
由 Auto-Trader 提供回测曲线报告:
策略源代码:
- function RBtry(bInit,bDayBegin,cellPar)%
- %% 函数说明
- % 上面的三个参数是一种固定结构。
- % 当在调用该函数如 RBtry(a1,a2,a3,a4,a5,...).所有的参数都会被赋值给cellPar,即cellPar={a1,a2,a3,a4,a5,...}
- % bInit,在策略逻辑运行前为1,类似优矿等平台的initialize函数。当开始判断是否下单后,该变量为0.
- % bDayBegin 在一天的第一根Bar为1,其他时刻为0
- %% 外部和全局参数声明,这是一个固定结构.
- global g_idxKDay; % 注册日数据的index.日数据是分钟数据的合成.如在日中获取,当日的数据仅是当日已出现数据的合成,不包含之后的数据。
- global g_idxKMin; %
- global g_idxSignal;
- global openPrice; %记录开盘价
- global histExtre; %记录历史达到的极值点,用于跟踪止盈
- global TLen;
- N=cellPar{1};
- m=cellPar{2};
- Freq = cellPar{3};
- stoploss = cellPar{4};
- stopprofit = cellPar{5};
- trailinggap = cellPar{6};
- %% 初始化回测帐户
- if bInit
- % traderSetParalMode(false);%默认是true,因子计算函数并行执行,速度快,不能调试,false串行执行可以设断点调试
- g_idxKDay = traderRegKData('day',1);% 只有注册之后才能获取数据。分钟数据的获取方法为 traderRegKData('min',1)。后面的数字是刷新频率。
- g_idxKMin = traderRegKData('min',Freq);%
- TLen = length(g_idxKDay(:,1));
- g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKMin,N,m}); %计算因子。调用需要函数如getRange,大括号内是输入参数
- openPrice = nan(1,TLen);
- histExtre = nan(1,TLen);
- %% 交易逻辑
- else
- dSignal = traderGetRegUserIndi(g_idxSignal,1);
- [mp,~,~]=traderGetAccountPositionV2(1,1:TLen);
- % ——————————————————调仓———————————————————
- for i=1:TLen
- dataDay = traderGetRegKData(g_idxKMin(i,:),1,false);
- % 数据长度足够;数据非空;当日的成交价不为0;当日高低不同
- if isempty(dSignal(i,:)) || isempty(dataDay) || dataDay(6,end) ==0 || dataDay(3,end)- dataDay(4,end)==0
- continue;
- end
-
- %% 记录历史达到的最大有利值
- if mp(i)>0
- histExtre(i) = max(histExtre(i),dataDay(3,end));
- elseif mp(i)<0
- histExtre(i) = min(histExtre(i),dataDay(4,end));
- end
- %%平仓,信号依次为反转平仓、止损平仓、跟踪止损平仓
- %多单
- closeBuy1 = mp(i)>0 && dataDay(5,end)<openPrice(i)-stoploss*dSignal(i,end);
- closeBuy2 = mp(i)>0 && histExtre(i)>openPrice(i)+stopprofit*dSignal(i,end) && dataDay(5,end)<histExtre(i)-trailinggap*dSignal(i,end);
- %空单
- closeSell1 = mp(i)<0 && dataDay(5,end)>openPrice(i)+stoploss*dSignal(i,end);
- closeSell2 = mp(i)<0 && histExtre(i)<openPrice(i)-stopprofit*dSignal(i,end) && dataDay(5,end)>histExtre(i)+trailinggap*dSignal(i,end);
-
- if closeBuy1 + closeBuy2 + closeSell1 + closeSell2>0
- traderPositionToV2(1,i,0,0,'market','close');
- end
-
- % 开仓
- amount = 2000;
- if mp(i) == 0 && dSignal(i+TLen,end)>0 %&& dSignal(i+2*TLen,end)>0
- traderDirectBuyV2(1,i,amount,0,'market','buy1');%开多单
- openPrice(i) = dataDay(5,end);
- histExtre(i) = dataDay(5,end);
- elseif mp(i) == 0 && dSignal(i+TLen,end)<0% && dSignal(i+2*TLen,end)<0
- traderDirectSellV2(1,i,amount,0,'market','sell1');%开空单
- openPrice(i) = dataDay(5,end);
- histExtre(i) = dataDay(5,end);
- end
- end
- end
- end
- %% 计算因子的自定义函数
- function value=getSignal(cellPar,bpPFCell)
- %调用该函数的参数将会全部被赋给cellPar
- %bpPFCell为一个时间序列,标记特定的刷新时刻
- %%%参数声明
- idxK =cellPar{1};
- N = cellPar{2};
- m = cellPar{3};
- %%%函数计算
- [targetNum,~]=size(idxK);
- value = nan(1,3*targetNum);%第一个ATR,第三个均值突破
- for i=1:targetNum
- regKMatrix = traderGetRegKData(idxK(i,:),N+10,false,bpPFCell);
- regKMatrix(:,any(isnan(regKMatrix),1))=[];
- [~,KLen]=size(regKMatrix);
- if KLen>=N+2
- value1 = abs(regKMatrix(3,end-N+1:end) - regKMatrix(4,end-N+1:end));% 当日最高价减去当日最低价
- value2 = abs(regKMatrix(3,end-N+1:end) - regKMatrix(5,end-N:end-1));% 当日最高价减去前日收盘价的绝对值
- value3 = abs(regKMatrix(4,end-N+1:end) - regKMatrix(5,end-N:end-1));% 当日最低价减去前日收盘价的绝对值
- TRlist=max(value1,max(value2,value3));
- value(i) = mean(TRlist);
- stds = std(regKMatrix(5,end-N+1:end));
- means = mean(regKMatrix(5,end-N+1:end));
-
- if regKMatrix(5,end)>stds*m + means
- value(i+targetNum) = 1;
- elseif regKMatrix(5,end)<-stds*m + means
- value(i+targetNum) = -1;
- else
- value(i+targetNum) = 0;
- end
- stds = std(regKMatrix(5,end-13:end));
- means = mean(regKMatrix(5,end-13:end));
- value(i+2*targetNum) = (regKMatrix(5,end)-means)/stds/.015;
- end
- end
- end
策略执行代码:
- targetList(1).Market = 'SHFE';
- targetList(1).Code = 'RB0000';
- N=100;
- m=1;
- Freq = 60;
- stoploss= 2;
- stopprofit = 4;
- trailinggap = 2;
-
- AccountList(1) = {'FutureBackReplay'};
- traderRunBacktestV2('MoneyManageMent',@RBtry,{N,m,Freq,stoploss ,stopprofit,trailinggap },AccountList,targetList,'min',10,20110104,20170220,'FWard');
更多免费策略源码下载,请登录 DigQuant社区-策略资源版块~