全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
如何解决信号闪烁
littlfly 分享到
2022-08-02 10:44

最近做的自动化交易总是出现信号闪烁问题 通过通知信息分析发现委托买卖信号产生时间不对

我的交易周期为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);   
   
      }
}

kyover

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

2022-08-02 10:53
littlfly
@kyover

老师帮我看看是哪几个global有问题 我刚才把global全去掉再跑了一遍程序结果都不开仓了 。

还有我前面分析的我取得是C[1],开仓信号应该在1分钟k线走完即下1分钟开始时发信号,为什么它会在这1分钟的最后1、2秒出信号,这怎么解释?

2022-08-02 11:11
littlfly
@kyover

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

2022-08-02 22:09
a2420956784
@littlfly

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

2022-08-09 21:23
littlfly
2022-08-02 11:06
您未登录,请先 登录注册 后发表评论
顶部