Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.
Комментарии (12)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.
Залил изменения - http://stocksharp.codeplex.com/SourceControl/changeset/changes/15395#trunk%2fConnectors%2fAlfa%2fConnector%2fAlfaWrapper.cs Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.
Ну сразу тем кто будет тестировать скажу что вероятность багов котирования очень высока. Терминал ведет себя не очень адекватно в определенные моменты. У меня подобная схема, в общем работает, но иногда совершенно неадекватно. Пытаюсь вылечить.
Обнаружились дедлоки в стратегии котирования. Происходят достаточно часто в следующих условиях:
Если позиция есть,то продаем, если нет то покупаем.
В итоге периодически происходят дедлоки. Снял все что мог прикладываю ниже. Дедлоки происходят в стратегиях. Лочатся три потока обрабатывающие Orders, Security, Trades. Нужно учесть что для каждого типа данных есть отдельный поток. Отсюда имеем три потока. Они все заблокированы друг на друге.
Waiting of System.object on 10784 - значит что поток ждет Объект которым владеет поток 10784
ProcessOrders - поток
ProcessSecurities - поток
ProcessTrades - поток
Логи котирования
Логи базовой стратегии
Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.
http://stocksharp.com/posts/m/17697/
Плаза и Квик сейчас в нескольких потоках транслируют данные.
Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.
И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.
Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.
В общем и целом я не настаиваю на том что бы кто-то ковырялся в моем коде, но если у вас все же появилось сомнение в абсолютной правильности кода S#, то я могу передать Сергею код который вызывал дедлоки. Сказать как их получить. Ну а дальше уже думаю найдете без проблем.
При текущей однопоточной схеме передачи данных от терминала, работать стало все заметно адекватнее чем раньше. Отсюда следует: либо я не совсем так реализовал многопоточность в данных (по незнанию скорее чем по злому умыслу:), ибо библиотека весьма сложная и данных мало), либо таки есть проблема (ну а вы просто используете стандартный подход, который сию проблему обходит).
Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина.
Бага у нас. Не доглядел первый раз. Буду править. Возможно, она влияет на котирование в последней версии, в 22 (и в дев, так как все изменения идут в дев так же).