← Zurück

Время для значения индикатора в IndicatorManager

Проблема собственно вот в чем. У нас есть SimpleMovingAverage, и IndicatorManager, а так же есть CandleManager.

Допустим мы настроили источник данных для IndicatorManager, и он теперь получает свечки от CandleManager. Затем мы зарегистрировали SimpleMovingAverage в IndicatorManager и скользящая начала пересчитываться с каждым новым значением свечки. НО вот встает вопрос. Мы подписались на событие SimpleMovingAverage.Changed и можем получать уведомления о новых данных индикатора. Например мы рисуем его на графике или еще что. А как получить время?? Значение то у нас будет, а время события? Или привязка к свечке по которой считалось все это дело? На лицо факт, что нет связки Входящее значение - исходящее значение. А хочется иметь. Хотябы для автоматической отрисовки на графике.

Если кто нашел выход напишите пожалуйста, а если кто планирует дорабатывать индикаторы, учтите сей факт.

War dieses Thema hilfreich?

Thema teilen

Kommentare (5)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

JackSparrow
JackSparrow

ra81: Проблема собственно вот в чем. У нас есть SimpleMovingAverage, и IndicatorManager, а так же есть CandleManager.

Допустим мы настроили источник данных для IndicatorManager, и он теперь получает свечки от CandleManager. Затем мы зарегистрировали SimpleMovingAverage в IndicatorManager и скользящая начала пересчитываться с каждым новым значением свечки. НО вот встает вопрос. Мы подписались на событие SimpleMovingAverage.Changed и можем получать уведомления о новых данных индикатора. Например мы рисуем его на графике или еще что. А как получить время?? Значение то у нас будет, а время события? Или привязка к свечке по которой считалось все это дело? На лицо факт, что нет связки Входящее значение - исходящее значение. А хочется иметь. Хотябы для автоматической отрисовки на графике.

Если кто нашел выход напишите пожалуйста, а если кто планирует дорабатывать индикаторы, учтите сей факт.

К Разработчикам: по сути _value в IIndicatorValue должен быть парой Значение\Время, и значение переопределяться в реализация в зависимости от типа как это сейчас делается, а время останется временем. Иначе приходится в своем коде костыли подставлять, придумывать свои события и аргументы к ним

(в начале предлагал к LastValue приделать LastValueTime )

OvcharenkoVI
OvcharenkoVI

Хорошее предложение, причем делов немного выйдет

Moadip
Moadip

Можно так попробовать.


    SimpleMovingAverage _longSma = new SimpleMovingAverage { Length = 20 };

    _series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
    _candleManager.Start(_series);

    _indicatorManager.RegisterIndicator(_longSma, new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));

    _longSma.Changed += (value, indicatorValue) =>
                            {
                                var price = indicatorValue.GetValue<decimal>();
                                var time = _series.GetCandle(1).OpenTime;
                                ...
                            };

JackSparrow
JackSparrow
JackSparrow

Moadip: Можно так попробовать.

SimpleMovingAverage _longSma = new SimpleMovingAverage { Length = 20 };

_series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
_candleManager.Start(_series);

_indicatorManager.RegisterIndicator(_longSma, new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));

_longSma.Changed += (value, indicatorValue) =>
                        {
                            var price = indicatorValue.GetValue<decimal>();
                            var time = _series.GetCandle(1).OpenTime;
                            ...
                        };
Вариант не плохой но он не будет работать на склейке с историей, а потом сам бог велел брать аргументы из сигнатур событий а не из сопутствующих источников, хотя на реалтайме работать будет.
Можно и индекс в менеджере во временной параметр переварачивать.
Но по мне чтоб долго не мучаться проще уже событие иницировать в Strategy.OnProcess и IndicatorEvensArgs сделать, так еще и в оболочку и в график легко данные отдавать
ra81
ra81 Autor

Moadip: Можно так попробовать.

SimpleMovingAverage _longSma = new SimpleMovingAverage { Length = 20 };

_series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
_candleManager.Start(_series);

_indicatorManager.RegisterIndicator(_longSma, new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));

_longSma.Changed += (value, indicatorValue) =>
                        {
                            var price = indicatorValue.GetValue<decimal>();
                            var time = _series.GetCandle(1).OpenTime;
                            ...
                        };
Ну да, такой вариант приемлем и может работать. Кроме такого я ничего придумать собственно и не смог сам. Криво косо, но вполне можно использовать.