如何解决信号闪烁

最近做的自动化交易总是出现信号闪烁问题 通过通知信息分析发现委托买卖信号产生时间不对 我的交易周期为1分钟,开仓信号以macd金死叉为判断,macd取值用的是C[1] 以上述通知为例 ,我的交易信号应该在10:13的K线走完产生,即交易信号发生要在10:14,但实际交易是,10:13最后几秒产生,在10:13是不满足开仓条件的 所以发生了信号闪烁,各位老师帮忙看看怎么解决这个问题,谢谢!! 具体代码如下 Params Numeric FastLength(89);//声明数值型参数为FastLength,初始值赋值它为12个周期// Numeric SlowLength(144);//声明数值型参数为SlowLength,初始值为26个周期。// Numeric MACDLength(9);//声明数组型参数为MACDLength,初始值为9个周期。// Numeric TIMES(5);//止盈倍数。// Numeric MONEY(1000);//声明盈亏金额,初始值1000。// Numeric HHCSZ(999);//声明计算取值起始价位,初始值999。// Vars Series<Numeric> DIFF; //跟k线价格相关,所以用声明数组型序列变量名为MACDValue。// Series<Numeric> GDShort; //短均线。// Series<Numeric> GDlong; //长均线。// GLOBAL BOOL PERMIT;//允许开仓。// Numeric MACDValue;//声明数值型变量名为AvgMACD。// Numeric DEA;//声明数值型变量名为MACDDiff。// GLOBAL Numeric LOTS;//声明开仓手数。// GLOBAL Numeric ZSK;//声明止损空价格。// GLOBAL Numeric ZYK;//声明止盈空价格。// BOOL JC ;//声明MACD金叉。// BOOL SC ;//声明MACD死叉。// BOOL GDJC ;//声明均线金叉。// BOOL GDSC ;//声明均线死叉。// Numeric NZSC; Numeric NZJC; Numeric NZGDSC; Numeric NZGDJC; GLOBAL Numeric H3; GLOBAL Numeric L3; GLOBAL Numeric GDJZ;//轨道极值 GLOBAL Numeric GDH3;//轨道高点 GLOBAL Numeric GDL3;//轨道低点 GLOBAL Numeric M;//开仓次数 GLOBAL BOOL KCBZ;//开仓标志 //Defs //先轨道线金叉 再轨道线死叉,再等k线上碰轨道线上轨 macd死叉开空仓 止损2次 等下次轨道线死叉 上碰上轨 macd死叉再开仓 模板PL9 Events OnReady() { Print("MinMove:" + Text(MinMove())); } onBar(ArrayRef<Integer> indexs) { Range[0:DataSourceSize() - 1] { DIFF = XAverage( Close[1], FastLength ) -XAverage( Close[1], SlowLength ) ; DEA = XAverage(DIFF,MACDLength); MACDValue = DIFF - DEA; GDShort= XAverage( Close[1], 144 );//短均线 GDlong= XAverage( Close[1], 338 ); //长均线 GDJC=CROSSOVER(GDShort,GDLONG);//均线金叉 GDSC=CROSSOVER(GDLONG,GDShort);//均线死叉 JC = CrossOver(DIFF,DEA);//macd金叉 SC = CROSSOVER(DEA,DIFF);//macd死叉 NZSC= NthCon(SC,1);//上一次死叉到当前的周期数 NZJC = NthCon(jC,1);//上一次金叉到当前的周期数 L3=Lowest(L,NZSC);//最近一次死叉到目前为止的最低值 H3=HIGHEST(H,NZJC);//最近一次金叉到目前为止的最高值 NZGDSC= NthCon(GDSC,1);//上一次均线死叉到当前的周期数 NZGDJC = NthCon(GDjC,1);//上一次均线金叉到当前的周期数 GDL3=Lowest(L,NZGDSC);//最近一次均线死叉到目前为止的最低值 GDH3=HIGHEST(H,NZGDJC);//最近一次均线金叉到目前为止的最高值 If (GDSC AND GDH3>HHCSZ AND MarketPosition==0)//初始均线死叉 高点在初始设定值之上 赋顶部值准备开仓 { PERMIT=TRUE; M=3;//开仓次数设为3 GDJZ=GDH3; } If (GDSC AND GDH3>GDJZ AND MarketPosition==0)//第一次均线死叉破顶后 赋顶部值重新准备开仓 { PERMIT=TRUE; M=3;//开仓次数设为3 GDJZ=GDH3; } IF (SC AND H3>GDlong AND M>0 AND M<4 AND MarketPosition==0) { LOTS=ROUND((MONEY/(H3-C[1])/ContractUnit),0);//开仓手数 SellShort(LOTS,C[1]-MinMove*PriceScale);//开仓价格 ZSK=H3;//止损 ZYK=C-TIMES*(H3-C[1]);//止盈 M=M-1; } IF (Close[1]>ZSK AND MarketPosition==-1 and MACDValue>0) { BuyToCover(ABS(CurrentContracts),Close[1]+MinMove*PriceScale); } IF (L<ZYK AND MarketPosition==-1) { BuyToCover(ABS(CurrentContracts),ZYK); PERMIT = FALSE; } IF (H>GDJZ ) { M=0; } If (MACDValue >= 0) PlotAuto("MACD",MACDValue,0,Red,Enum_Bar); Else PlotAuto("MACD",MACDValue,0,Green,Enum_Bar); } }

你怎么会用global做状态变量啊 那盘中肯定闪烁啊

回复:老师帮我看看是哪几个global有问题 我刚才把global全去掉再跑了一遍程序结果都不开仓了 。 还有我前面分析的我取得是C[1],开仓信号应该在1分钟k线走完即下1分钟开始时发信号,为什么它会在这1分钟的最后1、2秒出信号,这怎么解释?

回复:问题解决了!不是gloabl变量的问题 信号闪烁是onbar的问题,当Bar一个周期有多次变化导致了信号闪烁,我改成onbaropen就没有问题了

回复:onBar(ArrayRef<Integer> indexs)你是说把这个改成了onbaropen吗?

信号闪烁产生原因及处理方法20211104-开拓者TBQuant量化平台,开启量化投资新时代