← 戻る

Неправильное формирование свечек, несколько ТФ, много стратегий

Запущено 10 стратегий, для CandleManager регистрируются 2 ТФ: 1- минутки и 5-минутки. Пытаюсь получать свечки внутри стратегии, вот их распечатка:

localCandle: time(10:45:00), open(139880), close(139800), high(139945), low(139775); TimeFrame: 00:05:00 localCandle: time(10:40:00), open(139965), close(139910), high(140145), low(139875); TimeFrame: 00:05:00 localCandle: time(10:35:00), open(140335), close(139985), high(140335), low(139950); TimeFrame: 00:05:00 localCandle: time(10:30:00), open(140250), close(140355), high(140395), low(140110); TimeFrame: 00:05:00 localCandle: time(10:25:00), open(140330), close(140250), high(140335), low(140235); TimeFrame: 00:05:00 localCandle: time(10:20:00), open(140240), close(140325), high(140340), low(140195); TimeFrame: 00:05:00 localCandle: time(10:15:00), open(140250), close(140185), high(140325), low(140110); TimeFrame: 00:05:00 localCandle: time(10:10:00), open(140150), close(140225), high(140385), low(140125); TimeFrame: 00:05:00 localCandle: time(10:05:00), open(140375), close(140150), high(140375), low(140140); TimeFrame: 00:05:00 localCandle: time(10:00:00), open(140770), close(140370), high(140770), low(140255); TimeFrame: 00:05:00

Стратегия запущена была в 10:18, до этого времени свечки как раз верные, после - совсем не то. Это фьючерс на индекс РТС - как видно свечки кривые как раз после запуска. Объём свечек тоже неверный, объём свечки в 10:45 - 474, в 10:40 - 217...

Свечки получаю через: var oldCandles = _candleManager.GetTimeFrameCandles(Security, TimeFrame, new Range<DateTime>(firstTime, marketTime)); //firstTime - 10.00, marketTime - текущее время, TimeFrame - 5 минут

Самое интересное - на локальном компьютере, где запущены всего 3 стратегии и 1 квик - всё нормально.

このトピックは参考になりましたか?

トピックを共有

コメント (19)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Mikhail Sukhov
Mikhail Sukhov
  1. На счет объема не понял - он в лог не выводится... А в чем кривость свечек то?
  2. А в чем разница между локальным компьютером и том, на котором лог писался?
Alexander
Alexander 著者
  1. свечка в 10:45 должна быть: открытие 139920 макс 139965 мин 139870 закрытие 139800 объём 6957 (никак не 474 по логу (объём дописал потом))

т.е. совсем другие данные

  1. Никакой разницы нет,время синхронизировано с сервером и стоит одна и таже зона - Москва.
Mikhail Sukhov
Mikhail Sukhov

Если запрашивать через диапазон new Range(firstTime, marketTime), то можно захватить еще не сформированную текущую свечку. Случаем, не это ли случилось?

Alexander
Alexander 著者

Нет, не это. Все остальные свечки после включения роботов (в 10:18) тоже кривые, всё они неверные - неправильно всё, от минимума и максимума до закрытия\открытия и объёма.

Mikhail Sukhov
Mikhail Sukhov

Так Вы же пишите, что включения робота свечки верные. Первые потому, что они полностью сформированы, и трюк к запросом всех свечек по текущее время прокатит. А у Вас наверное запрос свечек идет в OnProcess. И на каждой итерации будет захватываться еще не сформированная свечка... Откуда у Вас вызывается получение свечек?

Alexander
Alexander 著者

Да, свечки получаются через var oldCandles = _candleManager.GetTimeFrameCandles(Security, TimeFrame, new Range<DateTime>(firstTime, Trader.MarketTime));

Но дальше я ведь пробегаю по всем этим свечкам в цикле и печатаю. Печатаются из цикла неверные значения для всех (!) свечек, не только для последней (последнюю я как раз и не смотрю) - для всех от 10:20 до 10:45. Печать, которую дал в первом посте была сделана в 10:50:01, просто убрал это из сообщения.

Если убрать всё ненужное, то вот печать:

                      var oldCandCount = oldCandles.Count();
                        while (it <= oldCandCount)
                        {
                            localCandle =

oldCandles.ElementAt(oldCandCount - it); if (localCandle != null) { AddLog(StrategyErrorStates.None, "localCandle: time({0}), open({1}), close({2}), high({3}), low({4}); " +

"TimeFrame: {5}, TotalVolume({6}), TotalPrice({7})", new object[] { localCandle.Time.TimeOfDay, localCandle.OpenPrice, localCandle.ClosePrice, localCandle.HighPrice, localCandle.LowPrice, localCandle.TimeFrame, localCandle.TotalVolume, localCandle.TotalPrice }); } it++; }

Mikhail Sukhov
Mikhail Sukhov

Ок... Еще по логу можете посмотреть, менялись ли старые свечки? Или на всех итерациях неправильное значение?

Просто поправка по коду. Как то сложно пишите. Может вот так?

foreach (var localCandle in oldCandles.OrderByDescending(c => c.Time))

Alexander
Alexander 著者

Ух, так и правда проще, спасибо. Нет, не менялись - начиная с первой новой свечки (которая формируется по ходу стратегии, а не до запуска) - неправильные значения. На локальном компьютере с 1м квиком - всё нормально

Mikhail Sukhov
Mikhail Sukhov

Так, разница между тачками все-таки есть - 1 квик и несколько?

Alexander
Alexander 著者

У меня просто там много дополнительных условий в цикле, наверное на foreach не получится так просто заменить. Попробую в любом случае =)

Mikhail Sukhov
Mikhail Sukhov

Чем проще цикл, тем меньше ошибок... Так что насчет разницы между тачками?

Alexander
Alexander 著者

Да, на сервере 6 квиков, на локальной машине - 1 квик. И там и там идёт работа через MultiTrader, программа-робот одна и таже.

Mikhail Sukhov
Mikhail Sukhov

Ха, я кажется понял в чем фишка. Один Квик строит свечки последовательно, по сделкам. 6 квиков посылают сделки параллельно. Как следствие, неправильные свечки. Алго построения свечек основан на том, что как только появляется сделка из следующего ТФ, то текущая свечка помечается как сформированная и к ней более обращений не идет.

Alexander
Alexander 著者

Понял, похоже на мои предположения. Буду ждать фикса тогда, сейчас с несколькими квиками не получается иначе работать :(

Mikhail Sukhov
Mikhail Sukhov

Хм, а вот тут не все так просто. Я пока даже предствить себе не могу, как это фиксить. Алгоритм свечной не поддерживает такое поведение... Может быть формировать свечки по конретным QuikTrader?

Alexander
Alexander 著者

Я правильно понимаю что для каждого QuikTrader надо создать свой CandleManager и регистрировать необходимые ТФ? Если так, то не проблема, конечно сделаю.

Alexander
Alexander 著者

Чтобы закрыть эту тему - реализовал именно таким образом сейчас, завтра протестирую

Alexander
Alexander 著者

Михаил, задам вопрос тут, дабы не плодить множество тем - надо ли дополнительно проверять IsTimeFrameCandlesRegistered перед регистрацией таймфрейма или это уже запрятано внутрь RegisterTimeFrameCandles и повторной регистрации не произойдёт в любом случае?

Mikhail Sukhov
Mikhail Sukhov

Надо. Иначе будет исключение. Специально сделал чтобы ловили с своих роботах код, который норовит зарегистрировать лишнее.