private void DrawLevels(ChartTrendLine mainLine)
        {
            var verticalDelta = mainLine.GetPriceDelta();

            var previousLevelPrice = double.NaN;

            FibonacciLevel previousLevel = null;

            var startTime = mainLine.GetStartTime();
            var endTime   = mainLine.GetEndTime();

            foreach (var level in _levels)
            {
                var levelAmount = level.Percent == 0 ? 0 : verticalDelta * level.Percent;

                var levelLineName = GetObjectName(string.Format("LevelLine_{0}", level.Percent));

                var price = mainLine.Y2 > mainLine.Y1 ? mainLine.Y2 - levelAmount : mainLine.Y2 + levelAmount;

                var lineColor = level.IsFilled ? level.LineColor : level.FillColor;

                var levelLine = Chart.DrawTrendLine(levelLineName, startTime, price, endTime, price, lineColor, level.Thickness, level.Style);

                levelLine.IsInteractive    = true;
                levelLine.IsLocked         = true;
                levelLine.ExtendToInfinity = level.ExtendToInfinity;

                _levelLines[level.Percent] = levelLine;

                if (previousLevel == null)
                {
                    previousLevelPrice = price;

                    previousLevel = level;

                    continue;
                }

                var levelRectangleName = GetObjectName(string.Format("LevelRectangle_{0}", level.Percent));

                var rectangle = Chart.DrawRectangle(levelRectangleName, startTime, previousLevelPrice, endTime, price, level.FillColor, 0);

                rectangle.IsFilled = level.IsFilled;

                rectangle.IsInteractive = true;
                rectangle.IsLocked      = true;

                if (level.ExtendToInfinity)
                {
                    rectangle.Time2 = rectangle.Time2.AddMonths(100);
                }

                previousLevelPrice = price;
                previousLevel      = level;
            }
        }
Beispiel #2
0
        public static double GetBarsNumber(this ChartTrendLine line, Bars bars, Symbol symbol)
        {
            var startX = line.GetStartTime();
            var endX   = line.GetEndTime();

            var startBarIndex = bars.GetBarIndex(startX, symbol);
            var endBarIndex   = bars.GetBarIndex(endX, symbol);

            return(Math.Round(endBarIndex - startBarIndex, 2));
        }
Beispiel #3
0
        private void DrawOrUpdateVerticalLines(ChartTrendLine mainFan, Dictionary <double, ChartTrendLine> verticalLines)
        {
            var startBarIndex = mainFan.GetStartBarIndex(Chart.Bars, Chart.Symbol);
            var endBarIndex   = mainFan.GetEndBarIndex(Chart.Bars, Chart.Symbol);

            var barsNumber = mainFan.GetBarsNumber(Chart.Bars, Chart.Symbol);

            var rectangleEndTime = mainFan.GetEndTime();

            for (int i = 0; i < _settings.SideFanSettings.Length; i++)
            {
                var fanSettings = _settings.SideFanSettings[i];

                if (fanSettings.Percent < 0)
                {
                    continue;
                }

                var lineLevel = fanSettings.Percent * barsNumber;

                var barIndex = mainFan.Time1 > mainFan.Time2 ? startBarIndex + lineLevel : endBarIndex - lineLevel;

                var time = Chart.Bars.GetOpenTime(barIndex, Chart.Symbol);

                if (time > rectangleEndTime)
                {
                    time = rectangleEndTime;
                }

                ChartTrendLine line;

                if (verticalLines.TryGetValue(fanSettings.Percent, out line))
                {
                    line.Time1 = time;
                    line.Time2 = time;

                    line.Y1 = mainFan.Y1;
                    line.Y2 = mainFan.Y2;
                }
                else if (_settings.ShowTimeLevels)
                {
                    var objectName = GetObjectName(string.Format("VerticalLine_{0}", fanSettings.Percent.ToString(CultureInfo.InvariantCulture)));

                    line = Chart.DrawTrendLine(objectName, time, mainFan.Y1, time, mainFan.Y2, _settings.TimeLevelsColor, _settings.TimeLevelsThickness, _settings.TimeLevelsStyle);

                    line.IsInteractive = true;
                    line.IsLocked      = true;

                    verticalLines.Add(fanSettings.Percent, line);
                }
            }
        }
