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


Неправильная выдача свечек в CandleManager.GetTimeFrameCandles()
Atom
1/20/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%.

Tags:


Thanks:


1 2  >
Mikhail Sukhov

Avatar
Date: 1/21/2011
Reply


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


Приведите код, как именно выводите.
Thanks:

Alter

Avatar
Date: 1/21/2011
Reply


Code

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));
         ...
        }
        ...
    }
Thanks:

Mikhail Sukhov

Avatar
Date: 1/21/2011
Reply


Alter Go to
Code

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 (получение диапазона). Вполне может быть так, что по Вашему диапазону будет получено более одной свечки.
Thanks:

Alter

Avatar
Date: 1/21/2011
Reply


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

Mikhail Sukhov

Avatar
Date: 1/21/2011
Reply


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


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

Alter

Avatar
Date: 1/21/2011
Reply


Code

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));
}


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

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
Thanks:

Mikhail Sukhov

Avatar
Date: 1/27/2011
Reply


Alter Go to
Code

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 возвращает два раза одну и ту же свечку, а из-за передаваемого диапазона. Последняя запрашиваемая свечка из предыдущего диапазона была равна первой из следующего. Если у Вас так же, то в этом и причина.
Thanks:

Alter

Avatar
Date: 1/27/2011
Reply


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

Alter

Avatar
Date: 1/27/2011
Reply


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

Code
Финам:
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, как видно по объему и ценам. У вас такое не воспроизводится?
Thanks:

Mikhail Sukhov

Avatar
Date: 1/28/2011
Reply


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


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

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy