protected override void OnDrawingStopped()
        {
            _rectangle            = null;
            _horizontalTrendLines = null;
            _verticalTrendLines   = null;

            _fans.Clear();
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        protected override void OnDrawingStopped()
        {
            base.OnDrawingStopped();

            _rectangle = null;

            _extendedHorizontalLine = null;
            _extendedVerticalLine   = null;

            _horizontalTrendLines.Clear();
            _verticalTrendLines.Clear();
        }
Esempio n. 6
0
        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;
                }
            }
        }
Esempio n. 7
0
        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;
                }
            }
        }
Esempio n. 9
0
        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);
                }
            }
        }
Esempio n. 10
0
        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);
 }
Esempio n. 14
0
 public static double GetPriceDelta(this ChartRectangle rectangle)
 {
     return(Math.Abs(rectangle.Y2 - rectangle.Y1));
 }
Esempio n. 15
0
        /// <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);
        }
Esempio n. 16
0
 public static TimeSpan GetTimeDelta(this ChartRectangle rectangle)
 {
     return(rectangle.GetEndTime() - rectangle.GetStartTime());
 }
Esempio n. 17
0
        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;
                }
            }
        }
Esempio n. 18
0
 public static double GetEndBarIndex(this ChartRectangle rectangle, Bars bars, Symbol symbol)
 {
     return(bars.GetBarIndex(rectangle.GetEndTime(), symbol));
 }
Esempio n. 19
0
 public static DateTime GetEndTime(this ChartRectangle rectangle)
 {
     return(rectangle.Time1 > rectangle.Time2 ? rectangle.Time1 : rectangle.Time2);
 }
Esempio n. 20
0
 public static DateTime GetStartTime(this ChartRectangle rectangle)
 {
     return(rectangle.Time1 > rectangle.Time2 ? rectangle.Time2 : rectangle.Time1);
 }
Esempio n. 21
0
 public static double GetBottomPrice(this ChartRectangle rectangle)
 {
     return(rectangle.Y2 > rectangle.Y1 ? rectangle.Y1 : rectangle.Y2);
 }
Esempio n. 22
0
 public static double GetTopPrice(this ChartRectangle rectangle)
 {
     return(rectangle.Y2 > rectangle.Y1 ? rectangle.Y2 : rectangle.Y1);
 }
Esempio n. 23
0
        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;
            }
        }
Esempio n. 26
0
        /// <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");
                }
            }
        }