Проблема проявляется даже стандартном примере SampleHistoryTesting. Для обнаружения в OnProcess достаточно добавить
if (Math.Abs(PositionManager.Position) > Volume)
throw new Exception("Неверное состояние - поза превышает рабочий объем.");
и после получения эксепшена посмотреть Trader.Orders - последние две заявки будут исполненными, а перед ними будет несколько отмененных с примерно тем же временем.
Ошибка плавающая, возникает иногда на первой же заявке, а иногда несколько первых заявок проходят нормально.
Комментарии (52)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Александр, а насколько к PositionManager.Position можно привязываться как к индикатору состояния позиции?
Для сравнения, тот же пример из версии 3.2.1
Это немного не тот лог, который я ожидал увидеть. у нас в класс Strategy добавлен дополнительный логгер, его вывести необходимо.
Который по событию Log срабатывает.
И да, на вопрос о номере версии ответ я не вижу :)
Это именно то, что выдается по событию Strategy.Log основной стратегии.
Вот пример того, что выдает непосредственно стратегия котирования (обратите внимание на два сообщения "Новая Sell сделка"):
Да, версия вчерашняя, ревизия 11491.
Посмотрели и код. Увидели следующие. Когда пример разрабатывался, дочерние стратегии блокировали исполнение родительской (OnProcess не вызывался). Теперь он вызывается не зависимо от наличия дочерних стратегий (в данном случае котирования). Я думаю, тут ситуация такая, что котирование в один момент времени создается в нескольких экземплярах.
Еще такой момент. В последней версии S# матчинг происходит в отдельном потоке. Это тоже определенный фактор для остановки стратегии котирования.
Вывод - надо пример переделывать под событийную модель. Попробуете?
У меня свой проект, в котором используется событийная модель, там то же самое. Сейчас ее лог сделаю.
Вы уверены, что параллельно не запущены несколько котирований? Меняйте им имена, чтобы их можно было различать.
Цеплял вот таким кодом:
Еще пример, уже из моего проекта, с событийной моделью:
Я кого-нибудь убедил в существовании проблемы, или еще что-то нужно уточнить?
Небольшой вопрос. А позиция учитывает стандартно, по заявкам, или по сделкам?
В принципе нашел несколько мест. Так что будем лечить как лечили проблему с позами - в несколько этапов.
Я тоже сталкивался с такой проблемой. Только в другом виде: при попытке использования StopLoss и TakeProfit стратегий на бектесте все сходит с ума, потому что выполняется пара ордеров в определенный момент и баланс стратегии нарушается.
Уважаемая команда stocksharp вы можете посмотреть на эту проблему? Или подсказать где нам самим чинить, хотя я думаю что это в закрытой части стокшарпа.
kenota, подсказывайте, конечно. Чем подробнее мы объясним, где искать, тем больше вероятность, что они полезут исправлять.
Полезем смотреть обязательно. Только времени не было. Плюс у меня очередной отпуск на следующей неделе.
зы По котированию надеюсь народ начнет понимать, что если не помогать с простыми задачами (кстати, спасибо вам за помощь по Гидре), то команда S# будет эти простые задачи сама делать. А на сложные руки не дойдут. Вот и получается, что если кому-то не нужна та же самая Гидра, на самом деле она ему нужна, только он об этом еще не знает.😀
Посмотрите, пожалуйста, когда поднимается событие NewOrder - добавьте вывод этого сообщения в лог.
Совсем не оно. Подпишитесь на событие NewOrders у стратегии MQS и добавьте сообщение о id заявки и времени вывода (с милисекундами).
А может эта ошибка быть связана с сообщениями о том что заявка не имеет состояния?
Я экспериментировал с демо примером из последней версии стокшарпа, так там через некоторое время он просто зависает, а в логах постоянно появляется сообщение о заявке без состояния, потом, когда срабатывает условие на выставление нового ордера, сообщения начинают чередоваться.
Это возникает в разное время от начала эмуляции.
Явно связано с многопоточностью, увелечиение параметра LoadingThreadCount у EmulationTrader вроде дает шанс получить ошибку еще раньше. То есть чем больше потоков тем больше вероятность наступления. При LoadingThreadCount=1 ошибка все равно проявляется.
Прикладываю скриншот логов о которых я говорю (это сообщение повторяется вечно и ордер никогда не выполняется).
Так же, один раз при тесте, когда я экспериментировал с количеством потоков выскочило окно с эксепшеном (мессадж бокс, то есть кто то его обработал), скрин этого эксепшена прикладываю к сообщению тоже.
Да, единственные изменения от тестового примера у меня это вывод логов в окно и период тестирования с 20 числа, что бы рынок поактивней был.
Есть варианты как это обойти можно? а то не получается стратегию оттестировать на истории вообще :(
Попробуйте EmulationTrader.MarketEmulator установить не ParallelEmulator а Sync.
Такой вот код не помог, все равно зависает:
_trader.MarketEmulator = new SyncMarketEmulator(_trader);
Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.
Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что?
Сейчас проверим по памяти и скорости. Могу только зрительно.
Может стоит сделать визуально в примере отображение производительности?
А где исправленную версию взять? На codeplex?
Проверил на SampleHistoryTesting - запускал по два раза. По времени стало 23:17 и 24:19 против 13:17 и 9:33, а вот по памяти разница небольшая - 1,5 против 1,2.
Но на моем проекте прогоняется истории fRTS с 2009 года, и могут быть нюансы с работой GC. По факту посчитались только два года, а съедено уже 8 гигов, раньше было 4-5. Ну и дополнительные тормоза за счет работы свопа появились, видимо.
Ничего не понимаю. Вы пишите, что было 1.2 стало 1.5 гига. Теперь цифры другие, с 4 до 8. Какие цифры правильные?
На тестовом примере - 1,5 и 1,2. На моем - 8 и 4.
Тогда нужно смотреть профайлером, что так много кушает у вас. Пример то мало потребляет, а данные все те же генерирует.
Пример проходит один фьючерс, а я всю серию, с RIH9 по RIZ1. Скорее всего, где-то утечка памяти. Профайлером пытаться смотреть, но пока не разобрался, как им пользоваться.
И в любом случае, это не может влиять на скорость тестового примера. 16 гигов оперативки ему более чем достаточно. Так что тормоза надо лечить отдельно.
Параллельным матчингом.
Вы же мне пример присылали, где синхронный устанавливали.
Еще один аргумент за утечку - когда я ставил запуск GC в конце каждого дня истории, вылетала ошибка где-то внутри генератора свечей. Попробую повторить, напишу подробнее.
И правда. Но подключение параллельного не помголо - те же 25 минут на тестовый пример. Подключал так: ```csharp _trader.MarketEmulator = new ParallelMarketEmulator(_trader);
Наверное, они тормозят. Раньше был один алгоритм компрессии, затем другой (опять же, с фиксами). Ничего не поделать, свечки сейчас (да и раньше тоже) самый тормозящий участок в тестировании. Я уже предлагал в Гидре сделать компрессию для ускорения. Не знаю, работает ли.
Вроде что-то сделали, но непонятно, как это использовать - ни примера, ни мануала внятного я не видел.
Вот такая помощь. К таким помощникам еще парочка помощников нужна.
По поводу проблемы с неработающим котированием, описанной здесь http://stocksharp.com/forum/2129/Nie-rabotaiet-kotirovaniie/
В итоге все нормально, но появилось очень много сообщение о том, что в стакан пустой:
Непонятно почему стакан пустой, исходные данные формирую как в примере:
Забрал последнюю версию из svn, спасибо за исправления, вроде теперь эта часть работает!