回测曲线(由Auto-trader软件提供回测报告)
策略源码:
- function Aberration(bInit,bDayBegin,cellPar)%
- %% 函数说明
- % 上面的三个参数是一种固定结构。
- % 当在调用该函数如 DualThrust(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_idxSignal;
- global holdTime; % 持仓时间
- n=cellPar{1};
- r = cellPar{2};
- stopgap1 = cellPar{3};
- stopgap2 = cellPar{4};
- %% 初始化回测帐户
- if bInit
- traderSetParalMode(false);%默认是true,因子计算函数并行执行,速度快,不能调试,false串行执行可以设断点调试
- g_idxKDay = traderRegKData('day',1);% 只有注册之后才能获取数据。分钟数据的获取方法为 traderRegKData('min',1)。后面的数字是刷新频率。
- g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKDay,n,r}); %计算因子。调用需要函数如getRange,大括号内是输入参数
- holdTime = containers.Map;
- %% 交易逻辑
- else
- targetList = traderGetTargetList(); % 获取标的信息。
- TLen = length(targetList);
- dSignal = traderGetRegUserIndi(g_idxSignal,1);
- [mp,~,AvgPrice]=traderGetAccountPositionV2(1,1:TLen);
- % ――――――――――――――――――调仓―――――――――――――――――――
- dataDay = traderGetRegKData(g_idxKDay,1,false);
- if isempty(dataDay)
- return
- end
-
- [ValidCash,MarketCap,~,~,~] =traderGetAccountInfoV2(1);
- len = max(length(mp(mp==0)),1);
- percash = min(ValidCash/len,MarketCap/TLen);
- prices = dataDay(5:8:end,end);
- CAPChange = mp.*(AvgPrice-prices);
- COST=abs(mp).*AvgPrice;
-
- if sum(CAPChange(~isnan(prices)))>sum(COST(~isnan(prices)))*stopgap2
- for i=1:TLen
- if mp(i)~=0
- traderPositionToV2(1,i,0,0,'market','close');
- end
- end
- return;
- end
-
-
- for i=1:TLen
- % 数据长度足够;数据非空;当日的成交价不为0;当日高低不同
- if isnan(dSignal(i,end))|| isnan(dataDay(6+8*(i-1),end)) || dataDay(6+8*(i-1),end) ==0
- continue;
- end
- %% 平仓
- if mp(i)~= 0 && (mp(i)*dSignal(i,end)<=0 || sign(mp(i))*(AvgPrice(i)-dataDay(5+8*(i-1),end))>AvgPrice(i)*stopgap1)
- traderPositionToV2(1,i,0,0,'market','close');
- end
-
- %% 开仓及加仓信号
- coef = traderGetFutureInfoV2(i);
- amount = floor(percash/coef/dataDay(5+8*(i-1),end));
- if amount < 1
- continue;
- end
-
- if mp(i)<= 0 && dSignal(i,end)==1
- traderBuyV2(1,i,amount,0,'market','buy1');%开多单
- elseif mp(i)>= 0 && dSignal(i,end)==-1
- traderSellShortV2(1,i,amount,0,'market','buy1');%开空单
- end
- end
- end
- end
- %% 计算因子的自定义函数
- function value=getSignal(cellPar,bpPFCell)
- %调用该函数的参数将会全部被赋给cellPar
- %bpPFCell为一个时间序列,标记特定的刷新时刻
- %%%参数声明
- idxK =cellPar{1};
- n = cellPar{2};
- r = cellPar{3};
- %%%函数计算
- [targetNum,~]=size(idxK);
- value = nan(1,targetNum*2);
- for i=1:targetNum
- regKMatrix = traderGetRegKData(idxK(i,:),n+10,false,bpPFCell);
- regKMatrix(:,any(isnan(regKMatrix),1))=[];
- [~,KLen]=size(regKMatrix);
- if KLen<n+1
- continue;
- end
- closeNow = regKMatrix(5,end);
- closePre = regKMatrix(5,end-1);
- meanNow = mean(regKMatrix(5,end-n+1:end));
- meanPre = mean(regKMatrix(5,end-n:end-1));
- stdNow = std(regKMatrix(5,end-n+1:end),1);
- stdPre = std(regKMatrix(5,end-n:end-1),1);
-
- if closeNow>meanNow+r*stdNow && closePre<meanPre+r*stdPre && mean(regKMatrix(6,:))>100
- value(i)=1;
- elseif closeNow<meanNow-r*stdNow && closePre>meanPre-r*stdPre && mean(regKMatrix(6,:))>100
- value(i) = -1;
- elseif closeNow<meanNow
- value(i) = -2;
- elseif closeNow > meanNow
- value(i) = 2;
- end
- end
- end
更多免费策略源码下载请登录DigQuant社区-策略资源下载~


雷达卡





京公网安备 11010802022788号







