protected override void OnDrawingStopped() { _rectangle = null; _horizontalTrendLines = null; _verticalTrendLines = null; _fans.Clear(); }
public static double GetPriceToBarsRatio(this ChartRectangle rectangle, Bars bars, Symbol symbol) { var verticalDelta = rectangle.GetPriceDelta(); var barsNumnber = rectangle.GetBarsNumber(bars, symbol); return(Math.Round(verticalDelta / barsNumnber, 10)); }
private void _setSelectedStartEndIndex(ChartRectangle rectangle) { var index1 = Bars.OpenTimes.GetIndexByTime(rectangle.Time1); var index2 = Bars.OpenTimes.GetIndexByTime(rectangle.Time2); SelectedStartBarIndex = Math.Min(index1, index2); SelectedEndBarIndex = Math.Max(index1, index2); }
public static double GetBarsNumber(this ChartRectangle rectangle, Bars bars, Symbol symbol) { var startX = rectangle.GetStartTime(); var endX = rectangle.GetEndTime(); var startBarIndex = bars.GetBarIndex(startX, symbol); var endBarIndex = bars.GetBarIndex(endX, symbol); return(Math.Round(endBarIndex - startBarIndex, 2)); }
protected override void OnDrawingStopped() { base.OnDrawingStopped(); _rectangle = null; _extendedHorizontalLine = null; _extendedVerticalLine = null; _horizontalTrendLines.Clear(); _verticalTrendLines.Clear(); }
private void DrawOrUpdateHorizontalLines(ChartRectangle rectangle, ChartTrendLine[] horizontalLines) { DateTime startTime, endTime; if (rectangle.Time1 < rectangle.Time2) { startTime = rectangle.Time1; endTime = rectangle.Time2; } else { startTime = rectangle.Time2; endTime = rectangle.Time1; } var diff = Math.Abs(rectangle.Y2 - rectangle.Y1); var lineLevels = new double[] { diff * 0.25, diff * 0.382, diff * 0.5, diff * 0.618, diff * 0.75 }; for (int i = 0; i < lineLevels.Length; i++) { var level = rectangle.Y2 > rectangle.Y1 ? rectangle.Y1 + lineLevels[i] : rectangle.Y1 - lineLevels[i]; var horizontalLine = horizontalLines[i]; if (horizontalLine == null) { var objectName = GetObjectName(string.Format("HorizontalLine{0}", i + 1)); horizontalLines[i] = Chart.DrawTrendLine(objectName, startTime, level, endTime, level, _settings.PriceLevelsColor, _settings.PriceLevelsThickness, _settings.PriceLevelsStyle); horizontalLines[i].IsInteractive = true; horizontalLines[i].IsLocked = true; } else { horizontalLine.Time1 = startTime; horizontalLine.Time2 = endTime; horizontalLine.Y1 = level; horizontalLine.Y2 = level; } } }
protected override void OnMouseUp(ChartMouseEventArgs obj) { if (_rectangle == null) { var name = GetObjectName("Rectangle"); _rectangle = Chart.DrawRectangle(name, obj.TimeValue, obj.YValue, obj.TimeValue, obj.YValue, _settings.RectangleColor, _settings.RectangleThickness, _settings.RectangleStyle); _rectangle.IsInteractive = true; _rectangle.IsLocked = true; } base.OnMouseUp(obj); }
private void DrawOrUpdateVerticalLines(ChartRectangle rectangle, ChartTrendLine[] verticalLines) { var startBarIndex = rectangle.GetStartBarIndex(Chart.Bars, Chart.Symbol); var barsNumber = rectangle.GetBarsNumber(Chart.Bars, Chart.Symbol); var lineLevels = new double[] { barsNumber * 0.2, barsNumber * 0.4, barsNumber * 0.6, barsNumber * 0.8, }; var rectangleEndTime = rectangle.GetEndTime(); for (int i = 0; i < lineLevels.Length; i++) { var barIndex = startBarIndex + lineLevels[i]; var time = Chart.Bars.GetOpenTime(barIndex, Chart.Symbol); if (time > rectangleEndTime) { time = rectangleEndTime; } var verticalLine = verticalLines[i]; if (verticalLine == null) { var objectName = GetObjectName(string.Format("VerticalLine{0}", i + 1)); verticalLines[i] = Chart.DrawTrendLine(objectName, time, rectangle.Y1, time, rectangle.Y2, _settings.TimeLevelsColor, _settings.TimeLevelsThickness, _settings.TimeLevelsStyle); verticalLines[i].IsInteractive = true; verticalLines[i].IsLocked = true; } else { verticalLine.Time1 = time; verticalLine.Time2 = time; verticalLine.Y1 = rectangle.Y1; verticalLine.Y2 = rectangle.Y2; } } }
private void _chart_MouseUp(ChartMouseEventArgs obj) { Chart.IsScrollingEnabled = true; if (SelectRectangle != null) { _setSelectedStartEndIndex(SelectRectangle); Chart.RemoveObject(SelectRectangle.Name); SelectRectangle = null; if (SelectedStartBarIndex >= 0 && SelectedEndBarIndex >= 0) { _openDrawingDialog(obj.MouseX, obj.MouseY); } } }
private void _chart_MouseDown(ChartMouseEventArgs obj) { if (DrawingDialog.IsVisible) { _closeDrawingDialog(); } if (obj.CtrlKey) { Chart.IsScrollingEnabled = false; SelectRectangle = _createDragRectangle(obj.TimeValue); } else if (obj.ShiftKey) { _removeAllObject_Click(null); } }
protected override void OnMouseUp(ChartMouseEventArgs obj) { if (MouseUpNumber == 2) { FinishDrawing(); return; } if (_rectangle == null) { var name = GetObjectName("Rectangle"); _rectangle = Chart.DrawRectangle(name, obj.TimeValue, obj.YValue, obj.TimeValue, obj.YValue, _settings.RectangleColor, _settings.RectangleThickness, _settings.RectangleStyle); _rectangle.IsInteractive = true; } }
private void DrawOrUpdateHorizontalLines(ChartRectangle rectangle, ChartTrendLine[] horizontalLines) { var startTime = rectangle.GetStartTime(); var endTime = rectangle.GetEndTime(); var verticalDelta = rectangle.GetPriceDelta(); var lineLevels = new double[] { verticalDelta * 0.2, verticalDelta * 0.4, verticalDelta * 0.6, verticalDelta * 0.8, }; for (int i = 0; i < lineLevels.Length; i++) { var level = rectangle.Y2 > rectangle.Y1 ? rectangle.Y1 + lineLevels[i] : rectangle.Y1 - lineLevels[i]; var horizontalLine = horizontalLines[i]; if (horizontalLine == null) { var objectName = GetObjectName(string.Format("HorizontalLine{0}", i + 1)); horizontalLines[i] = Chart.DrawTrendLine(objectName, startTime, level, endTime, level, _settings.PriceLevelsColor, _settings.PriceLevelsThickness, _settings.PriceLevelsStyle); horizontalLines[i].IsInteractive = true; horizontalLines[i].IsLocked = true; } else { horizontalLine.Time1 = startTime; horizontalLine.Time2 = endTime; horizontalLine.Y1 = level; horizontalLine.Y2 = level; } } }
private void DrawLabels(ChartRectangle rectangle, long id) { DrawLabelText(Math.Round(rectangle.GetPriceDelta(), Chart.Symbol.Digits).ToNonScientificString(), rectangle.GetStartTime(), rectangle.GetTopPrice(), id, objectNameKey: "Price", fontSize: 10); DrawLabelText(rectangle.GetBarsNumber(Chart.Bars, Chart.Symbol).ToString(), rectangle.GetEndTime(), rectangle.GetBottomPrice(), id, objectNameKey: "BarsNumber", fontSize: 10); DrawLabelText(rectangle.GetPriceToBarsRatio(Chart.Bars, Chart.Symbol).ToNonScientificString(), rectangle.GetEndTime(), rectangle.GetTopPrice(), id, objectNameKey: "PriceToBarsRatio", fontSize: 10); }
public static double GetPriceDelta(this ChartRectangle rectangle) { return(Math.Abs(rectangle.Y2 - rectangle.Y1)); }
/// <summary> /// Generato ad ogni tick, vengono effettuati i calcoli dell'indicatore /// </summary> /// <param name="index">L'indice della candela in elaborazione</param> public override void Calculate(int index) { // --> Non esiste ancora un metodo per rimuovere l'indicatore dal grafico, quindi ci limitiamo a uscire // --> Risparmio risorse controllando solo quando mi trovo sull'ultima candela, quella corrente // --> Devo avere in memoria abbastanza candele daily if (TimeFrame >= TimeFrame.Daily) { return; } // --> Deve essere inizializzata if (FirstCandleOfTheDay == null) { FirstCandleOfTheDay = Bars[index]; LastCandleOfTheDay = Bars[index]; } // --> Poichè l'indice non corrisponde a quello giornaliero, devo ricreare le aperture e le chiusure DateTime now = Bars.OpenTimes[index]; if (Bars[index].High > DayHighestPrice || DayHighestPrice == 0) { DayHighestPrice = Bars[index].High; } if (Bars[index].Low < DayLowestPrice || DayLowestPrice == 0) { DayLowestPrice = Bars[index].Low; } // --> Ricreo il cambio candela daily // --> Ad ogni cambio candela corrente devo aggiornare i dati if (FirstCandleOfTheDay.OpenTime != now) { // --> Se è la prima candela del giorno sarà anche l'inizio della daily if (now.Hour == DayStartHour && now.Minute == DayStartMinute) { // --> Siamo in un nuovo giorno, registro la candela appena chiusa DailyBars.Add(new DailyBar(FirstCandleOfTheDay.Open, FirstCandleOfTheDay.OpenTime, LastCandleOfTheDay.Close, DayHighestPrice, DayLowestPrice)); FirstCandleOfTheDay = Bars[index]; // --> Resettiamo le memorie DayHighestPrice = 0; DayLowestPrice = 0; } else { // --> Registro la candela precedente, sarà l'ultima del giorno LastCandleOfTheDay = Bars[index]; } } else { // --> Inutile proseguire, la traccia daily è già stata disegnata return; } // --> Se non ho abbastanza candele devo uscire if (DailyBars.Count < BoxPeriod) { return; } double HighestBody = 0; double HighestBodyShadow = 0; // --> Indice Giornaliero int DailyIndex = DailyBars.Count - 1; // --> Partendo dal periodo devo controllare la distanza minima e massima dei body delle candele for (int i = 0; i < BoxPeriod; i++) { int CurrentIndex = DailyIndex - i; double CurrentBody = DailyBars[CurrentIndex].Body(); double CurrentBodyShadow = DailyBars[CurrentIndex].Shadow(); if (CurrentBody > HighestBody) { HighestBody = CurrentBody; } if (CurrentBodyShadow > HighestBodyShadow) { HighestBodyShadow = CurrentBodyShadow; } } // --> Ricavo l'inizio e la fine temporale del box, verrà preso in considerazione solo per timeframe inferiori DateTime today = FirstCandleOfTheDay.OpenTime; // --> Facendo attenzione al Venerdì DateTime tomorrow = (today.DayOfWeek != DayOfWeek.Friday) ? today.AddDays(1) : today.AddDays(3); string rangeFlag = (OnlyLast) ? "" : today.ToString(); // --> Disegnamo il riferimento a seconda la scelta fatta switch (BoxDrawMode) { case _DrawMode.Rectangle: ChartRectangle LongRectangle = Chart.DrawRectangle("Long" + rangeFlag, today, FirstCandleOfTheDay.Open, tomorrow, FirstCandleOfTheDay.Open + HighestBody, Color.FromArgb(Opacity, Color.FromName(ColorLong)), TicknessBox, LineStyleBox); ChartRectangle ShortRectangle = Chart.DrawRectangle("Short" + rangeFlag, today, FirstCandleOfTheDay.Open, tomorrow, FirstCandleOfTheDay.Open - HighestBody, Color.FromArgb(Opacity, Color.FromName(ColorShort)), TicknessBox, LineStyleBox); LongRectangle.IsFilled = FillBox; ShortRectangle.IsFilled = FillBox; break; case _DrawMode.Line: Chart.DrawTrendLine("Long" + rangeFlag, today, FirstCandleOfTheDay.Open + HighestBody, tomorrow, FirstCandleOfTheDay.Open + HighestBody, Color.FromName(ColorLong), TicknessBox, LineStyleBox); Chart.DrawTrendLine("Neutral" + rangeFlag, today, FirstCandleOfTheDay.Open, tomorrow, FirstCandleOfTheDay.Open, Color.FromName(ColorNeutral), TicknessBox, LineStyleBox); Chart.DrawTrendLine("Short" + rangeFlag, today, FirstCandleOfTheDay.Open - HighestBody, tomorrow, FirstCandleOfTheDay.Open - HighestBody, Color.FromName(ColorShort), TicknessBox, LineStyleBox); break; } ChartFibonacciRetracement FiboUp; ChartFibonacciRetracement FiboDown; // --> Fibonacci come proporzione switch (FiboMode) { case _FiboMode.Linear: FiboUp = Chart.DrawFibonacciRetracement("FiboUp", tomorrow, FirstCandleOfTheDay.Open + HighestBody, tomorrow, FirstCandleOfTheDay.Open, Color.FromName(ColorLong), 1, LineStyle.DotsRare); FiboUp.IsInteractive = FiboEditable; FiboUp.DisplayPrices = FiboPrice; FiboDown = Chart.DrawFibonacciRetracement("FiboDown", tomorrow, FirstCandleOfTheDay.Open - HighestBody, tomorrow, FirstCandleOfTheDay.Open, Color.FromName(ColorShort), 1, LineStyle.DotsRare); FiboDown.IsInteractive = FiboEditable; FiboDown.DisplayPrices = FiboPrice; if (!FiboEditable) { _standardFibo(ref FiboUp); _standardFibo(ref FiboDown); } break; case _FiboMode.Reverse: FiboUp = Chart.DrawFibonacciRetracement("FiboUp", tomorrow, FirstCandleOfTheDay.Open, tomorrow, FirstCandleOfTheDay.Open + HighestBody, Color.FromName(ColorLong), 1, LineStyle.DotsRare); FiboUp.IsInteractive = FiboEditable; FiboUp.DisplayPrices = FiboPrice; FiboDown = Chart.DrawFibonacciRetracement("FiboDown", tomorrow, FirstCandleOfTheDay.Open, tomorrow, FirstCandleOfTheDay.Open - HighestBody, Color.FromName(ColorShort), 1, LineStyle.DotsRare); FiboDown.IsInteractive = FiboEditable; FiboDown.DisplayPrices = FiboPrice; if (!FiboEditable) { _standardFibo(ref FiboUp); _standardFibo(ref FiboDown); } break; case _FiboMode.Disabled: Chart.RemoveObject("FiboUp"); Chart.RemoveObject("FiboDown"); break; } // --> Disegnamo il riferimento delle shadow Chart.DrawTrendLine("High" + rangeFlag, today, FirstCandleOfTheDay.Open + HighestBodyShadow, tomorrow, FirstCandleOfTheDay.Open + HighestBodyShadow, Color.FromName(ColorLong), TicknessBox, LineStyleBox); Chart.DrawTrendLine("Low" + rangeFlag, today, FirstCandleOfTheDay.Open - HighestBodyShadow, tomorrow, FirstCandleOfTheDay.Open - HighestBodyShadow, Color.FromName(ColorShort), TicknessBox, LineStyleBox); }
public static TimeSpan GetTimeDelta(this ChartRectangle rectangle) { return(rectangle.GetEndTime() - rectangle.GetStartTime()); }
private void DrawOrUpdateVerticalLines(ChartRectangle rectangle, ChartTrendLine[] verticalLines) { var rectangleFirstBarIndex = Chart.Bars.GetBarIndex(rectangle.Time1, Chart.Symbol); var rectangleSecondBarIndex = Chart.Bars.GetBarIndex(rectangle.Time2, Chart.Symbol); double startBarIndex, endBarIndex; if (rectangleFirstBarIndex < rectangleSecondBarIndex) { startBarIndex = rectangleFirstBarIndex; endBarIndex = rectangleSecondBarIndex; } else { startBarIndex = rectangleSecondBarIndex; endBarIndex = rectangleFirstBarIndex; } var diff = endBarIndex - startBarIndex; var lineLevels = new double[] { diff * 0.25, diff * 0.382, diff * 0.5, diff * 0.618, diff * 0.75 }; var rectangleEndTime = rectangle.GetEndTime(); for (int i = 0; i < lineLevels.Length; i++) { var barIndex = startBarIndex + lineLevels[i]; var time = Chart.Bars.GetOpenTime(barIndex, Chart.Symbol); if (time > rectangleEndTime) { time = rectangleEndTime; } var verticalLine = verticalLines[i]; if (verticalLine == null) { var objectName = GetObjectName(string.Format("VerticalLine{0}", i + 1)); verticalLines[i] = Chart.DrawTrendLine(objectName, time, rectangle.Y1, time, rectangle.Y2, _settings.TimeLevelsColor, _settings.TimeLevelsThickness, _settings.TimeLevelsStyle); verticalLines[i].IsInteractive = true; verticalLines[i].IsLocked = true; } else { verticalLine.Time1 = time; verticalLine.Time2 = time; verticalLine.Y1 = rectangle.Y1; verticalLine.Y2 = rectangle.Y2; } } }
public static double GetEndBarIndex(this ChartRectangle rectangle, Bars bars, Symbol symbol) { return(bars.GetBarIndex(rectangle.GetEndTime(), symbol)); }
public static DateTime GetEndTime(this ChartRectangle rectangle) { return(rectangle.Time1 > rectangle.Time2 ? rectangle.Time1 : rectangle.Time2); }
public static DateTime GetStartTime(this ChartRectangle rectangle) { return(rectangle.Time1 > rectangle.Time2 ? rectangle.Time2 : rectangle.Time1); }
public static double GetBottomPrice(this ChartRectangle rectangle) { return(rectangle.Y2 > rectangle.Y1 ? rectangle.Y1 : rectangle.Y2); }
public static double GetTopPrice(this ChartRectangle rectangle) { return(rectangle.Y2 > rectangle.Y1 ? rectangle.Y2 : rectangle.Y1); }
private void DrawLabels(ChartRectangle rectangle, ChartTrendLine[] horizontalLines, ChartTrendLine[] verticalLines, long id) { var timeDistance = -TimeSpan.FromHours(Chart.Bars.GetTimeDiff().TotalHours * 2); DrawLabelText("0", rectangle.Time1, rectangle.Y1, id, objectNameKey: "0.0", fontSize: 10); DrawLabelText("1", rectangle.Time1, rectangle.Y2, id, objectNameKey: "1.1", fontSize: 10); DrawLabelText("0", rectangle.Time1.Add(timeDistance), rectangle.Y1, id, objectNameKey: "0.2", fontSize: 10); DrawLabelText("1", rectangle.Time2.Add(timeDistance), rectangle.Y1, id, objectNameKey: "1.3", fontSize: 10); DrawLabelText("0", rectangle.Time2, rectangle.Y1, id, objectNameKey: "0.4", fontSize: 10); DrawLabelText("1", rectangle.Time2, rectangle.Y2, id, objectNameKey: "1.5", fontSize: 10); DrawLabelText("0", rectangle.Time1.Add(timeDistance), rectangle.Y2, id, objectNameKey: "0.6", fontSize: 10); DrawLabelText("1", rectangle.Time2.Add(timeDistance), rectangle.Y2, id, objectNameKey: "1.7", fontSize: 10); var minLength = Math.Min(horizontalLines.Length, verticalLines.Length); for (var i = 0; i < minLength; i++) { var horizontalLine = horizontalLines[i]; var verticalLine = verticalLines[i]; switch (i) { case 0: DrawLabelText("0.25", horizontalLine.Time1, horizontalLine.Y1, id, objectNameKey: "Horizontal1.0", fontSize: 10); DrawLabelText("0.25", horizontalLine.Time2, horizontalLine.Y2, id, objectNameKey: "Horizontal1.1", fontSize: 10); DrawLabelText("0.25", verticalLine.Time1, verticalLine.Y1, id, objectNameKey: "Vertical1.0", fontSize: 10); DrawLabelText("0.25", verticalLine.Time2, verticalLine.Y2, id, objectNameKey: "Vertical1.1", fontSize: 10); break; case 1: DrawLabelText("0.382", horizontalLine.Time1, horizontalLine.Y1, id, objectNameKey: "Horizontal2.0", fontSize: 10); DrawLabelText("0.382", horizontalLine.Time2, horizontalLine.Y2, id, objectNameKey: "Horizontal2.1", fontSize: 10); DrawLabelText("0.382", verticalLine.Time1, verticalLine.Y1, id, objectNameKey: "Vertical2.0", fontSize: 10); DrawLabelText("0.382", verticalLine.Time2, verticalLine.Y2, id, objectNameKey: "Vertical2.1", fontSize: 10); break; case 2: DrawLabelText("0.5", horizontalLine.Time1, horizontalLine.Y1, id, objectNameKey: "Horizontal3.0", fontSize: 10); DrawLabelText("0.5", horizontalLine.Time2, horizontalLine.Y2, id, objectNameKey: "Horizontal3.1", fontSize: 10); DrawLabelText("0.5", verticalLine.Time1, verticalLine.Y1, id, objectNameKey: "Vertical3.0", fontSize: 10); DrawLabelText("0.5", verticalLine.Time2, verticalLine.Y2, id, objectNameKey: "Vertical3.1", fontSize: 10); break; case 3: DrawLabelText("0.618", horizontalLine.Time1, horizontalLine.Y1, id, objectNameKey: "Horizontal4.0", fontSize: 10); DrawLabelText("0.618", horizontalLine.Time2, horizontalLine.Y2, id, objectNameKey: "Horizontal4.1", fontSize: 10); DrawLabelText("0.618", verticalLine.Time1, verticalLine.Y1, id, objectNameKey: "Vertical4.0", fontSize: 10); DrawLabelText("0.618", verticalLine.Time2, verticalLine.Y2, id, objectNameKey: "Vertical4.1", fontSize: 10); break; case 4: DrawLabelText("0.75", horizontalLine.Time1, horizontalLine.Y1, id, objectNameKey: "Horizontal5.0", fontSize: 10); DrawLabelText("0.75", horizontalLine.Time2, horizontalLine.Y2, id, objectNameKey: "Horizontal5.1", fontSize: 10); DrawLabelText("0.75", verticalLine.Time1, verticalLine.Y1, id, objectNameKey: "Vertical5.0", fontSize: 10); DrawLabelText("0.75", verticalLine.Time2, verticalLine.Y2, id, objectNameKey: "Vertical5.1", fontSize: 10); break; } } }
private void button7_Click(object sender, EventArgs e) { var obj = new ChartRectangle(chart1, new DPoint(1, 1), new DSize(4, 4), Color.Red); chart1.PinMovableObjectAndAdd(obj); }
private void DrawFans(ChartRectangle rectangle) { var startTime = rectangle.GetStartTime(); var endTime = rectangle.GetEndTime(); var topPrice = rectangle.GetTopPrice(); var bottomPrice = rectangle.GetBottomPrice(); var rectanglePriceDelta = rectangle.GetPriceDelta(); var rectangleBarsNumber = rectangle.GetBarsNumber(Chart.Bars, Chart.Symbol); var startBarIndex = rectangle.GetStartBarIndex(Chart.Bars, Chart.Symbol); var levels = new[] { 1, 2, 3, 4, 5, 8, -2, -3, -4, -5, -8 }; foreach (var level in levels) { string name = null; DateTime secondTime = endTime; double secondPrice = topPrice; switch (level) { case 1: name = "1x1"; secondTime = endTime; secondPrice = topPrice; break; case 2: case 3: case 4: case 5: case 8: { name = string.Format("1x{0}", level); secondPrice = topPrice; switch (level) { case 2: secondTime = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 2), Chart.Symbol); break; case 3: secondTime = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 3), Chart.Symbol); break; case 4: secondTime = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 4), Chart.Symbol); break; case 5: secondTime = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 5), Chart.Symbol); break; case 8: secondTime = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 8), Chart.Symbol); break; } break; } case -2: case -3: case -4: case -5: case -8: { name = string.Format("{0}x1", Math.Abs(level)); secondTime = endTime; switch (level) { case -2: secondPrice = bottomPrice + (rectanglePriceDelta / 2); break; case -3: secondPrice = bottomPrice + (rectanglePriceDelta / 3); break; case -4: secondPrice = bottomPrice + (rectanglePriceDelta / 4); break; case -5: secondPrice = bottomPrice + (rectanglePriceDelta / 5); break; case -8: secondPrice = bottomPrice + (rectanglePriceDelta / 8); break; } break; } default: throw new ArgumentOutOfRangeException("level", "The fan level is outside valid range"); } if (string.IsNullOrWhiteSpace(name)) { continue; } var objectName = GetObjectName(string.Format("Fan.{0}", name)); var trendLine = Chart.DrawTrendLine(objectName, startTime, bottomPrice, secondTime, secondPrice, _settings.FansColor, _settings.FansThickness, _settings.FansStyle); trendLine.IsInteractive = true; trendLine.IsLocked = true; _fans[name] = trendLine; } }
/// <summary> /// Parto dalle ultime candele personalizzate e le disegno ogni volta /// </summary> /// <param name="index"></param> private void _drawLevelFromCustomBar() { // --> Prelevo le candele daily Bars BarsCustom = MarketData.GetBars(CandleTimeFrame); int index = BarsCustom.Count - 1; // --> Potrei non avere un numero sufficiente di candele if (index < CandleShow || index < 1) { return; } // --> eseguo un ciclo aretroso per disegnare le ultime candele for (int i = 0; i < CandleShow; i++) { // --> Il numero di candele da visualizzare potrebbero essere troppe try { // --> TimeSpan DiffTime = BarsCustom[index - i].OpenTime.Subtract(BarsCustom[(index - i) - 1].OpenTime); // <-- Strategia da valutare DateTime thisCandle = BarsCustom[index - i].OpenTime; DateTime nextCandle = (i == 0) ? thisCandle.AddMinutes(_getTimeFrameCandleInMinutes(CandleTimeFrame)) : BarsCustom[index - i + 1].OpenTime; string rangeFlag = thisCandle.ToString(); string RangeColor = (BarsCustom[index - i].Close > BarsCustom[index - i].Open) ? ColorHigh : ColorLow; switch (MyCandleMode) { case CandleMode.HighLow: if (Boxed) { ChartRectangle MyBox = Chart.DrawRectangle("HighLow" + rangeFlag, thisCandle, BarsCustom[index - i].High, nextCandle, BarsCustom[index - i].Low, Color.FromArgb(Opacity, Color.FromName(RangeColor)), TicknessBox, LineStyleBox); MyBox.IsFilled = FillBox; } else { Chart.DrawTrendLine("High" + rangeFlag, thisCandle, BarsCustom[index - i].High, nextCandle, BarsCustom[index - i].High, Color.FromName(ColorHigh), TicknessBox, LineStyleBox); Chart.DrawTrendLine("Low" + rangeFlag, thisCandle, BarsCustom[index - i].Low, nextCandle, BarsCustom[index - i].Low, Color.FromName(ColorLow), TicknessBox, LineStyleBox); } break; case CandleMode.OpenClose: if (Boxed) { ChartRectangle MyBox = Chart.DrawRectangle("OpenClose" + rangeFlag, thisCandle, BarsCustom[index - i].Open, nextCandle, BarsCustom[index - i].Close, Color.FromArgb(Opacity, Color.FromName(RangeColor)), TicknessBox, LineStyleBox); MyBox.IsFilled = FillBox; } else { Chart.DrawTrendLine("Open" + rangeFlag, thisCandle, BarsCustom[index - i].Open, nextCandle, BarsCustom[index - i].Open, Color.FromName(ColorHigh), TicknessBox, LineStyleBox); Chart.DrawTrendLine("Close" + rangeFlag, thisCandle, BarsCustom[index - i].Close, nextCandle, BarsCustom[index - i].Close, Color.FromName(ColorLow), TicknessBox, LineStyleBox); } break; } } catch { } } }
private void UpdateFans(ChartRectangle rectangle, ChartTrendLine[] fans) { var startTime = rectangle.GetStartTime(); var endTime = rectangle.GetEndTime(); var topPrice = rectangle.GetTopPrice(); var bottomPrice = rectangle.GetBottomPrice(); var rectanglePriceDelta = rectangle.GetPriceDelta(); var rectangleBarsNumber = rectangle.GetBarsNumber(Chart.Bars, Chart.Symbol); var startBarIndex = rectangle.GetStartBarIndex(Chart.Bars, Chart.Symbol); foreach (var fan in fans) { var fanName = fan.Name.Split('.').Last(); fan.Time1 = startTime; fan.Y1 = bottomPrice; switch (fanName) { case "1x1": fan.Time2 = endTime; fan.Y2 = topPrice; break; case "1x2": case "1x3": case "1x4": case "1x5": case "1x8": { fan.Y2 = topPrice; switch (fanName) { case "1x2": fan.Time2 = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 2), Chart.Symbol); break; case "1x3": fan.Time2 = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 3), Chart.Symbol); break; case "1x4": fan.Time2 = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 4), Chart.Symbol); break; case "1x5": fan.Time2 = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 5), Chart.Symbol); break; case "1x8": fan.Time2 = Chart.Bars.GetOpenTime(startBarIndex + (rectangleBarsNumber / 8), Chart.Symbol); break; } break; } case "2x1": case "3x1": case "4x1": case "5x1": case "8x1": { fan.Time2 = endTime; switch (fanName) { case "2x1": fan.Y2 = bottomPrice + (rectanglePriceDelta / 2); break; case "3x1": fan.Y2 = bottomPrice + (rectanglePriceDelta / 3); break; case "4x1": fan.Y2 = bottomPrice + (rectanglePriceDelta / 4); break; case "5x1": fan.Y2 = bottomPrice + (rectanglePriceDelta / 5); break; case "8x1": fan.Y2 = bottomPrice + (rectanglePriceDelta / 8); break; } break; } default: throw new ArgumentOutOfRangeException("level", "The fan name is outside valid range"); } } }