← Atrás

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

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

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


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 до регистрации свечек, я так и не разобрался. Ведь я не могу определить его без токена. А токен можно получить только зарегистрировав свечи

¿Le resultó útil este tema?

Compartir tema

Comentarios (10)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Alexander
Alexander

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

pehas
pehas Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

freelancer
freelancer

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

я соединяю исторические свечи из квика с текущими, а потом вызываю

foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}
OvcharenkoVI
pehas
pehas Autor

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

я соединяю исторические свечи из квика с текущими, а потом вызываю

foreach (Candle c in _candles) { Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c)); }


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

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

я соединяю исторические свечи из квика с текущими, а потом вызываю

foreach (Candle c in _candles) { Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c)); }

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

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

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


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

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

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

pehas
pehas Autor

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


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

OvcharenkoVI
OvcharenkoVI

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

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

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

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

pehas
pehas Autor

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

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

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

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

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

russ
russ

...