Возрожу эту тему.
Объединяю историю с реалтаймом.
// Подписка на события
((SmartTrader)this.trader).NewHistoryCandles += (token, candles) => this.historyCandles.SyncDo(col =>
{
// Сохраняем исторические бары
this.historyCandles.AddRange(candles);
// Отрисовываем исторические бары
chartWindow.DrawCandles(token, candles);
});
candleManager.CandlesStarted += DrawRealTimeCandles;
candleManager.CandlesChanged += DrawRealTimeCandles;
candleManager.CandlesFinished += DrawRealTimeCandles;
// Собственно забираю историю
TimeSpan ts = new TimeSpan(currentTimeFrame.Hours * 100, currentTimeFrame.Minutes * 100, currentTimeFrame.Seconds * 100);
Range<DateTime> range = new Range<DateTime>((DateTime.Now - ts), DateTime.Now);
((SmartTrader)trader).RegisterHistoryCandles(this.SelectedSecurity, this.currentTimeFrame, range);
this.lastHistoryCandle = this.currentTimeFrame.GetCandleBounds(this.trader).Min;
// Дальнейшая отрисовка реал-тайм
public void DrawRealTimeCandles(CandleToken token, IEnumerable<Candle> candles)
{
this.GuiAsync(() =>
{
IEnumerable<Candle> realTimeCandles = candles;
// Для SmartCOM выводим только те свечки, которые не были отрисованы как исторические
if (this.rbSmart.IsChecked == true)
realTimeCandles = candles.Where(c => c.Time > this.lastHistoryCandle);
chartWindow.DrawCandles(token, realTimeCandles);
});
}
История забирается нормально, реалтайм тоже без проблем идет. Единственная и довольно неприятная проблема - бар, на котором происходит соединение. Он, вроде как и из истории не берется полноценным, и из реалтайма. В результате бар, на котором произошло подключение, не совпадает с реальностью. Есть какие-нибудь способы получить его правильно, чтобы как в КВИКе было, где все нормально? Кто как решает эту проблему?
ЗЫ. Самое интересное, что похожей проблемой грешат RightEdge и OpenQuant на разных источниках данных. Но тут-то у нас все в руках, вопрос только - как? 😊