← Zurück

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (10)

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

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

...