Отрисовка стопов без вертикальных линий

Отрисовка стопов без вертикальных линий


Добрый день! Скажите пожалуйста как можно отрисовать стопы без вертикальных линий? Дело в том что когда позиция переворачивается то линия стопа переносится на противоположную сторону, и этот перенос соединяется неразрывной линией. Может в рендере нужно использовать какие то классы реализующие IChartElement или в свойство Style устанавливать какое значение?

Индикатор такой:


    public class StopLossIndicator : BaseIndicator
    {
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            var value = input.GetValue<decimal>();
            IsFormed = value != 0;
            return new DecimalIndicatorValue(this, value);
        }
    }

Рендер такой:

public class StopLossPainter : BaseChartIndicatorPainter
    {
        [Display(Name = "Стоп-Лосс", Description = "Область графика для отрисовки стопа")]
        public ChartLineElement StopLossLine { get; }


        public StopLossPainter()
        {
            StopLossLine = new ChartLineElement()
            {
                Style = ChartIndicatorDrawStyles.Line, StrokeThickness = 2, Color = Colors.Red
            };
            AddChildElement(StopLossLine);
        }


        protected override bool OnDraw()
        {
            var ind = (StopLossIndicator)Indicator;
            var result = false;
            result |= DrawValues(ind, StopLossLine);

            return result;
        }
    }

Отрисовка как:


.....
StopLoss = new StopLossIndicator();
.....
private void OnCandleSeriesProcessing(CandleSeries candleSeries, Candle candle)
        {
            var chartDrawData = new ChartDrawData();
            var chartDrawDataItem = chartDrawData.Group(candle.OpenTime);
            chartDrawDataItem.Add(ChartCandleElement, candle);

            var dataStop = StopLoss.Process(StopPriсe, candle.State == CandleStates.Finished);
            chartDrawDataItem.Add(StopLossElement, dataStop);

            Chart.Draw(chartDrawData);
}




Thanks:


1 2  >
Support

Avatar
Date: 6/8/2019
Reply


Добрый день

Вы можете использовать аннотации для этого:

var annotation = new ChartAnnotation { Type = ChartAnnotationTypes.LineAnnotation };
			Chart.AddElement(_areaComb, annotation);

			var data = new ChartDrawData.AnnotationData
			{
				X1 = new DateTimeOffset(2015, 8, 03, 5, 0, 0, TimeSpan.FromHours(3)),
				X2 = new DateTimeOffset(2015, 8, 03, 5, 30, 0, TimeSpan.FromHours(3)),
				Y1 = 2098.5m,
				Y2 = 2098.5m,
				IsVisible = true,
				IsEditable = false,
				Stroke = Brushes.Red,
				CoordinateMode = AnnotationCoordinateMode.Absolute,
			};

			var dd = new ChartDrawData();
			dd.Add(annotation, data);

			Chart.Draw(dd);

На примере SampleChart это выглядит так:

37b04f5a757a10692c5d86dce3070d09.png

Thanks:

Константин

Avatar
Date: 6/10/2019
Reply


Если _annotation объявить как поле типа ChartAnnotation один раз, добавить его на график Chart.AddElement(_areaComb, _annotation) и добавлять на него новые данные ChartDrawData.AnnotationData, то предыдущая линия стирается и начитает прорисовываться новая. Можно ли как то рисовать не одну линию, а несколько? Неужели для каждого стопа нужно добавлять новый элемент ChartAnnotation на график?

Thanks: Support

Константин

Avatar
Date: 6/16/2019
Reply


Если я правильно понимаю решения в настоящее время нет. Если да то у меня сопутствующий вопрос - Планируется ли реализация данного решения в будущем?

Thanks:

Support

Avatar
Date: 6/16/2019
Reply


Добрый день

Да, пока только через создание новых элементов. Мы обсудим возможность введение единичного элемента графика.

Thanks:

Константин

Avatar
Date: 8/28/2019
Reply


Добрый день. Не было ли принято решение по данному вопросу?

Thanks:

Support

Avatar
Date: 9/1/2019
Reply


Здравствуйте. Пока на стадии рассмотрения. Как будут новости мы оповестим в данном топике.

Thanks:

Koc

Avatar
Date: 12/2/2019
Reply


На самом деле это очень нужная опция. Так как без нее очень сложно разбираться где был выставлен и как подтягивался трейл стоп. Рисовать индикатором слегка деревянный способ.[suspicious]

Thanks:

Константин

Avatar
Date: 9/7/2020
Reply


Судя по всему вопрос был отклонен. В связи с этим вопрос: Как рисовать стопы на истории? Если группировка данных происходит по времени


var chartData = new ChartDrawData();
var gr =  chartData.Group(candle.OpenTime);

то следуя логике если я буду рисовать линию по 10 свечей так


if (_count < 10)
   gr.Add(_indicatorElement, longValue);
else  if (_count > 20) _count = 0;

то линия должна прерываться каждые 10 свечей. Вместо этого линия рисуется без разрывов, но пропуск 10 свечей учтен. Линия получается в два раза короче. Какой смысл в группировке по времени, если индикатор никаким образом не реагирует на это?

Thanks:

Sprite

Avatar
Date: 9/7/2020
Reply


if (drawLine) gr.Add(_indicatorElement, (double)longValue); else gr.Add(_indicatorElement, double.NaN);

Идея в том, что нужно хоть что-то рисовать, чтобы значения индикатора не пропускались и из-за этого следующие значения не съезжали влево по горизонтальной оси. Еще момент - если вы так нарисуете линию только в одной свечке, а слева и справа значения будут double.NaN - то вы не увидите линию. Для этого можно использовать стиль линии Dots. Собственно так в StockSharp рисуются фракталы.

К сожалению так нельзя делать со свечками, т.е. нельзя просто так взять и нарисовать индикатором одну свечку в нужном месте. Поясню: допустим у вас рисуются свечки на оси + рисуются другие свечки индикатором на этой же оси, но другим элементом ChartCandleElement. Так вот, пропуск вторых свечек приведет к тому, что как ни группируй свечки будут рисоваться одна за другой, без пропусков. И по сути вы правы - группировка по времени при таком использовании не работает. И еще момент - свечки нельзя рисовать в кастомном рендерере (унаследовав от BaseChartIndicatorPainter), почему так сделано - для меня загадка.

Thanks: Константин

Константин

Avatar
Date: 9/7/2020
Reply


sprite: if (drawLine) gr.Add(_indicatorElement, double.NaN); Вы пользуетесь сигнатурой этого метода? Быть может я что то делаю не так, но я не могу запихать double в метод так как его невозможно привести к типу IIndicatorValue.

Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy