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


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


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

Теги:


Спасибо: Sergey Masyura


1 2  >
Sergey Masyura

Фотография
Дата: 22.02.2012
Ответить


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


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

Sergey Masyura

Фотография
Дата: 07.03.2012
Ответить


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


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


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

ra81

Фотография
Дата: 07.03.2012
Ответить


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


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


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


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

ra81

Фотография
Дата: 23.03.2012
Ответить


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

            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 - поток


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


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

ra81

Фотография
Дата: 26.03.2012
Ответить


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

http://stocksharp.com/posts/m/17697/
Спасибо:

Mikhail Sukhov

Фотография
Дата: 26.03.2012
Ответить


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

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


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

Mikhail Sukhov

Фотография
Дата: 26.03.2012
Ответить


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

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


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


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

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

ra81

Фотография
Дата: 27.03.2012
Ответить


Mikhail Sukhov Перейти

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

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


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

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

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

Mikhail Sukhov

Фотография
Дата: 27.03.2012
Ответить


ra81 Перейти

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


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

ra81

Фотография
Дата: 27.03.2012
Ответить


Mikhail Sukhov Перейти
ra81 Перейти

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


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

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

bugs2.txt 45 KB (184)
Спасибо: Mikhail Sukhov
1 2  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy