跨周期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_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公式修改和重写的权利//------------------------------------------------------------------------

修正参数引用,使用 SlowLength_kdj 而非 SlowLength:为不同周期的 KDJ 计算使用独立变量,避免数据覆盖:确保每个周期的计算独立进行:

回复:非常感谢老师!