Неправильная выдача свечек в CandleManager.GetTimeFrameCandles()


Неправильная выдача свечек в CandleManager.GetTimeFrameCandles()
Atom
20.01.2011


Вызываю метод, он выдает все минутные свечки за день, и среди них попадаются пары с одинаковым временем (формат time O H L C V):
12:57:00 187035 187035 187035 187035 1
12:57:00 187025 187125 187020 187125 744

Настоящая свечка такая:
12:57:00 187025 187125 187020 187125 745

Причем у одной из парных свечек объем всегда равен единице. Что характерно, баг проявился только когда мой одноядерный проц оказался загружен на 100%.

Теги:


Спасибо:


1 2  >
Mikhail Sukhov

Фотография
Дата: 21.01.2011
Ответить


Alter Перейти
Вызываю метод, он выдает все минутные свечки за день, и среди них попадаются пары с одинаковым временем (формат time O H L C V):
12:57:00 187035 187035 187035 187035 1
12:57:00 187025 187125 187020 187125 744


Приведите код, как именно выводите.
Спасибо:

Alter

Фотография
Дата: 21.01.2011
Ответить


Код

private void CandleManager_NewCandles(CandleToken token, IEnumerable<Candle> candles)
{
     if (candles.Last().Time >= WorkingSecurity.LastTrade.Time.TruncateSeconds())
     {
     DateTime start = WorkingQuote.Count > 0 ? WorkingQuote[0].DateAndTime : DateTime.Today;
     DateTime end = candles.Last().Time;
     var newCandles = CandleManager.GetTimeFrameCandles(WorkingSecurity, Timeframe, new Range<DateTime>(start, end));
         ...
        }
        ...
    }
Спасибо:

Mikhail Sukhov

Фотография
Дата: 21.01.2011
Ответить


Alter Перейти
Код

private void CandleManager_NewCandles(CandleToken token, IEnumerable<Candle> candles)
{
     if (candles.Last().Time >= WorkingSecurity.LastTrade.Time.TruncateSeconds())
     {
     DateTime start = WorkingQuote.Count > 0 ? WorkingQuote[0].DateAndTime : DateTime.Today;
     DateTime end = candles.Last().Time;
     var newCandles = CandleManager.GetTimeFrameCandles(WorkingSecurity, Timeframe, new Range<DateTime>(start, end));
         ...
        }
        ...
    }


Вывода так и не увидел. Но по коду кое что понятно. Вы в событии новых свечек вызываете CandleManager.GetTimeFrameCandles (получение диапазона). Вполне может быть так, что по Вашему диапазону будет получено более одной свечки.
Спасибо:

Alter

Фотография
Дата: 21.01.2011
Ответить


Вывод - это далее foreach (var candle in newCandles) {...}. Понятно, что по моему диапазону может быть более одной свечки =) Непонятно, почему у некоторых из них одинаковое значение candle.Time.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 21.01.2011
Ответить


Alter Перейти
Вывод - это далее foreach (var candle in newCandles) {...}. Понятно, что по моему диапазону может быть более одной свечки =) Непонятно, почему у некоторых из них одинаковое значение candle.Time.


Да, слона я не увидел... Чтобы точно все определить, можете полностью привести код вывода в лог.
Спасибо:

Alter

Фотография
Дата: 21.01.2011
Ответить


Код

foreach (var candle in newCandles)
{
Logger.Log.Info("*** {0} {1} {2} {3} {4} {5}", candle.Time, candle.OpenPrice, candle.HighPrice, candle.LowPrice, candle.ClosePrice, candle.TotalVolume);
WorkingQuote.Add(CandleToBar(candle));
}


Лог получается такой:
Код

01/20/2011 23:19:21 [10] - *** 20.01.2011 12:46:00 187050 187070 186960 186970 3001
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:47:00 186970 186970 186970 186970 1
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:47:00 186970 187105 186965 187050 1510
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:48:00 187050 187110 187015 187070 703
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:49:00 187080 187225 187075 187190 2387
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:50:00 187185 187200 187100 187115 1204
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:51:00 187130 187155 187095 187135 973
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:52:00 187135 187175 187120 187145 355
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:53:00 187140 187165 187110 187110 262
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:54:00 187110 187185 187085 187175 1376
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:55:00 187180 187185 187120 187120 444
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:56:00 187120 187135 187005 187020 2016
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:57:00 187035 187035 187035 187035 1
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:57:00 187025 187125 187020 187125 744
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:58:00 187105 187195 187080 187190 1234
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:59:00 187190 187190 187190 187190 1
01/20/2011 23:19:21 [10] - *** 20.01.2011 12:59:00 187190 187200 187100 187135 671
01/20/2011 23:19:21 [10] - *** 20.01.2011 13:00:00 187135 187165 187095 187155 810
01/20/2011 23:19:21 [10] - *** 20.01.2011 13:01:00 187165 187195 187095 187150 1016
Спасибо:

Mikhail Sukhov

Фотография
Дата: 27.01.2011
Ответить


Alter Перейти
Код

private void CandleManager_NewCandles(CandleToken token, IEnumerable<Candle> candles)
{
     if (candles.Last().Time >= WorkingSecurity.LastTrade.Time.TruncateSeconds())
     {
     DateTime start = WorkingQuote.Count > 0 ? WorkingQuote[0].DateAndTime : DateTime.Today;
     DateTime end = candles.Last().Time;
     var newCandles = CandleManager.GetTimeFrameCandles(WorkingSecurity, Timeframe, new Range<DateTime>(start, end));
         ...
        }
        ...
    }


Запустил тест (переделав его, так как махинации со временем мне остались не понятны) и увидел следующее. Действительно, в логе свечки двоятся. Но они двоятся не из-за того, что метод GetTimeFrameCandles возвращает два раза одну и ту же свечку, а из-за передаваемого диапазона. Последняя запрашиваемая свечка из предыдущего диапазона была равна первой из следующего. Если у Вас так же, то в этом и причина.
Спасибо:

Alter

Фотография
Дата: 27.01.2011
Ответить


Нет, у меня диапазон запрашивается один раз при запуске робота, свечки двоятся внутри одного диапазона.
Спасибо:

Alter

Фотография
Дата: 27.01.2011
Ответить


Еще одно наблюдение. Сравниваю свечки, полученные через S# c загруженными с финама. Иногда попадается следующее:

Код
Финам:
20110127,155600,190065,190110,190015,190015,509
20110127,155700,190020,190030,189900,189955,2031

S#:
20110127,155600,190065,190110,190015,190020,511
20110127,155700,190025,190030,189900,189955,2029


То есть 2 сделки из свечки 15:57 записались в свечку 15:56, как видно по объему и ценам. У вас такое не воспроизводится?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 28.01.2011
Ответить


Alter Перейти
Нет, у меня диапазон запрашивается один раз при запуске робота, свечки двоятся внутри одного диапазона.


Насколько я вижу по приведенному коду, диапазон конструируется не при запуске, а внутри события. Может выводить диапазон так же в лог?
Спасибо:
1 2  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy