public override void FinishedLoadData(string contract, string cycle, List <BarData> barDatas, bool isLast) { if (contract == Setting.Contracts[0] && cycle == Setting.Cycles[0]) { kdj = new KDJ(barDatas, 9, 3, 3); } if (isLast) { StartStrategy(); } }
/// <summary> /// KDJ死叉 /// </summary> /// <returns></returns> bool CrossKdjDown(KDJ kdj) { var preDValue = kdj.GetDValue(kdj.Count - 2); var preJValue = kdj.GetJValue(kdj.Count - 2); var dValue = kdj.GetDValue(kdj.Count - 1); var jValue = kdj.GetJValue(kdj.Count - 1); if (!JPR.IsNaN(preDValue) && !JPR.IsNaN(preJValue) && !JPR.IsNaN(dValue) && !JPR.IsNaN(jValue)) { return(preJValue > preDValue && jValue < dValue); } return(false); }
public override void OnStrategyStart() { kdj = KDJ.create(Bars, 10, BarData.Close); kdj.Color = Color.Green; kdj.K.Color = Color.White; kdj.D.Color = Color.Yellow; Draw(kdj, 2); Draw(kdj.K, 2); Draw(kdj.D, 2); line80 = new HorizontalLine(Bars, 80); line80.Color = Color.Red; Draw(line80, 2); line20 = new HorizontalLine(Bars, 20); line20.Color = Color.Green; Draw(line20, 2); }
protected override void OnBar(Instrument instrument, Bar bar) { Bars.Add(bar); Log(bar, barsGroup); if (kdj.Count == 0) { return; } Log(kdj.KSeries.Last, kGroup); Log(kdj.DSeries.Last, dGroup); Log(kdj.Last, jGroup); Log(KDJ.K.Value(Bars, Bars.Count - 1, 10), k2Group); Log(KDJ.D.Value(Bars, Bars.Count - 1, 10), d2Group); Log(KDJ.Value(Bars, Bars.Count - 1, 10), j2Group); Console.WriteLine("{0}, {1}", kdj.LastDateTime, kdj.KSeries.Last); }
protected override void OnStrategyStart() { kdj = new KDJ(Bars, 10); AddGroups(); }
void updateKDJ(/*ref KLData kLData,*/ ref DateTime time, ref SortedList <DateTime, KLData> KLDataArr) { KLData kLData = KLDataArr[time]; const double N = 9, M1 = 3, M2 = 3; KDJ kdj = new KDJ(); double K = 0, D = 0, J = 0, RSV = 0; int index = KLDataArr.IndexOfKey(time); //Update MinMaxPirce double min = Double.MaxValue, max = Double.MinValue; for (int i = index; i >= 0 && i > index - N; i--) { //A slow way!! //var t = KLDataArr.ElementAt(i).Value; var t = KLDataArr.Values[i]; if (t.Low < min) { min = t.Low; } if (t.High > max) { max = t.High; } } if (index == 0 || Double.IsNaN(KLDataArr.Values[index - 1].kdj.K)) { RSV = (kLData.Close - min) / (max - min) * 100; K = (1 * RSV + (M1 - 1) * 0) / 1; D = (1 * K + (M2 - 1) * 0) / 1; J = 3 * K - 2 * D; } else { var okLData = KLDataArr.Values[index - 1]; RSV = (kLData.Close - min) / (max - min) * 100; K = (1 * RSV + (M1 - 1) * okLData.kdj.K) / M1; D = (1 * K + (M2 - 1) * okLData.kdj.D) / M2; J = 3 * K - 2 * D; //For other long timeBetween = kLData.sysTime.Ticks - okLData.sysTime.Ticks; kdj.crossPoint = Vector2.checkCrossPoint ( new Vector2(okLData.kdj.K, 0), new Vector2(K, timeBetween), new Vector2(okLData.kdj.J, 0), new Vector2(J, timeBetween) ); /*kdj.angle_KJ = * angleBetween(*/ } kdj.K = K; kdj.D = D; kdj.J = J; kdj.RSV = RSV; kLData.kdj = kdj; KLDataArr[time] = kLData; }