Фундаментальный баг в ситеме: журнал моих сделок и приказов не совпадает с реальной позицией на бирже

Фундаментальный баг в системе Os.Engine

  1. ildarskii

    Регистрация:
    01.02.20
    Сообщения:
    1
    Был на сайте:
    06.02.21

    Доброго всем дня. 

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

    Можно надеяться на исправление этого фундаментального функционала? Можно даже за небольшую денюжку.  

    Ниже более подробное описание случаев, когда возникают такие ошибки и предложение по решению. Тестирую робота на SmartCom на демосчете, количество активов для торговли 50шт., поэтому за короткое время может быть направлено до 50 приказов на биржу.  Если необходима дополнительная информация, с радостью предоставлю. 

    ---------
    1) Функция ConnectionCheckerToOrdersThreadArea предназначена для идентификации пропажи отправленных приказов (ордеров): когда система направила брокеру приказ, а по нему в течение 10 секунд не было никакой обратной связи. Однако, при обнаружении такого приказа происходит полный перезапуск подключения и нет полноценной обработки таких пропавших приказов. В итоге получается, что Os.Engine и робот считают такой приказ доведенным до системы, но реально его на бирже нет. Необходимо исключать такой приказ (ордер) из внутреннего журнала системы и инициировать соответствующее событие изменения статуса ордера (Failed) для уведомления торгующих роботов и предпринятия соответствующих действий.
    Предложения по исправлению. До перезапуска подключения нужно возвращать соотв. ордера в очередь _ordersToExecute и _ordersToCansel. А до того, разумно подождать завершение опустошения этих очередей, т.к. с высокой долей вероятности текущие заявки в очереди тоже будут потеряны. Остается предусмотреть тонкий момент, что делать если в момент переподключения произойдет исполнение моих активных ордеров на бирже, тогда система пропустит информацию о таком событии (про случивщийся мой трейд). 
     
    2) Также встречались случаи когда система подключена к бирже, но в момент исполнения моего приказа (ордера) не приходит события в систему об этом. Такой кейс случается стабильно пару раз в неделю при активной торговле, описать шаги к воспроизведению этого бага не представляется возможным (это просто случайный технический сбой, возможно у брокера). 
    Предложения по исправлению. После подключения к бирже делать проверку на соответствие журнала сделок и активных ордеров той информации, которая есть на бирже. В случае если идентифицируется различие, то уведомлять об этом администратора и (если выставлена соотв. галочка в настройках) вносить корректировки в журнал системы (приводить в соответствие позиции на бирже).
     
    3) С вероятностью около 20% наблюдается подвисание потоков обменивающихся данными между системой и биржей. Не всегда подгружаются свечки по инструментам. Но для качественно работающего приложения конечно такого не должно быть. Предполагаемая причина подвисания в том, что:
    1) функция StartThisSecurity(..) сначала лочит lock (_lockerStarter), потом внутри запрашивает lock(_smartComServerLocker);
    2) функция PrimeThreadArea() лочит в обратном порядке, сначала lock(_smartComServerLocker), а потом в вызывает функцию RestartSecurities(...), которая лочит lock (_lockerStarter). 
    Таким образом, получается, что функции ждут друг друга.
    ildarskii
    23.01.2021 16:54
    #1