Стратегия котирования MarketQuotingStrategy в AlfaTrader

Стратегия котирования MarketQuotingStrategy в AlfaTrader
Atom
2/22/2012
seashaman


Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет.
Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.

Tags:


Thanks: Sergey Masyura


1 2  >
Sergey Masyura

Avatar
Date: 2/22/2012
Reply


seashaman
Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет.
Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.


Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.
Thanks:

Sergey Masyura

Avatar
Date: 3/7/2012
Reply


Sergey Masyura
seashaman
Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет.
Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.


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


Залил изменения - http://stocksharp.codepl...nector%2fAlfaWrapper.cs
Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.
Thanks:

ra81

Avatar
Date: 3/7/2012
Reply


Sergey Masyura
Sergey Masyura
seashaman
Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет.
Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.


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


Залил изменения - http://stocksharp.codepl...nector%2fAlfaWrapper.cs
Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.


Ну сразу тем кто будет тестировать скажу что вероятность багов котирования очень высока. Терминал ведет себя не очень адекватно в определенные моменты. У меня подобная схема, в общем работает, но иногда совершенно неадекватно. Пытаюсь вылечить.
Thanks: Sergey Masyura

ra81

Avatar
Date: 3/23/2012
Reply


Обнаружились дедлоки в стратегии котирования. Происходят достаточно часто в следующих условиях:
1) создаю простую стратегию Она проверяет позицию.
// проверим есть ли позиция по бумаге.
Code

            if (HavePosition())
            {
                this.AddInfoLog("Есть позиция. Продаем позицию.");
                _sellStrategy = new MarketQuotingStrategy(OrderDirections.Sell, this.Volume);
                ChildStrategies.Add(_sellStrategy);
            }
            else
            {
                this.AddInfoLog("Нет позиции. Покупаем позицию.");
                _buyStrategy = new MarketQuotingStrategy(OrderDirections.Buy, this.Volume);
                ChildStrategies.Add(_buyStrategy);

            }

Если позиция есть,то продаем, если нет то покупаем.

В итоге периодически происходят дедлоки. Снял все что мог прикладываю ниже. Дедлоки происходят в стратегиях. Лочатся три потока обрабатывающие Orders, Security, Trades. Нужно учесть что для каждого типа данных есть отдельный поток. Отсюда имеем три потока. Они все заблокированы друг на друге.

Waiting of System.object on 10784 - значит что поток ждет Объект которым владеет поток 10784

ProcessOrders - поток


ProcessSecurities - поток



ProcessTrades - поток


Логи котирования


Логи базовой стратегии
Thanks:

ra81

Avatar
Date: 3/26/2012
Reply


Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/
Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2012
Reply


ra81
Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/


Плаза и Квик сейчас в нескольких потоках транслируют данные.
Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2012
Reply


Mikhail Sukhov
ra81
Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/


Плаза и Квик сейчас в нескольких потоках транслируют данные.


Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.

И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.
Thanks:

ra81

Avatar
Date: 3/27/2012
Reply


Mikhail Sukhov

Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.

И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.


Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.

В общем и целом я не настаиваю на том что бы кто-то ковырялся в моем коде, но если у вас все же появилось сомнение в абсолютной правильности кода S#, то я могу передать Сергею код который вызывал дедлоки. Сказать как их получить. Ну а дальше уже думаю найдете без проблем.

При текущей однопоточной схеме передачи данных от терминала, работать стало все заметно адекватнее чем раньше. Отсюда следует: либо я не совсем так реализовал многопоточность в данных (по незнанию скорее чем по злому умыслу:), ибо библиотека весьма сложная и данных мало), либо таки есть проблема (ну а вы просто используете стандартный подход, который сию проблему обходит).
Thanks:

Mikhail Sukhov

Avatar
Date: 3/27/2012
Reply


ra81

Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.


Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина.
Thanks:

ra81

Avatar
Date: 3/27/2012
Reply


Mikhail Sukhov
ra81

Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.


Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина.

Мне конечно тяжело левелом в данном случае меряться, но просмотрел все трейсы, проглядел все потоки и где они встали. Ну нет локов у меня. Или я их не вижу. Сделал мегатрейс со всех потоков. Прилагаю его тупо файлом, а так же лог котирования.

bugs2.txt 45 KB (226)
Thanks: Mikhail Sukhov
1 2  >

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

loading
clippy