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; } }
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)); }
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); } } }
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); } } }
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; } }
public static TimeSpan GetTimeDelta(this ChartTrendLine line) { return(line.GetEndTime() - line.GetStartTime()); }
public static double GetEndBarIndex(this ChartTrendLine line, Bars bars, Symbol symbol) { return(bars.GetBarIndex(line.GetEndTime(), symbol)); }