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


Время для значения индикатора в IndicatorManager
Atom
4/17/2012


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

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

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

Tags:


Thanks:


JackSparrow

Avatar
Date: 4/17/2012
Reply


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

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

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


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

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

OvcharenkoVI

Avatar
Date: 4/17/2012
Reply


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

Moadip

Avatar
Date: 4/17/2012
Reply


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

    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;
                                ...
                            };
Thanks: JackSparrow

JackSparrow

Avatar
Date: 4/18/2012
Reply


Moadip Go to
Можно так попробовать.
Code

    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 сделать, так еще и в оболочку и в график легко данные отдавать
Thanks:

ra81

Avatar
Date: 4/18/2012
Reply


Moadip Go to
Можно так попробовать.
Code

    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;
                                ...
                            };

Ну да, такой вариант приемлем и может работать. Кроме такого я ничего придумать собственно и не смог сам. Криво косо, но вполне можно использовать.
Thanks:


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

loading
clippy