protected override void OnMouseMove(ChartMouseEventArgs obj) { if (_controllerLine == null) { return; } _controllerLine.Time2 = obj.TimeValue; _controllerLine.Y2 = obj.YValue; var startBarIndex = Chart.Bars.GetBarIndex(_controllerLine.Time1, Chart.Symbol); var barsNumber = _controllerLine.GetBarsNumber(Chart.Bars, Chart.Symbol); foreach (var level in _fibonacciLevels) { var levelLineName = GetObjectName(string.Format("Level_{0}", level.Percent.ToString(CultureInfo.InvariantCulture))); var barsAmount = barsNumber * level.Percent; var lineBarIndex = _controllerLine.Time2 > _controllerLine.Time1 ? startBarIndex + barsAmount : startBarIndex - barsAmount; var lineTime = Chart.Bars.GetOpenTime(lineBarIndex, Chart.Symbol); var levelLine = Chart.DrawVerticalLine(levelLineName, lineTime, level.LineColor, level.Thickness, level.Style); levelLine.IsInteractive = true; levelLine.IsLocked = true; } }
public static void RefelectOnOtherLine(this ChartTrendLine line, ChartTrendLine otherLine, Bars bars, Symbol symbol) { var onePercentFirstBarIndex = bars.GetBarIndex(otherLine.Time1, symbol); var zeroLineBarsDelta = line.GetBarsNumber(bars, symbol); var zeroLinePriceDelta = line.GetPriceDelta(); var zeroLineSlope = line.GetSlope(); double secondBarIndex, secondPrice; if (line.Time1 < line.Time2) { secondBarIndex = onePercentFirstBarIndex + zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? otherLine.Y1 + zeroLinePriceDelta : otherLine.Y1 - zeroLinePriceDelta; } else { secondBarIndex = onePercentFirstBarIndex - zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? otherLine.Y1 - zeroLinePriceDelta : otherLine.Y1 + zeroLinePriceDelta; } otherLine.Time2 = bars.GetOpenTime(secondBarIndex, symbol); otherLine.Y2 = secondPrice; }
private void UpdateFans(ChartTrendLine mainFan, ChartTrendLine handleLine, Dictionary <double, ChartTrendLine> fans) { var endBarIndex = Chart.Bars.GetBarIndex(mainFan.Time2, Chart.Symbol); var barsDelta = handleLine.GetBarsNumber(Chart.Bars, Chart.Symbol) / 2; var priceDelta = handleLine.GetPriceDelta() / 2; var slope = handleLine.GetSlope(); foreach (var fan in fans) { var fanSettings = SideFanSettings.FirstOrDefault(iSettings => iSettings.Percent == fan.Key); if (fanSettings == null) { continue; } var secondBarIndex = slope > 0 ? endBarIndex + barsDelta * fanSettings.Percent : endBarIndex - barsDelta * fanSettings.Percent; var secondTime = Chart.Bars.GetOpenTime(secondBarIndex, Chart.Symbol); var secondPrice = mainFan.Y2 + priceDelta * fanSettings.Percent; var fanLine = fan.Value; fanLine.Time1 = mainFan.Time1; fanLine.Time2 = secondTime; fanLine.Y1 = mainFan.Y1; fanLine.Y2 = secondPrice; } }
private void UpdateFibonacciLevels(ChartTrendLine mainLine, ChartTrendLine distanceLine, ChartVerticalLine[] verticalLines) { var startBarIndex = Chart.Bars.GetBarIndex(distanceLine.Time2, Chart.Symbol); var barsNumber = mainLine.GetBarsNumber(Chart.Bars, Chart.Symbol); foreach (var verticalLine in verticalLines) { double lineLevelPercent; if (!double.TryParse(verticalLine.Name.Split('_').Last(), NumberStyles.Any, CultureInfo.InvariantCulture, out lineLevelPercent)) { continue; } var level = _fibonacciLevels.FirstOrDefault(iLevel => iLevel.Percent == lineLevelPercent); if (level == null) { continue; } var barsAmount = barsNumber * level.Percent; var lineBarIndex = mainLine.Time2 > mainLine.Time1 ? startBarIndex + barsAmount : startBarIndex - barsAmount; verticalLine.Time = Chart.Bars.GetOpenTime(lineBarIndex, Chart.Symbol); } }
private void UpdateMedianLine(ChartTrendLine medianLine, ChartTrendLine handleLine) { var handleLineStartBarIndex = handleLine.GetStartBarIndex(Chart.Bars, Chart.Symbol); var handleLineBarsNumber = handleLine.GetBarsNumber(Chart.Bars, Chart.Symbol); medianLine.Time2 = Chart.Bars.GetOpenTime(handleLineStartBarIndex + handleLineBarsNumber / 2, Chart.Symbol); medianLine.Y2 = handleLine.GetBottomPrice() + handleLine.GetPriceDelta() / 2; }
private void UpdateMainFan(ChartTrendLine handleLine, ChartTrendLine mainFan) { var handleLineBarsNumber = handleLine.GetBarsNumber(Chart.Bars, Chart.Symbol); var mainFanLineSecondBarIndex = handleLine.GetStartBarIndex(Chart.Bars, Chart.Symbol) + handleLineBarsNumber / 2; mainFan.Time2 = Chart.Bars.GetOpenTime(mainFanLineSecondBarIndex, Chart.Symbol); mainFan.Y2 = handleLine.GetBottomPrice() + handleLine.GetPriceDelta() / 2; }
protected override void OnMouseMove(ChartMouseEventArgs obj) { if (MouseUpNumber < 2 || _handleLine == null) { base.OnMouseMove(obj); return; } _handleLine.Time2 = obj.TimeValue; _handleLine.Y2 = obj.YValue; var handleLineBarsNumber = _handleLine.GetBarsNumber(Chart.Bars, Chart.Symbol); var mainFanLineSecondBarIndex = _handleLine.GetStartBarIndex(Chart.Bars, Chart.Symbol) + handleLineBarsNumber / 2; MainFanLine.Time2 = Chart.Bars.GetOpenTime(mainFanLineSecondBarIndex, Chart.Symbol); MainFanLine.Y2 = _handleLine.GetBottomPrice() + _handleLine.GetPriceDelta() / 2; DrawSideFans(MainFanLine); }
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); } } }
protected virtual void UpdateSideFans(ChartTrendLine mainFan, Dictionary <double, ChartTrendLine> sideFans) { 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 mainFanPriceDelta = mainFan.GetPriceDelta(); for (var iFan = 0; iFan < SideFanSettings.Length; iFan++) { var fanSettings = SideFanSettings[iFan]; double y2; DateTime time2; if (fanSettings.Percent < 0) { var yAmount = mainFanPriceDelta * Math.Abs(fanSettings.Percent); y2 = mainFan.Y2 > mainFan.Y1 ? mainFan.Y2 - yAmount : mainFan.Y2 + yAmount; time2 = mainFan.Time2; } else { y2 = mainFan.Y2; var barsPercent = barsNumber * fanSettings.Percent; var barIndex = mainFan.Time2 > mainFan.Time1 ? endBarIndex - barsPercent : startBarIndex + barsPercent; time2 = Chart.Bars.GetOpenTime(barIndex, Chart.Symbol); } ChartTrendLine fanLine; if (!sideFans.TryGetValue(fanSettings.Percent, out fanLine)) { continue; } fanLine.Time1 = mainFan.Time1; fanLine.Time2 = time2; fanLine.Y1 = mainFan.Y1; fanLine.Y2 = y2; } }
protected virtual void DrawSideFans(ChartTrendLine mainFan) { 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 mainFanPriceDelta = mainFan.GetPriceDelta(); for (var iFan = 0; iFan < SideFanSettings.Length; iFan++) { var fanSettings = SideFanSettings[iFan]; double y2; DateTime time2; if (fanSettings.Percent < 0) { var yAmount = mainFanPriceDelta * Math.Abs(fanSettings.Percent); y2 = mainFan.Y2 > mainFan.Y1 ? mainFan.Y2 - yAmount : mainFan.Y2 + yAmount; time2 = mainFan.Time2; } else { y2 = mainFan.Y2; var barsPercent = barsNumber * fanSettings.Percent; var barIndex = mainFan.Time2 > mainFan.Time1 ? endBarIndex - barsPercent : startBarIndex + barsPercent; time2 = Chart.Bars.GetOpenTime(barIndex, Chart.Symbol); } var objectName = GetObjectName(string.Format("SideFan_{0}", fanSettings.Percent)); var trendLine = Chart.DrawTrendLine(objectName, mainFan.Time1, mainFan.Y1, time2, y2, fanSettings.Color, fanSettings.Thickness, fanSettings.Style); trendLine.IsInteractive = true; trendLine.IsLocked = true; trendLine.ExtendToInfinity = true; SideFanLines[fanSettings.Percent] = trendLine; } }
private void UpdateHandleLine(ChartTrendLine handleLine, ChartTrendLine mainFan) { var mainFanSecondBarIndex = Chart.Bars.GetBarIndex(mainFan.Time2, Chart.Symbol); var handleLineHalfBarsNumber = handleLine.GetBarsNumber(Chart.Bars, Chart.Symbol) / 2; var firstBarIndex = mainFanSecondBarIndex - handleLineHalfBarsNumber; var secondBarIndex = mainFanSecondBarIndex + handleLineHalfBarsNumber; handleLine.Time1 = Chart.Bars.GetOpenTime(firstBarIndex, Chart.Symbol); handleLine.Time2 = Chart.Bars.GetOpenTime(secondBarIndex, Chart.Symbol); var handleLineHalfPriceDelta = handleLine.GetPriceDelta() / 2; var handleLineSlope = handleLine.GetSlope(); handleLine.Y1 = handleLineSlope > 0 ? mainFan.Y2 - handleLineHalfPriceDelta : mainFan.Y2 + handleLineHalfPriceDelta; handleLine.Y2 = handleLineSlope > 0 ? mainFan.Y2 + handleLineHalfPriceDelta : mainFan.Y2 - handleLineHalfPriceDelta; }
protected override void OnMouseMove(ChartMouseEventArgs obj) { if (MouseUpNumber == 1) { _zeroLine.Time2 = obj.TimeValue; _zeroLine.Y2 = obj.YValue; } else if (MouseUpNumber == 2 && _zeroLine != null) { var onePercentLineName = GetObjectName("OnePercentLine"); var onePercentFirstBarIndex = Chart.Bars.GetBarIndex(obj.TimeValue, Chart.Symbol); var zeroLineBarsDelta = _zeroLine.GetBarsNumber(Chart.Bars, Chart.Symbol); var zeroLinePriceDelta = _zeroLine.GetPriceDelta(); var zeroLineSlope = _zeroLine.GetSlope(); double secondBarIndex, secondPrice; if (_zeroLine.Time1 < _zeroLine.Time2) { secondBarIndex = onePercentFirstBarIndex + zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? obj.YValue + zeroLinePriceDelta : obj.YValue - zeroLinePriceDelta; } else { secondBarIndex = onePercentFirstBarIndex - zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? obj.YValue - zeroLinePriceDelta : obj.YValue + zeroLinePriceDelta; } _onePercentLine = Chart.DrawTrendLine(onePercentLineName, obj.TimeValue, obj.YValue, Chart.Bars.GetOpenTime(secondBarIndex, Chart.Symbol), secondPrice, Color, 1, LineStyle.Dots); _onePercentLine.IsInteractive = true; var levellines = DrawFibonacciLevels(_zeroLine, _onePercentLine, zeroLineSlope, Id); foreach (var levelLine in levellines) { _otherLevelLines[levelLine.Key] = levelLine.Value; } } }
private void DrawFibonacciLevels() { var startBarIndex = Chart.Bars.GetBarIndex(_distanceLine.Time2, Chart.Symbol); var barsNumber = _mainLine.GetBarsNumber(Chart.Bars, Chart.Symbol); foreach (var level in _fibonacciLevels) { var levelLineName = GetObjectName(string.Format("Level_{0}", level.Percent.ToString(CultureInfo.InvariantCulture))); var barsAmount = barsNumber * level.Percent; var lineBarIndex = _mainLine.Time2 > _mainLine.Time1 ? startBarIndex + barsAmount : startBarIndex - barsAmount; var lineTime = Chart.Bars.GetOpenTime(lineBarIndex, Chart.Symbol); var levelLine = Chart.DrawVerticalLine(levelLineName, lineTime, level.LineColor, level.Thickness, level.Style); levelLine.IsInteractive = true; levelLine.IsLocked = true; } }
private Dictionary <double, ChartTrendLine> DrawFibonacciLevels(ChartTrendLine zeroLine, ChartTrendLine onePercentLine, double zeroLineSlope, long id, bool updateMainLineStlyes = true) { var zeroFirstBarIndex = Chart.Bars.GetBarIndex(zeroLine.Time1, Chart.Symbol); var zeroSecondBarIndex = Chart.Bars.GetBarIndex(zeroLine.Time2, Chart.Symbol); var onePercentFirstBarIndex = Chart.Bars.GetBarIndex(onePercentLine.Time1, Chart.Symbol); var barsDelta = Math.Abs(zeroFirstBarIndex - onePercentFirstBarIndex); var priceDelta = Math.Abs(zeroLine.Y1 - onePercentLine.Y1); var zeroLineBarsDelta = zeroLine.GetBarsNumber(Chart.Bars, Chart.Symbol); var zeroLinePriceDelta = zeroLine.GetPriceDelta(); var result = new Dictionary <double, ChartTrendLine>(); foreach (var level in _fibonacciLevels) { if (level.Percent == 0 && updateMainLineStlyes) { zeroLine.Color = level.LineColor; zeroLine.Thickness = level.Thickness; zeroLine.LineStyle = level.Style; } else if (level.Percent == 1 && updateMainLineStlyes) { onePercentLine.Color = level.LineColor; onePercentLine.Thickness = level.Thickness; onePercentLine.LineStyle = level.Style; } else { var levelName = GetObjectName(string.Format("Level_{0}", level.Percent.ToString(CultureInfo.InvariantCulture)), id); var barsAmount = barsDelta * level.Percent; var priceAmount = priceDelta * level.Percent; double firstBarIndex, secondBarIndex, firstPrice, secondPrice; if (onePercentLine.Time1 < zeroLine.Time1) { firstPrice = onePercentLine.Y1 > zeroLine.Y1 ? zeroLine.Y1 + priceAmount : zeroLine.Y1 - priceAmount; if (zeroLine.Time1 < zeroLine.Time2) { firstBarIndex = zeroFirstBarIndex - barsAmount; secondBarIndex = firstBarIndex + zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? firstPrice + zeroLinePriceDelta : firstPrice - zeroLinePriceDelta; } else { firstBarIndex = zeroFirstBarIndex - barsAmount; secondBarIndex = firstBarIndex - zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? firstPrice - zeroLinePriceDelta : firstPrice + zeroLinePriceDelta; } } else { firstPrice = onePercentLine.Y1 > zeroLine.Y1 ? zeroLine.Y1 + priceAmount : zeroLine.Y1 - priceAmount; if (zeroLine.Time1 < zeroLine.Time2) { firstBarIndex = zeroFirstBarIndex + barsAmount; secondBarIndex = firstBarIndex + zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? firstPrice + zeroLinePriceDelta : firstPrice - zeroLinePriceDelta; } else { firstBarIndex = zeroFirstBarIndex + barsAmount; secondBarIndex = firstBarIndex - zeroLineBarsDelta; secondPrice = zeroLineSlope > 0 ? firstPrice - zeroLinePriceDelta : firstPrice + zeroLinePriceDelta; } } var firstTime = Chart.Bars.GetOpenTime(firstBarIndex, Chart.Symbol); var secondTime = Chart.Bars.GetOpenTime(secondBarIndex, Chart.Symbol); var levelLine = Chart.Objects.FirstOrDefault(iObject => iObject.Name.Equals(levelName, StringComparison.OrdinalIgnoreCase)) as ChartTrendLine; if (levelLine != null) { levelLine.Time1 = firstTime; levelLine.Time2 = secondTime; levelLine.Y1 = firstPrice; levelLine.Y2 = secondPrice; } else { levelLine = Chart.DrawTrendLine(levelName, firstTime, firstPrice, secondTime, secondPrice, level.LineColor, level.Thickness, level.Style); } levelLine.IsInteractive = true; levelLine.IsLocked = true; result.Add(level.Percent, levelLine); } } return(result); }