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


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

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

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

Теги:


Спасибо:




5 Ответов
JackSparrow

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


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

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

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


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

(в начале предлагал к LastValue приделать LastValueTime )
Спасибо:

OvcharenkoVI

Фотография
Автор статей
Дата: 17.04.2012
Ответить


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

Moadip

Фотография
Автор статей Программист
Дата: 17.04.2012
Ответить


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

    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

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


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

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


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

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


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

loading
clippy