跨周期kdj指标计算异常问题求助



Params
	//此处添加参数
    Numeric FastLength(12);
	Numeric SlowLength(26);
	Numeric MACDLength(9);
    Numeric Length(9);            
    Numeric SlowLength_kdj(3);    
    Numeric SmoothLength(3);
    Numeric Length_rsi_short(6);
    Numeric Length_rsi_long(24);
    
Vars
	//此处添加变量
	Series<Numeric> MACDDiff; 
	Series<Numeric> AvgMACD;
	Series<Numeric> MACDValue;
	Plot pen1;
	Plot pen2;
	Global Numeric i1;
	Global Numeric i2;
	
	Numeric HighestValue ;
    Numeric LowestValue ;
    Numeric k;
	
	Series<Numeric> kValue;     // K值
    Series<Numeric> DValue;     // D值
    Series<Numeric> JValue;     // J值
    
    
    
Defs
	//此处添加公式函数
	Numeric SMAValue(Numeric Price,Numeric Length,Numeric Weight)
    {
        if(InvalidNumeric == Price || InvalidNumeric == Length || InvalidNumeric == Weight)
        {
            return InvalidNumeric;
        }
        return SMA(Price,Length,Weight);
    }
Events
	//此处实现事件函数
	
	//初始化事件函数,策略运行期间,首先运行且只有一次
	OnInit()
	{
		i1= SubscribeBar(Symbol,"5m",BeginDateTime,0,Enum_Data_FullPeriod);
		i2= SubscribeBar(Symbol,"30m",BeginDateTime,0,Enum_Data_FullPeriod);
		Data[i1].AddDataFlag(Enum_Data_EndTime);
		Data[i2].AddDataFlag(Enum_Data_EndTime);
		
	}
	OnReady()
	{
		SetBackBarMaxCount(1+Max(Max(Length,SlowLength),SmoothLength));
	}

	//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
	OnBar(ArrayRef<Integer> indexs)
	{
		
		
		//5分钟周期图指标计算--kdj,
		Range[i1:i1]
        {
            HighestValue = HighestFC(High, Length);
            LowestValue = LowestFC(Low, Length); 
            k = (Close - LowestValue)/(HighestValue-LowestValue)*100;
            kValue = SMAValue(k,SlowLength,1);
            DValue = SMAValue(KValue,SmoothLength,1);
            JValue = 3*kValue - 2*DValue; 
            
            Commentary("HighestValue="+Text(HighestValue));
            Commentary("LowestValue="+Text(LowestValue));
            Commentary("k="+Text(k));
            Commentary("KValue="+Text(KValue));
            Commentary("DValue="+Text(DValue));
        }
		
		//30分钟周期指标计算
		Range[i2:i2]
        {
					
			HighestValue = HighestFC(High, Length);
            LowestValue = LowestFC(Low, Length); 
            k = (Close - LowestValue)/(HighestValue-LowestValue)*100;
            kValue = SMAValue(k,SlowLength,1);
            DValue = SMAValue(KValue,SmoothLength,1);
            
            Commentary("HighestValue="+Text(HighestValue));
            Commentary("LowestValue="+Text(LowestValue));
            Commentary("k="+Text(k));
            Commentary("KValue="+Text(KValue));
            Commentary("DValue="+Text(DValue));
            
        }
        
        
	}



老师您好,分别订阅了1分钟,5分钟,30分钟周期,然后在5分钟和30分钟周期计算kdj指标,但计算出来的kdj指标值与实际的kdj值存在较大差异,如下图所示,在5分钟周期图上,计算出来的kvalue是48.60,DValue是46.56,而通过加载系统的kdj公式可以看到k值是72.10,D值是55.45.



在30分钟周期图上,计算出来的kvalue是59.54,DValue是60.61,而通过加载系统的kdj公式可以看到k值是47.18,D值是40.57。请老师帮忙看一下是哪里出现了问题,多谢!



跨周期指标调用回测问题
跨周期指标应用方法
跨周期策略的指标数据延迟问题
跨周期引用如何在小周期实时显示大周期指标?
求助跨周期,指标变化时出现信号闪烁
求助,怎样计算某一个点位的KDJ呢
跨周期偷价和计算误差问题
跨周期KD指标
关于跨周期的问题
跨周期模型回测问题

//------------------------------------------------------------------------

// 简称: KDJ_MACD

// 名称: 多周期KDJ与MACD策略

// 类别: 策略应用

// 类型: 内建应用

//------------------------------------------------------------------------

Params

   Numeric FastLength(12);

   Numeric SlowLength(26);

   Numeric MACDLength(9);

   Numeric Length(9);            // KDJ周期

   Numeric SlowLength_kdj(3);    // KDJ的K值平滑周期

   Numeric SmoothLength(3);      // KDJ的D值平滑周期

   Numeric Length_rsi_short(6);

   Numeric Length_rsi_long(24);

   

Vars

   Series<Numeric> MACDDiff;

   Series<Numeric> AvgMACD;

   Series<Numeric> MACDValue;

   Plot pen1;

   Plot pen2;

   Global Numeric i1;

   Global Numeric i2;

   

   // KDJ计算变量 - 5分钟周期

   Series<Numeric> kValue_5m;     // 5分钟K值

   Series<Numeric> DValue_5m;     // 5分钟D值

   Series<Numeric> JValue_5m;     // 5分钟J值

   

   // KDJ计算变量 - 30分钟周期

   Series<Numeric> kValue_30m;    // 30分钟K值

   Series<Numeric> DValue_30m;    // 30分钟D值

   Series<Numeric> JValue_30m;    // 30分钟J值

   

   // 中间计算值

   Numeric HighestValue_5m;

   Numeric LowestValue_5m;

   Numeric k_5m;

   

   Numeric HighestValue_30m;

   Numeric LowestValue_30m;

   Numeric k_30m;

   