Beispiel #4
0
        private void DrawOrUpdateHorizontalLines(ChartTrendLine mainFan, Dictionary <double, ChartTrendLine> horizontalLines)
        {
            var startTime = mainFan.GetStartTime();
            var endTime   = mainFan.GetEndTime();

            var verticalDelta = mainFan.GetPriceDelta();

            for (int i = 0; i < _settings.SideFanSettings.Length; i++)
            {
                var fanSettings = _settings.SideFanSettings[i];

                if (fanSettings.Percent > 0)
                {
                    continue;
                }

                var absolutePercent = Math.Abs(fanSettings.Percent);

                var lineLevel = absolutePercent * verticalDelta;

                var level = mainFan.Y2 > mainFan.Y1 ? mainFan.Y2 - lineLevel : mainFan.Y2 + lineLevel;

                ChartTrendLine line;

                if (horizontalLines.TryGetValue(absolutePercent, out line))
                {
                    line.Time1 = startTime;
                    line.Time2 = endTime;

                    line.Y1 = level;
                    line.Y2 = level;
                }
                else if (_settings.ShowPriceLevels)
                {
                    var objectName = GetObjectName(string.Format("HorizontalLine_{0}", absolutePercent.ToString(CultureInfo.InvariantCulture)));

                    line = Chart.DrawTrendLine(objectName, startTime, level, endTime, level, _settings.PriceLevelsColor, _settings.PriceLevelsThickness, _settings.PriceLevelsStyle);

                    line.IsInteractive = true;
                    line.IsLocked      = true;

                    horizontalLines.Add(absolutePercent, line);
                }
            }
        }
Beispiel #5
0
        public static double GetSlope(this ChartTrendLine line)
        {
            var startTime = line.GetStartTime();
            var endTime   = line.GetEndTime();

            double startPrice, endPrice;

            if (line.Time1 < line.Time2)
            {
                startPrice = line.Y1;
                endPrice   = line.Y2;
            }
            else
            {
                startPrice = line.Y2;
                endPrice   = line.Y1;
            }

            return((endPrice - startPrice) / (endTime.Ticks - startTime.Ticks));
        }
        private void UpdatePattern(ChartTrendLine mainLine, IOrderedEnumerable <KeyValuePair <double, ChartTrendLine> > levelLines, Dictionary <double, ChartRectangle> levelRectangles, ChartObject updatedChartObject)
        {
            var verticalDelta = mainLine.GetPriceDelta();

            var previousLevelPrice = double.NaN;

            FibonacciLevel previousLevel = null;

            var startTime = mainLine.GetStartTime();
            var endTime   = mainLine.GetEndTime();

            foreach (var levelLine in levelLines)
            {
                var percent = levelLine.Key;

                var level = _levels.FirstOrDefault(iLevel => iLevel.Percent == percent);

                if (level == null)
                {
                    continue;
                }

                var levelAmount = percent == 0 ? 0 : verticalDelta * percent;

                var price = mainLine.Y2 > mainLine.Y1 ? mainLine.Y2 - levelAmount : mainLine.Y2 + levelAmount;

                levelLine.Value.Time1 = startTime;
                levelLine.Value.Time2 = endTime;

                levelLine.Value.Y1 = price;
                levelLine.Value.Y2 = price;

                if (previousLevel == null)
                {
                    previousLevelPrice = price;

                    previousLevel = level;

                    continue;
                }

                ChartRectangle levelRectangle;

                if (levelRectangles.TryGetValue(level.Percent, out levelRectangle))
                {
                    if (levelLine.Value == updatedChartObject)
                    {
                        levelRectangle.Color = Color.FromArgb(level.FillColor.A, levelLine.Value.Color);
                    }
                    else if (levelRectangle == updatedChartObject)
                    {
                        levelLine.Value.Color = Color.FromArgb(level.LineColor.A, levelRectangle.Color);
                    }
                }

                ChartRectangle previousLevelRectangle;

                if (!levelRectangles.TryGetValue(previousLevel.Percent, out previousLevelRectangle))
                {
                    continue;
                }

                previousLevelRectangle.Time1 = startTime;

                previousLevelRectangle.Time2 = previousLevel.ExtendToInfinity ? endTime.AddMonths(100) : endTime;

                previousLevelRectangle.Y1 = previousLevelPrice;
                previousLevelRectangle.Y2 = price;

                previousLevelPrice = price;
                previousLevel      = level;
            }
        }
Beispiel #7
0
 public static TimeSpan GetTimeDelta(this ChartTrendLine line)
 {
     return(line.GetEndTime() - line.GetStartTime());
 }
Beispiel #8
0
 public static double GetEndBarIndex(this ChartTrendLine line, Bars bars, Symbol symbol)
 {
     return(bars.GetBarIndex(line.GetEndTime(), symbol));
 }