/// <summary> /// Constructs the pair dictionary. /// </summary> /// <param name="primary">The primary.</param> /// <param name="secondary">The secondary.</param> /// <returns></returns> public static ProjectionDictionary ConstructPairDictionary(IEnumerable <SpaceDocumentModel> primary, IEnumerable <SpaceDocumentModel> secondary) { ProjectionDictionary output = new ProjectionDictionary(); var primaryIndex = primary.ToIndex(); var secondaryIndex = secondary.ToIndex(); foreach (string k in primaryIndex.Keys) { if (secondaryIndex.ContainsKey(k)) { ProjectionPair pair = new ProjectionPair(); pair.primary = primaryIndex[k]; pair.secondary = secondaryIndex[k]; pair.AssignedID = k; output.Add(k, pair); } } return(output); }
/// <summary> /// от двух пар последних точек ЗЗ построить проекции /// </summary> public void BuildSeries(ChartControl chart) { spans.data.Clear(); //spans.ExtendYAxis = ExtendChartBounds; // получить точки Зиг-Зага var pivots = ZigZag.GetPivots(chart.StockSeries.Data.Candles, ThresholdPercent, ZigZagSourceType); if (pivots.Count < 3) { return; } // построить проекции var pointA = pivots[pivots.Count - 3]; var pointB = pivots[pivots.Count - 2]; var pointC = pivots[pivots.Count - 1]; var spanA = new ProjectionPair(pointA.index, pointA.price) { HideFarParts = false, Color = pointB.price > pointA.price ? ColorLineLower : ColorLineUpper, ProjectionLength = ProjectionBars, LevelsProj = LevelsProj, Markers = Markers }; spanA.AddPoint(pointB.index, pointB.price); var spanB = new ProjectionPair(pointB.index, pointB.price) { HideFarParts = false, Color = pointB.price < pointA.price ? ColorLineLower : ColorLineUpper, ProjectionLength = ProjectionBars, LevelsProj = LevelsProj, Markers = Markers }; spanB.AddPoint(pointC.index, pointC.price); spans.data.Add(spanA); spans.data.Add(spanB); // коррекции? if (!CorrectionEnabled) { return; } if (correctionBcLength > 0) { var spanC = new ProjectionPair(pointB.index, pointB.price) { HideFarParts = false, Color = pointB.price < pointA.price ? ColorLineLower : ColorLineUpper, ProjectionLength = CorrectionBcLength, LevelsCorr = LevelsCorr, IsExtension = false, IsCorrection = true, Markers = Markers }; spanC.AddPoint(pointC.index, pointC.price); spans.data.Add(spanC); } if (correctionAbLength > 0) { var spanC = new ProjectionPair(pointA.index, pointA.price) { HideFarParts = false, Color = pointB.price < pointA.price ? ColorLineLower : ColorLineUpper, ProjectionLength = CorrectionAbLength, LevelsCorr = LevelsCorr, IsExtension = false, IsCorrection = true, Markers = Markers }; spanC.AddPoint(pointB.index, pointB.price); spans.data.Add(spanC); } }
private void MakeFiboProj(List <ExtremumPair> pivotPairs) { if (pivotPairs.Count == 0) { return; } var candles = owner.StockSeries.Data.Candles; if (candles.Count == 0) { return; } var fiboLevels = /*IsCorrection ? fiboCorrections : */ fiboProjections; var threasholdAbs = DalSpot.Instance.GetAbsValue(owner.Symbol, (float)fiboThreashold); // массив "оценок попаданий" var levelGrades = new Dictionary <int, int>(); for (var i = 0; i < fiboLevels.Length; i++) { levelGrades.Add(i, 0); } // разобрать уровни на "расширения" и коррекции var levelsExt = fiboLevels.Where(l => l >= 1).Select(l => l - 1).ToArray(); var levelsCorr = fiboLevels.Where(l => l < 1).ToArray(); foreach (var pair in pivotPairs) { var a = pair.start; var b = pair.end; // получить массив "уровней" var delta = a.b - b.b; var levels = fiboLevels.Select(proj => b.b + delta * proj).ToList(); // пройтись по свечкам до fiboProjLength и найти самый верхний "затронутый" уровень var lastCandle = b.a + fiboProjLength; lastCandle = lastCandle > candles.Count ? candles.Count : lastCandle; // 1 - проекции строятся вверх, -1 - вниз var fiboDir = a.b > b.b ? 1 : -1; var reachedLevel = GetFiboLevelReached( b.a + 1, lastCandle, levels, threasholdAbs, fiboDir, levelGrades); if (reachedLevel == -1) { continue; // расширение не строится } // проверить, не добавлен ли такой же уровень var spanAdded = false; foreach (var existedSpan in seriesProj.data) { if (existedSpan.points.Count == 2) { if (existedSpan.points[0].a == a.a && existedSpan.points[0].b == a.b && existedSpan.points[1].a == b.a && existedSpan.points[1].b == b.b) { spanAdded = true; break; } } } if (spanAdded) { continue; } // новая проекция var span = new ProjectionPair { IsExtension = true, IsCorrection = true, Color = LineColor, ProjectionLength = fiboProjLength, levelsCorr = levelsCorr, levelsProj = levelsExt, HideFarParts = HideFailed, Owner = seriesProj, HideLine = HideProjLine }; span.points.Add(new Cortege2 <int, float> { a = a.a, b = a.b }); span.points.Add(new Cortege2 <int, float> { a = b.a, b = b.b }); span.CalculateProjections(); span.Name = string.Format("{0} {1} ({2} {3}%)", Localizer.GetString("TitleFibonacciProjectionShort"), seriesProj.data.Count + 1, Localizer.GetString("TitleZigzagShort"), ThresholdPercent); seriesProj.data.Add(span); } // вывести оценки в лог //owner.Owner.LogMessage(string.Format("ЗигЗаг: оценка уровней Фибо - {0} ", // levelGrades.Sum(pair => pair.Value))); //var gradeBuilder = new StringBuilder(); //for (var i = 0; i < fiboProjections.Length; i++) //{ // gradeBuilder.AppendFormat("[{0:f3} : {1}] ", // fiboProjections[i], levelGrades[i]); //} //owner.Owner.LogMessage(gradeBuilder.ToString()); }