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


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

Может в рендере нужно использовать какие то классы реализующие 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);
}



Спасибо:




12 Ответов
Support

Фотография
Дата: 08.06.2019
Ответить


Добрый день

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

Код
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
Спасибо:

Константин

Фотография
Курсы Благотворитель
Дата: 10.06.2019
Ответить


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

Константин

Фотография
Курсы Благотворитель
Дата: 16.06.2019
Ответить


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

Support

Фотография
Дата: 16.06.2019
Ответить


Добрый день

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

Константин

Фотография
Курсы Благотворитель
Дата: 28.08.2019
Ответить


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

Support

Фотография
Дата: 01.09.2019
Ответить


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

Koc

Фотография
Дата: 02.12.2019
Ответить


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

Константин

Фотография
Курсы Благотворитель
Дата: 07.09.2020
Ответить


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

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 свечей учтен. Линия получается в два раза короче. Какой смысл в группировке по времени, если индикатор никаким образом не реагирует на это?
Автор топика
Спасибо:

sprite

Фотография
Дата: 07.09.2020
Ответить


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

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

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

Константин

Фотография
Курсы Благотворитель
Дата: 07.09.2020
Ответить


sprite Перейти
if (drawLine)
gr.Add(_indicatorElement, double.NaN);

Вы пользуетесь сигнатурой этого метода? Быть может я что то делаю не так, но я не могу запихать double в метод так как его невозможно привести к типу IIndicatorValue.
Автор топика
Спасибо:

sprite

Фотография
Дата: 07.09.2020
Ответить


Константин Перейти
Вы пользуетесь сигнатурой этого метода? Быть может я что то делаю не так, но я не могу запихать double в метод так как его невозможно привести к типу IIndicatorValue.

Да, но у этого метода есть куча перегрузок. Если ваш _indicatorElement будет типом ChartLineElement - то всё должно получиться.
UPDATE По сути если вам не надо делать разрывы больше чем соседние свечки вы можете просто поменяете тип линии (DrawStyle) на Dots и получите вместо линии, как на картинке в первом посте, серии горизонтальных точек с разрывами. Или, если точки не подходят и хочется именно линии, то нужно для какой-то свечки организовать разрыв, вставляя double.NaN или сделать два элемента и рисовать их поочередно заполняя то один то другой значениями double.NaN. Ну или как писал support - используйте аннотации, но там есть свои баги.

Спасибо: Константин

Константин

Фотография
Курсы Благотворитель
Дата: 10.09.2020
Ответить


sprite Перейти
Константин Перейти
Вы пользуетесь сигнатурой этого метода? Быть может я что то делаю не так, но я не могу запихать double в метод так как его невозможно привести к типу IIndicatorValue.

Да, но у этого метода есть куча перегрузок. Если ваш _indicatorElement будет типом ChartLineElement - то всё должно получиться.
UPDATE По сути если вам не надо делать разрывы больше чем соседние свечки вы можете просто поменяете тип линии (DrawStyle) на Dots и получите вместо линии, как на картинке в первом посте, серии горизонтальных точек с разрывами. Или, если точки не подходят и хочется именно линии, то нужно для какой-то свечки организовать разрыв, вставляя double.NaN или сделать два элемента и рисовать их поочередно заполняя то один то другой значениями double.NaN. Ну или как писал support - используйте аннотации, но там есть свои баги.



Одним double.nan не получилось обойтись. Сделал на основе индикатора и рендера отрисовки.
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy