Невозможно обработать начальные значения индикатора

Невозможно обработать начальные значения индикатора
Atom
12/19/2011
pehas


Необходимо нарисовать все значения индикатора на графике. Проблема в том, что событие Changed индикатора начинает работать не с начального значения. Соответственно, рисуются только последние значения. Происходит это потому, что делегат событию Changed присваивается уже после регистрации свечек. Соответственно, какие-то свечки уже обработаны перед определением Changed для индикатора.

Запуск бота происходит в середине торговой сессии, т.е. уже есть какие-то трейды
Последовательность запуска примерно такая
Code

this._trader = new QuikTrader(QuikTerminal.GetDefaultPath());
this._cm = new CandleManager(this._trader);
this._trader.Connect();
this._trader.StartExport();
this.security = this._trader.Securities.FirstOrDefault(s => s.Code == this.SCode);
var candleToken = this._cm.RegisterTimeFrameCandles(security, this._timeFrame);
this.ATRToken = indicatorManager.RegisterIndicator(new AverageTrueRange { Length = 10 }, new CandleTokenIndicatorSource(candleToken, BaseCandleIndicatorSource.ByClose));
var ATR = this.ATRToken.Indicator as AverageTrueRange;
ATR.Changed += (input, res) =>
{
    var candle = this._cm.GetTimeFrameCandle(this.security, this._timeFrame, 1);
    var val = ATR.LastValue.GetValue<decimal>();
    this.GuiAsync(() => this.chartWnd.ATR.Add(new DItem { date = candle.Time, value = val }));
};


Как сделать добавление события Changed до регистрации свечек, я так и не разобрался. Ведь я не могу определить его без токена. А токен можно получить только зарегистрировав свечи

Tags:


Thanks:


Alexander

Avatar
Date: 12/19/2011
Reply


Тема к квику, я так понял, не относится.
Переношу в индикаторы.
Thanks:

pehas

Avatar
Date: 12/20/2011
Reply


Я так понял, красиво эту задачу не решить?
Кто-то вообще занимался отрисовкой индикаторов по прошлым трейдам, если бот запускается внутри дня? Поделитесь опытом

В библиотеке S# есть пример SampleSMA - там рисуются индикаторы за предыдущие периоды, но только с помощью истории загруженной из файла. А по задаче нужно нарисовать используя только свечи CandleManager
Thanks:

Mikhail Sukhov

Avatar
Date: 12/20/2011
Reply


pehas
Я так понял, красиво эту задачу не решить?


Я лично не понял ничего из сообщения.
Thanks:

freelancer

Avatar
Date: 12/20/2011
Reply


Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Code
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}
Thanks: OvcharenkoVI

pehas

Avatar
Date: 12/21/2011
Reply


freelancer
Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Code
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}


Это не совсем то что мне нужно, но благодаря вашему примеру, я решил свою проблему. И как раз думал над тем как засунуть в индикатор свечи импортированные из квика. Так что вы совсем вовремя) Спасибо!
Thanks:

pehas

Avatar
Date: 1/10/2012
Reply


freelancer
Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Code
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}

мне нужно вызвать Process у индикатора Highest. Указанный выше способ не работает в этом случае.
Выползает ошибка "Объект должен реализовывать интерфейс IConvertible"
Если делать так -
Code

Highest h = new Highest {Length = 20}
foreach (Candle c in _candles)
{
        
	h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c));
}

то работает, но тогда вылетает с ошибкой такой код
Code

        h.Changed += (input, res) =>
        {
             MessageBox.Show(input.Time.ToString());
        }
}

потому что инпут не свеча.

Как получить input в виде свечи в данном случае?
Thanks:

pehas

Avatar
Date: 1/10/2012
Reply


Кому интересно, проблема решилась так:
Нашел в исходниках на codeplex закрытый класс CandlePartIndicatorValue и скопировал его реализацию в свой код
Таким образом следующий код заработал без ошибок
Code

Highest h = new Highest {Length = 20}

h.Changed += (input, res) =>
{
    MessageBox.Show(input.Time.ToString());
}

foreach (Candle c in _candles)
{
    h.Process(new StockSharp.Algo.Indicators.CandlePartIndicatorValue (c, c.HighPrice));
}

Thanks:

OvcharenkoVI

Avatar
Date: 1/10/2012
Reply


Че то ты сам че то натворил и сам че то решил

Если ты работаешь с DecimalIndicatorValue, то и входное значение изначально должно быть типа Decimal.

Чем не устраивает: h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c.HighPrice));

И все сразу должно было работать
Thanks:

pehas

Avatar
Date: 1/10/2012
Reply


OvcharenkoVI
Че то ты сам че то натворил и сам че то решил

Если ты работаешь с DecimalIndicatorValue, то и входное значение изначально должно быть типа Decimal.

Чем не устраивает: h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c.HighPrice));

И все сразу должно было работать


Тем что мне нужно передать в событие Chanded индикатора свечу а не Decimal для дальнейшей работы. К примеру тебе надо в событии changed отрисовать значение индикатора или получить значение цены открытия входной свечи. С decimal ты ничего не сделаешь
Thanks:

russ

Avatar
Date: 2/17/2012
Reply


...
Thanks:


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

loading
clippy