Трейдеры, торующие руками, редко задумываются над тем, что происходит с заявкой после нажатия кнопки бай/селл. В нормальных условиях это приводит к выводу ее на биржу во мгновение ока, что визуально подтверждается в торговом терминале. Но иногда заявки теряются. Возможно каждый замечал, что клик по кнопке, бывает не срабатывает. Что это? Возможно кривые руки, а возможно заявка где то застряла. При этом совсем неочевидо, к каким финансовым последствиям это может привести.
При разработке торговых роботов эта проблема стоит наиболее остро.
Итак, торговый робот имеет сигнал и готов подать заявку (трейдер — нажать бай/селл). Что дальше?
- Робот отправляет ее в брокерский софт на локальной машине (трейдер — в терминал)
- Софт брокера пытается заслать заяку на сервер брокера.
- Если с интернетом порядок, заявка покидает локальный компьютер
- Гуляет по хостам в интернете
- Если сервер брокера доступен, добирается до него
- Если софт на сервере в порядке, регистрируется в БД брокера, и пытается уйти набиржу
- Если канал с биржей стабилен, добирается туда.
- Софт на бирже фиксирует получение заявки
- Выводит ее на рынок, и фиксирует этот факт
- и отправляет результат брокеру
дальше в обратном порядке
- софт биржи отправляет результат брокеру
- канал биржа-брокер
- софт брокера
- интернет канал трейдера
- клиентский софт брокера у трейдера
- торговый робот (терминал)
Общеизвестно, что любой софт иногда глючит, а интернет каналы нестабильны. Поэтому, путь заявки может прерваться на любом из перечисленных шагов. Что делать если это таки случилось?
Руко-трейерам проще, можно применить аналитическое мышление и прочее, хотя и здесь, при форсмажорных обстоятельствах, многие умудряются закрывать миллионные прибыли по позициям, которые они не открывали, а наутро получать открытые позы в обратную сторону.
При разработке роботов следует учитывать каждое из этих мест, где заявка сдохнет.
Особенно для хфт, которые не ждут ответа по каждой заявке, перед отправкой следующей, а фигачат без остановки.
И что делать, если заявка потерялась?
Для начала, удостовериться, что она действительно потерялась :)
Как? Даже это не легкая задача. Установить таймаут? Так ведь раундтрип в разные периоды, взависимости от условий, может варьироваться от 10 мс. до 30 и более сек.
В любом случае, прекратить торговлю незамедлительно, до выяснения обстоятельств.
Фухх… Устал писать…
Видимо, продолжение следует...
Насчет остановки работы. Тут все зависит от логики. Если это не принципиальная заявка, то можно и продолжить работу (например, заявка на усреднение позиции), если позволяет ММ. Если это критическая заявка (переворот, стоп-сигнал), то да, лучше остановить работу.
Вообще тайм-ауты лучше вообще не отслеживать. Потому что они вносят только шум в алгоритм. Получили тайм-аут, а спустя секунду нормальный ответ, что заявка встала в стакан. Лучше следить не за таймаутами, а за потоком данных. Именно он является хорошим индикатором того, что что-то не так с данными. А заявку всегда можно ручками «поправить», чтобы робот не перезапускать.