指标KDJ的KD值后半时间段无输出问题

//=====KDJ===== Numeric FastLength(9); // KDJ快速线参数 Numeric SlowLength(3); // KDJ慢速线参数 Numeric SmoothLength(3); // KDJ慢速线参数 Vars //============ 指标变量 ============ Series<Numeric> MA1; // 快速MA Series<Numeric> MA2; // 慢速MA Series<Numeric> MA3; // 方向MA Series<Numeric> TR; // 真实波幅 Series<Numeric> atrValue; // ATR值 Series<Numeric> TPLineH; //高突破进场线 Series<Numeric> TPLineL; //低突破进场线 Series<Numeric> kValue; //KDJ K值 Series<Numeric> DValue; //KDJ D值 Series<Numeric> JValue; //KDJ J值 Series<Numeric> RSV; //KDJ RSV值..... // 计算KDJ指标 RSV = (Close - Lowest(Low, FastLength)) / (Highest(High, FastLength) - Lowest(Low, FastLength)) * 100; KValue = SMA(RSV, SlowLength, 1); DValue = SMA(KValue, SmoothLength, 1); JValue = 3 * KValue - 2 * DValue; Commentary("kValue:"+Text(kValue)); //BAR输出K值信息 Commentary("DValue:"+Text(DValue)); //BAR输出D值信息 5分钟,15分周期,只有部分时间段有K,D值输出,后面时间段无输出。但30分钟又有全部输出(2年),是有数据数量限制?

请提供能够复现的部分代码或者全部代码,你上面的代码是有内容的

您好是不是忘记做除数为0的异常处理了

回复:对比标准KDJ指标代码,没有写下面的代码,是因为这个导致?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)); }

回复:是,没有做无效值的异常处理

