Наверное событие NewHistoricalCandles?
Да.
А как вы получаете исторические свечки в событии о приходе новой свечи? Нативными средствами SmartCom или же через CandleManager?
Через CandleManager. Напишите, pls, если возможно, как в моем случае можно использовать нативные средства SmartCOM (явно выполнить GetBars и затем обработать полученную серию).
Схема работы:
Запускаю получение свечей:
[code=csharp] private void btnGetHistory_Click(object sender, EventArgs e)
{
DateTime date1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0);
_lkSeries = new CandleSeries(typeof(TimeFrameCandle), _lkoh, TimeSpan.FromMinutes(1));
_candleManager.Start(_lkSeries, date1, DateTime.Now);
}[/code]
Отлавливаю данные в обработчике события NewHistoricalCandles:
Схема:
ЕСЛИ пришла 1 свеча,
ТО вывожу на экран только ее
ИНАЧЕ вывожу все свечи, начиная с последней загруженной
[code=csharp]_trader.NewHistoricalCandles += (seri, candy) =>
{
int cou = seri.GetCandleCount();
if (seri.Security.Code == _lkoh.Code)
{
// http://stocksharp.com/forum/3656/Urok-4---Sviechi--ghrafiki--istoriia/
TimeSpan ts = seri.GetCandle<Candle>(0).OpenTime - GlobalParameters.lkohTimeLoad;
if (ts.TotalMinutes == 1) // получена одна свеча: все как положено, без сбоев
{
GlobalParameters.lkohTimeLoad = seri.GetCandle<Candle>(0).OpenTime;
_lkCandle = seri.GetCandle<Candle>(0);
SafeAddToTxb(txtSmartInfo, DateTime.Now.ToString() + " | " + _lkCandle.OpenTime.ToString() + " | " + _lkCandle.CloseTime.ToString() + " | " + _lkCandle.OpenPrice.ToString() + " | " + _lkCandle.HighPrice.ToString() + " | " + _lkCandle.LowPrice.ToString() + " | " + _lkCandle.ClosePrice.ToString());
// далее выполняется повторный запрос последних 10 свечей (для выявления ошибки)
DateTime date1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0);
_trader.RegisterHistoryCandles(_lkoh, SmartTimeFrames.Minute1, DateTime.Now, 10, SmartHistoryDirections.Backward);
}
else if (ts.TotalMinutes > 1) // был разрыв связи или еще какой-то сбой или самое начало работы
{
int i = 1;
try
{
while (seri.GetCandle(i).OpenTime > GlobalParameters.lkohTimeLoad)
{
i = i + 1;
}
}
catch GlobalParameters.lkohTimeLoad = seri.GetCandle(0).OpenTime;
i = i - 1;
while (i >= 0)
{
_lkCandle = seri.GetCandle<Candle>(i);
SafeAddToTxb(txtSmartInfo, DateTime.Now.ToString() + " | " + _lkCandle.OpenTime.ToString() + " | " + _lkCandle.CloseTime.ToString() + " | " + _lkCandle.OpenPrice.ToString() + " | " + _lkCandle.HighPrice.ToString() + " | " + _lkCandle.LowPrice.ToString() + " | " + _lkCandle.ClosePrice.ToString());
i = i - 1;
}
}
else // вывод на экран данных, полученных в результате выполнения _trader.RegisterHistoryCandles выше
{
_lkCandle = seri.GetCandle<Candle>(0);
SafeAddToTxb(txtSmartInfo, "Пришел повтор: " + DateTime.Now.ToString() + " | " + _lkCandle.OpenTime.ToString() + " | " + _lkCandle.CloseTime.ToString() + " | " + _lkCandle.OpenPrice.ToString() + " | " + _lkCandle.HighPrice.ToString() + " | " + _lkCandle.LowPrice.ToString() + " | " + _lkCandle.ClosePrice.ToString());
}
}[/code]