跨图层信号闪烁,帮忙看个代码

昨天开的贴子好像沉了,重开帖,请教老师们一个信号闪烁问题。我这是一个截面策略,多品种,不同图层之间会有交互计算,在指定的时间点对加载的品种通过筛选做一次调仓交易,逻辑不复杂,回测信号没问题,实盘会有信号消失的情况。具体的症状是:当一次调仓交易完成后,如果不重启策略单元那么监控器不会查出不匹配,但重启策略单元了马上可以查出不匹配。不匹配的情况是:要么帐户报单了,查看图表没有信号(可能事后消失了);要么图表有信号,帐户没报单。以下是代码,代码不长,请老师帮忙看一下,是哪个环节出问题了,谢谢!代码中没有用CLOSE,用的是CLOSE[1],也没有用序列函数和全局变量作条件判断。Params Bool IsRollover(true);//是否后复权 Bool IsRolloverRealPrice(true);//是否映射真实价格 Bool IsAutoSwapPosition(true);//是否自动换仓 Numeric Fund(167000);//下单金额 Numeric N(25);//回溯周期 Numeric instNum(36);//品种数量 , Numeric WeekdaySet(2);//选择星期几交易 Numeric TimeSet(0.10);//选择哪个时间点交易 Numeric FEN(1);//选择排名第一和排名最后的参数 Vars Array<Numeric> RR;//因子值 Array<Numeric> RS;//保存因子值的变量 //NumericArray atr; Numeric i; Numeric k; Numeric j; Array<Numeric> lots;//下单手数 Array<Numeric> myclose;//把价格转变成复权后价格,方便手数计算 Series<Numeric> RRup;//排名第一的分界点 Series<Numeric> RRdown;//排名最后的分界点 Integer status; Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { Range[0:DataCount-1] { If(IsRollover) { AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权 } If(IsRolloverRealPrice) { AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格 } If(IsAutoSwapPosition) { AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓 } } SetGlobalVar2(\"Switch\", 0); //GetGlobalVar2(\"Switch\") } //在新bar的第一次执行之前调用一次,参数为新bar的图层数组 OnBarOpen(ArrayRef<Integer> indexs) { Numeric k; Numeric result=1; for k=0 to DataSourceSize-1 { result= result*data[k].BarExistStatus; } If(result<>1) Return; If(DATA[i].Rollover<>DATA[i].Rollover[1]) PlotBool(\"true\",True); //If(QuoteStatus() != 1) Return;//过滤集合竞价 Commentary(\"当前bar的时间\"+text(date+time)); //If(data!=data[1]and high==low) Return; //使用FOR循环,品种编号,全部使用索引 //#############################################数据获取计算部份################################## Commentary(\"当前bar的时间\"+text(date+time)); For i = 0 to instNum-1 { if(data[i].close[1]==data[i].close[2]&&data[i].close[2]==data[i].close[3]&&data[i].close[3]==data[i].close[4]) { RR[i]=10000000;//对于未上市的品种,将因子值赋予相对无限大,使其升序排序时不影响后面的交易 Commentary(\"data \"+text(i)+\" 出问题\"+text(date+time)); //print(\"data \"+text(i)+\" 出问题\"+text(date+time)); } else { Numeric mysummation; mysummation=summation(Abs(data[i].close[2]-data[i].close[3]),N); RR[i]=(data[i].close[1]-data[i].close[N])/mysummation;//ER因子 k=k+1; //print(\"status = \"+text(status)); } myclose[i]=data[i].close[1]/data[i].Rollover; lots[i]=(Fund+Portfolio_TotalProfit())/(myclose[i]*data[i].ContractUnit*data[i].BigPointValue*data[i].MarginRatio); data[i].Commentary(\"lots[i]=\"+text(lots[i])); } Commentary(\"k = \"+Text(k)); RS=RR;//用RS值来保存原始的因子值RR数组 Commentary(\"RS=\"+TextArray(RS)); //对因子值进行排序,排序后RR数组本身会发生改变 ArraySort(RR,True); //截取33%,66%分位数的因子值 j=MAX(1,FEN); RRup=RR[j-1];//得到排名前33% RRdown=RR[k-j];//得到排名后33% Commentary(\"RR=\"+TextArray(RR)); Commentary(\"j = \"+Text(j)); Commentary(\"RRup=\"+Text(RRup)); Commentary(\"RRdown=\"+Text(RRdown)); Commentary(\"Time=\"+Text(Time)); k =0; Commentary(\"RR1111=\"+TextArray(RR)); ////#############################################循环交易下单执行部份################################## Numeric Temp_RRup=RRup; Numeric Temp_RRdown=RRdown; For i=0 to instNum-1 { //做多排名第一的品种 If( RS[i]>=Temp_RRdown AND RS[i]!=10000000 AND data[i].MarketPosition!=1 AND Weekday==WeekdaySet and time==TimeSet) { print(\"当前bar1 \"+text(Time)); IF(data[i].MarketPosition==0) { DATA[i].Buy(Lots[i],data[i].Open); } Else IF(data[i].MarketPosition==-1) { DATA[i].BuyToCover(0,DATA[i].open); DATA[i].Buy(Lots[i],data[i].Open); } } //做空排名最后的品种 If( RS[i]<=Temp_RRup AND RS[i]!=10000000 AND data[i].MarketPosition!=-1 AND Weekday==WeekdaySet AND time==TimeSet) { print(\"当前bar2 \"+text(Time)); IF(data[i].MarketPosition==0) { DATA[i].SellShort(Lots[i],data[i].Open); } Else IF(data[i].MarketPosition==1) { DATA[i].Sell(0,DATA[i].open); DATA[i].SellShort(Lots[i],data[i].Open); } } //除了第一和最后,其它品种空仓 If(RS[i]>Temp_RRup AND RS[i]<Temp_RRdown AND DATA[i].MarketPosition==1 AND Weekday==WeekdaySet AND time==TimeSet) { print(\"当前bar3 =\"+text(Time)); DATA[i].Sell(0,DATA[i].open); } If(RS[i]==10000000 AND DATA[i].MarketPosition==1 AND Weekday==WeekdaySet AND time==TimeSet) { print(\"当前bar4 \"+text(Time)); DATA[i].Sell(0,DATA[i].open); } If (RS[i]>Temp_RRup AND RS[i]<Temp_RRdown AND DATA[i].MarketPosition==-1 AND Weekday==WeekdaySet AND time==TimeSet) { print(\"当前bar5 \"+text(Time)); DATA[i].BuyToCover(0,DATA[i].open); } If(RS[i]==10000000 AND DATA[i].MarketPosition==-1 AND Weekday==WeekdaySet AND time==TimeSet) { print(\"当前bar6 \"+text(Time)); DATA[i].BuyToCover(0,DATA[i].open); } } } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { } //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组 OnBarClose(ArrayRef<Integer> indexs) { }