Defs

   Numeric SMAValue(Numeric Price,Numeric Length,Numeric Weight)

   {

       if(InvalidNumeric == Price || InvalidNumeric == Length || InvalidNumeric == Weight)

       {

           return InvalidNumeric;

       }

       return SMA(Price,Length,Weight);

   }


Events

   OnReady()

   {

       SetBackBarMaxCount(1+Max(Max(Length,SlowLength),SmoothLength));

       Range[0:DataSourceSize() - 1]

       {

           // 设置KDJ指标显示选项

           setPlotOption("K_5m", "begin-bar", SlowLength_kdj);

           setPlotOption("D_5m", "begin-bar", SmoothLength);

           setPlotOption("J_5m", "begin-bar", SmoothLength);

           

           setPlotOption("K_30m", "begin-bar", SlowLength_kdj);

           setPlotOption("D_30m", "begin-bar", SmoothLength);

           setPlotOption("J_30m", "begin-bar", SmoothLength);

           

           // 设置MACD指标显示选项

           setPlotOption("MACD", "begin-bar", FastLength + MACDLength);

           setPlotOption("Signal", "begin-bar", FastLength + MACDLength);

           setPlotOption("Histogram", "begin-bar", FastLength + MACDLength);

       }

   }

   

   OnBar(ArrayRef<Integer> indexs)

   {

       // 5分钟周期图指标计算

       Range[i1:i1]

       {

           // KDJ计算

           HighestValue_5m = HighestFC(High, Length);

           LowestValue_5m = LowestFC(Low, Length);

           k_5m = (Close - LowestValue_5m)/(HighestValue_5m-LowestValue_5m)*100;

           kValue_5m = SMAValue(k_5m, SlowLength_kdj, 1);

           DValue_5m = SMAValue(kValue_5m, SmoothLength, 1);

           JValue_5m = 3*kValue_5m - 2*DValue_5m;

           

           // 绘制KDJ指标

           PlotNumeric("K_5m", kValue_5m);

           PlotNumeric("D_5m", DValue_5m);

           PlotNumeric("J_5m", JValue_5m);

           PlotNumeric("Ref1_5m", 20);

           PlotNumeric("Ref2_5m", 80);

           

           // 输出计算过程

           Commentary("5分钟周期:");

           Commentary("HighestValue_5m="+Text(HighestValue_5m));

           Commentary("LowestValue_5m="+Text(LowestValue_5m));

           Commentary("k_5m="+Text(k_5m));

           Commentary("kValue_5m="+Text(kValue_5m));

           Commentary("DValue_5m="+Text(DValue_5m));

           Commentary("JValue_5m="+Text(JValue_5m));

           

           // MACD计算

           MACDDiff = EMA(Close, FastLength) - EMA(Close, SlowLength);

           AvgMACD = EMA(MACDDiff, MACDLength);

           MACDValue = MACDDiff - AvgMACD;

           

           // 绘制MACD指标

           PlotNumeric("MACD", MACDDiff);

           PlotNumeric("Signal", AvgMACD);

           PlotNumeric("Histogram", MACDValue);

       }

       

       // 30分钟周期指标计算

       Range[i2:i2]

       {

           // KDJ计算

           HighestValue_30m = HighestFC(High, Length);

           LowestValue_30m = LowestFC(Low, Length);

           k_30m = (Close - LowestValue_30m)/(HighestValue_30m-LowestValue_30m)*100;

           kValue_30m = SMAValue(k_30m, SlowLength_kdj, 1);

           DValue_30m = SMAValue(kValue_30m, SmoothLength, 1);

           JValue_30m = 3*kValue_30m - 2*DValue_30m;

           

           // 绘制KDJ指标

           PlotNumeric("K_30m", kValue_30m);

           PlotNumeric("D_30m", DValue_30m);

           PlotNumeric("J_30m", JValue_30m);

           PlotNumeric("Ref1_30m", 20);

           PlotNumeric("Ref2_30m", 80);

           

           // 输出计算过程

           Commentary("30分钟周期:");

           Commentary("HighestValue_30m="+Text(HighestValue_30m));

           Commentary("LowestValue_30m="+Text(LowestValue_30m));

           Commentary("k_30m="+Text(k_30m));

           Commentary("kValue_30m="+Text(kValue_30m));

           Commentary("DValue_30m="+Text(DValue_30m));

           Commentary("JValue_30m="+Text(JValue_30m));

       }

   }    

//------------------------------------------------------------------------

// 编译版本    GS2010.12.08

// 版权所有    TradeBlazer Software 2003-2025

// 更改声明    TradeBlazer Software保留对TradeBlazer平

//            台每一版本的TradeBlazer公式修改和重写的权利

//------------------------------------------------------------------------

  1. 修正参数引用,使用 SlowLength_kdj 而非 SlowLength:
  2. 为不同周期的 KDJ 计算使用独立变量,避免数据覆盖:
  3. 确保每个周期的计算独立进行:
非常感谢老师!