Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 3
0
        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());
        }