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
:非常感谢老师!