回复:加上KDJ指标完整代码后(未用回溯最大数代码,影响均线计算),KD值还是只有一半时间有输出,一半时间无(时间共2年多)。策略需要KD金叉死叉条件开仓。原油加权000指数。数据源0为5分钟,数据源1为1天(K图背景画出日线高低框柱)策略完整代码如下,请老师看看问题在哪?Params Numeric N1(20); // 均线周期N1 Numeric N2(80); // 均线周期N2 Numeric N3(420); Numeric M(4); //波峰波谷确认前后距离 Numeric M2(150); //计算周期 //============ ATR参数 ============= Numeric ATRLength(14); // ATR计算周期 Numeric MB(2);//目标ART倍数 Numeric ZS(2);//止损ART倍数 Numeric ZY(4);//止盈ART倍数 //============ 仓位参数 ============ Numeric Lots(1);//手数 Numeric RiskRatio(0.02); // 单笔风险比例(2%) Numeric ContractMultiplier(10); // 合约乘数(示例为螺纹钢) //============ 过滤参数 ============ Numeric VolN(5); // 成交量过滤天数 //=====KDJ===== Numeric FastLength(9); // KDJ快速线参数 Numeric SlowLength(3); // KDJ慢速线参数 Numeric SmoothLength(3); // KDJ慢速线参数 Vars //============ 指标变量 ============ Series<Numeric> MA1; // 快速MA Series<Numeric> MA2; // 慢速MA Series<Numeric> MA3; // 方向MA Series<Numeric> TR; // 真实波幅 Series<Numeric> atrValue; // ATR值 Series<Numeric> TPLineH; //高突破进场线 Series<Numeric> TPLineL; //低突破进场线 Series<Numeric> kValue; //KDJ K值 Series<Numeric> DValue; //KDJ D值 Series<Numeric> JValue; //KDJ J值 Series<Numeric> RSV; //KDJ RSV值 Series<Numeric> SwingHigh_0; //最近波峰价 Series<Numeric> SwingLow_0; //最近波谷价 Series<Numeric> SwingHigh_1; //前一波峰价 Series<Numeric> SwingLow_1; //前一波谷价 Series<Numeric> DayH; //日线最高价 Series<Numeric> DayL; //日线最低价 Series<Numeric>H60H; //小时线最高价 Series<Numeric>H60L; //小时线最低价 Series<Bool> UpTrend; // 上升趋势标志 Series<Bool> DnTrend; // 下降趋势标志 Series<Bool> UpTrend1; //趋势上1 Series<Bool> DnTrend1; //趋势下1 Series<Bool> UpTrend2; //趋势上2 Series<Bool> DnTrend2; //趋势下2 //============ 交易信号 ============ Series<Bool> trendLong; // 多头趋势条件 Series<Bool> trendShort; // 空头趋势条件 Series<Bool> KDOver; Series<Bool> KDUnder; //============ 仓位管理 ============ Numeric positionSize; // 计算手数 Numeric totalCapital(1000000); // 总资金(需根据实盘修改) //============划线显示============== Plot plt1; Plot plt2; Plot plt3; Plot plt4; Plot plt5; Plot plt6; Plot plt7; Plot plt8; Plot plt9; Plot plt10; Plot plt11; Defs Numeric SMAValue(Numeric Price,Numeric FastLength,Numeric Weight) { if(InvalidNumeric == Price || InvalidNumeric == FastLength || InvalidNumeric == Weight) { return InvalidNumeric; } return SMA(Price,FastLength,Weight); } Events //此处实现事件函数 //OnReady() //{ // SetBackBarMaxCount(1+Max(Max(Length,SlowLength),SmoothLength));//影响均线计算,忽略 //} OnInit() { plt3.setOption("MA1","color",White()); plt4.setOption("MA2","color",LightBrown()); plt7.setOption("MA3","color",LightBlue()); plt8.setOption("SwingHigh","color",Gray()); plt8.setOption("SwingHigh","line-display","interval"); plt8.setOption("SwingHigh","style",Enum_Dash); plt9.setOption("SwingLow","color",Brown()); plt9.setOption("SwingLow","line-display","interval"); plt9.setOption("SwingLow","style",Enum_Dash); plt10.setOption("dayH","color",Gray()); plt10.setOption("dayH","line-display","interval"); plt10.setOption("dayH","style",Enum_Dash); plt11.setOption("dayL","color",Gray()); plt11.setOption("dayL","line-display","interval"); plt11.setOption("dayL","style",Enum_Dash); } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { {//====== 指标计算 ====== //画出日线K的高低价柱线 (data[1]为日线) DayH=Data[1].high; DayL=Data[1].Low; //plt11.barv("DayL",date+time,DayH,DayL); PlotAuto("DayL",DayH,DayL,Rgb(60,60,60),Enum_BAR,Enum_Hollow); //均线MA1,MA2 MA3画线 { MA1 = Average(Close,N1); //小周期均线 MA2 = Average(Close,N2); //大周期均线 MA3 = Average(Close,N3); //方向周期 plt3.line("MA1",MA1);//画线小周期 plt4.line("MA2",MA2);//画线大周期 plt7.line("MA3",MA3);//画线方向周期 } // 计算真实波幅TR if (CurrentBar == 0) { TR = High - Low; }else { Numeric tr1 = High - Low; Numeric tr2 = Abs(High - Close[1]); Numeric tr3 = Abs(Low - Close[1]); TR = Max(tr1, Max(tr2, tr3)); } //计算ATR atrValue = Average(TR, ATRLength); //仓位计算 //positionSize = IntPart(totalCapital * RiskRatio / (atrValue * ContractMultiplier)); //positionSize = IIF(positionSize < 1, 1, positionSize); // 至少1手 //高低突破线计算 TPLineH=Highest(High[1],2); TPLineL=Lowest(Low[1],2); // 计算KDJ指标 RSV = (Close - Lowest(Low, FastLength)) / (Highest(High, FastLength) - Lowest(Low, FastLength)) * 100; KValue = SMA(RSV, SlowLength, 1); DValue = SMA(KValue, SmoothLength, 1); JValue = 3 * KValue - 2 * DValue; Commentary("kValue:"+Text(kValue)); //BAR输出K值信息 Commentary("DValue:"+Text(DValue)); //BAR输出D值信息 KDOver = CrossOver(KValue, DValue); Commentary(" KDOver:" + IIFString(KDOver, "1", "0"));//金叉,BAR输出 KDUnder = CrossUnder(KValue,DValue); Commentary(" KDUnder:" + IIFString(KDUnder, "1", "0"));//死叉,BAR输出 //最近一个及前一波峰波谷 SwingHigh_0=SwingHigh(1,High,M,M2); //最近的波峰 SwingLow_0=SwingLow(1,Low,M,M2); //最近的波谷 SwingHigh_1=SwingHigh(2,High,M,M2); //前1波峰 SwingLow_1=SwingLow(2,Low,M,M2); //前1波谷 Print("SwingHigh_1:"+Text(SwingHigh_1));//前1波峰控制台输出 Print("SwingLow_1:"+Text(SwingLow_1)); //前1波谷控制台输出 //画出波峰波谷 IF(SwingHigh_0>0)// && SwingHigh_0==SwingHigh_0[1]) plt8.line("SwingHigh",SwingHigh_0);//画波峰 IF(SwingLow_0>0)//&& SwingLow_0==SwingLow_0[1]) plt9.line("SwingLow",SwingLow_0);//画波谷 // 判断趋势方向 //UpTrend1= SwingLow_0 >= SwingLow_1 && High > SwingHigh_0 ; // 低点不创新低,突破前高点抬高 // DnTrend1= SwingHigh_0 <=SwingHigh_1 && Low < SwingLow_0 ; // 高点不创新高,跌破前低点 UpTrend2= MA2>MA2[1] Or MA1>=MA2 ; //MA2 向上。或20-80多方结构; DnTrend2= MA2<MA2[1] Or MA1<MA2 ; //MA2 向下。或20-80空方结构; UpTrend=UpTrend1 Or UpTrend2; //趋势上; DnTrend=DnTrend1 Or DnTrend2; //趋势下; Commentary(" UpTrend:" + IIFString(UpTrend, "1", "0"));//趋势上,BAR输出; Commentary(" DnTrend:" + IIFString(DnTrend, "1", "0"));//趋势下,BAR输出; } { //波峰波谷突破交易策略---------- // 开多条件 if (MarketPosition <>1 //&& Close[1] > MA2[1] //前K站上MA2 && MA1[1]> MA1[2] //MA1是上升的 && Close[1] > MA1[1] //前K站上MA1 && Close[1] > MA3[1] //前K站上MA3 && UpTrend[1] //趋势上 && ( Close[1]>SwingHigh_0[1] Or CrossOver(KValue[1],DValue[1]))) //前K收盘价突破波峰 或 KDJ指标K,D金叉 { Buy(Lots, Max(Close[1],Open)); } // 开空条件 if (MarketPosition <>-1 //&& Close[1] < MA2[1] //前K站MA2下, && MA1[1] < MA1[2] //MA1是下降的 && Close[1] < MA1[1] //前K站MA1下 && Close[1] < MA3[1] //前K站MA3下 && DnTrend[1] //趋势下 && (Close[1]<SwingLow_0[1] or CrossUnder(KValue[1],DValue[1]))) //前K收盘价跌破波谷 或 KDJ指标K,D死叉 { SellShort(Lots, Min(Close[1],Open)); } // 多单止损止盈 if (MarketPosition == 1 && CrossUnder(Low,SwingLow_0)) { Sell(0, SwingLow_0); } // 空单止损止盈 if (MarketPosition == -1 && CrossOver(High,SwingHigh_0)) { BuyToCover(0, SwingHigh_0); } } }

回复:"加上KDJ指标完整代码后"——你这句话是认真的吗???

回复:谢谢提醒。已加完整处理无效数据代码,解决了。😀👍

回复:解决了那我就不多说了