private void GenerateKDJ(int i) { BarData curData = null; if (i >= barDatas.Count) { curData = GetBarData(0); } else { curData = barDatas[i]; } HighestH = HH.AddValue(curData.High); LowestL = LL.AddValue(curData.Low); if (HighestH - LowestL == 0) { Rsv = preRsv; valueDict["K"].Add(JPR.NaN); valueDict["D"].Add(JPR.NaN); valueDict["J"].Add(JPR.NaN); if (!IsSimpleMode) { graphDict["K"].AddValue(JPR.NaN, Color.White); graphDict["D"].AddValue(JPR.NaN, Color.Yellow); graphDict["J"].AddValue(JPR.NaN, Color.Magenta); } } else { Rsv = 100 * (curData.Close - LowestL) / (HighestH - LowestL); if (!init) { if (thisK != JPR.NaN) { preK = thisK; thisK = preK * (_ma1 - 1) / _ma1 + Rsv * 1 / _ma1; if (DList.Count < _ma2) { DList.Add(thisK); } } if (!initK) { if (KList.Count < _ma1) { KList.Add(Rsv); } if (KList.Count == _ma1) { initK = true; thisK = KList.Average(); DList.Add(thisK); } } if (DList.Count > 0 && DList.Count == _ma2) { thisD = DList.Average(); init = true; } Rsv = JPR.NaN; valueDict["K"].Add(JPR.NaN); valueDict["D"].Add(JPR.NaN); valueDict["J"].Add(JPR.NaN); if (!IsSimpleMode) { graphDict["K"].AddValue(JPR.NaN, Color.White); graphDict["D"].AddValue(JPR.NaN, Color.Yellow); graphDict["J"].AddValue(JPR.NaN, Color.Magenta); } } else { preK = thisK; thisK = preK * (_ma1 - 1) / _ma1 + Rsv * 1 / _ma1; preD = thisD; thisD = preD * (_ma2 - 1) / _ma2 + thisK * 1 / _ma2; thisJ = 3 * thisK - 2 * thisD; valueDict["K"].Add(thisK); valueDict["D"].Add(thisD); valueDict["J"].Add(thisJ); if (!IsSimpleMode) { graphDict["K"].AddValue(thisK, Color.White); graphDict["D"].AddValue(thisD, Color.Yellow); graphDict["J"].AddValue(thisJ, Color.Magenta); } } } preRsv = Rsv; }