Необходимо нарисовать все значения индикатора на графике. Проблема в том, что событие 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 до регистрации свечек, я так и не разобрался. Ведь я не могу определить его без токена. А токен можно получить только зарегистрировав свечи
Comentarios (10)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Тема к квику, я так понял, не относится. Переношу в индикаторы.
Я так понял, красиво эту задачу не решить? Кто-то вообще занимался отрисовкой индикаторов по прошлым трейдам, если бот запускается внутри дня? Поделитесь опытом
В библиотеке S# есть пример SampleSMA - там рисуются индикаторы за предыдущие периоды, но только с помощью истории загруженной из файла. А по задаче нужно нарисовать используя только свечи CandleManager
Я лично не понял ничего из сообщения.
Может вам поможет:
я соединяю исторические свечи из квика с текущими, а потом вызываю
foreach (Candle c in _candles) { Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c)); }
foreach (Candle c in _candles) { Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c)); }
то работает, но тогда вылетает с ошибкой такой код
потому что инпут не свеча.
Как получить input в виде свечи в данном случае?
Кому интересно, проблема решилась так: Нашел в исходниках на codeplex закрытый класс CandlePartIndicatorValue и скопировал его реализацию в свой код Таким образом следующий код заработал без ошибок
Че то ты сам че то натворил и сам че то решил
Если ты работаешь с DecimalIndicatorValue, то и входное значение изначально должно быть типа Decimal.
Чем не устраивает: h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c.HighPrice));
И все сразу должно было работать
Тем что мне нужно передать в событие Chanded индикатора свечу а не Decimal для дальнейшей работы. К примеру тебе надо в событии changed отрисовать значение индикатора или получить значение цены открытия входной свечи. С decimal ты ничего не сделаешь
...