这么久了不知你们的问题解决了吗?

我碰到和你一样的问题,一样的截面策略,你是放在onbaropen中,如果放在onbar中,回测就会提示信号闪烁问题。现在也没法解决

回复:放在ONBAR是会提示闪烁,放在ONBAROPEN里不会提示闪烁,但是会有疑似信号消失的问题,重启策略单元后,监控器马上会发现不匹配,所以潜在的问题好像无论放在哪个域都一样。

你是不是在夜盘的时候发现信号消失了

回复:这次我没有加载没有夜盘的品种,所有品种既有夜盘也有白盘,白天和夜盘都信号消失

回复:老师能再关注一下我的这个问题吗,谢谢,在线等

回复:建议你看一下之前关于信号闪烁的案例和答疑。信号闪烁诊断需要花费比较多的精力和时间,手头需要回复 的问题比较多,如果确实自己诊断不出来,建议发邮件等讲解

回复:刘风老师,信号闪烁的案例我每个视频都看过了,社区里关于信号闪烁的帖子共10页我也一个个看过了,所以常见的明显的闪烁问题我应该都规避了,还是没有解决。但TB一个老师现在正在帮我看,也许能解决,现在还没有确认,这里说一声。如果解决了,我会再回复一次解决了。谢谢

回复:刘风老师请问发哪个邮箱呢