Трейдеры, торующие руками, редко задумываются над тем, что происходит с заявкой после нажатия кнопки бай/селл. В нормальных условиях это приводит к выводу ее на биржу во мгновение ока, что визуально подтверждается в торговом терминале. Но иногда заявки теряются. Возможно каждый замечал, что клик по кнопке, бывает не срабатывает. Что это? Возможно кривые руки, а возможно заявка где то застряла. При этом совсем неочевидо, к каким финансовым последствиям это может привести.
При разработке торговых роботов эта проблема стоит наиболее остро.
Итак, торговый робот имеет сигнал и готов подать заявку (трейдер — нажать бай/селл). Что дальше?
- Робот отправляет ее в брокерский софт на локальной машине (трейдер — в терминал)
- Софт брокера пытается заслать заяку на сервер брокера.
- Если с интернетом порядок, заявка покидает локальный компьютер
- Гуляет по хостам в интернете
- Если сервер брокера доступен, добирается до него
- Если софт на сервере в порядке, регистрируется в БД брокера, и пытается уйти набиржу
- Если канал с биржей стабилен, добирается туда.
- Софт на бирже фиксирует получение заявки
- Выводит ее на рынок, и фиксирует этот факт
- и отправляет результат брокеру
дальше в обратном порядке
- софт биржи отправляет результат брокеру
- канал биржа-брокер
- софт брокера
- интернет канал трейдера
- клиентский софт брокера у трейдера
- торговый робот (терминал)
Общеизвестно, что любой софт иногда глючит, а интернет каналы нестабильны. Поэтому, путь заявки может прерваться на любом из перечисленных шагов. Что делать если это таки случилось?
Руко-трейерам проще, можно применить аналитическое мышление и прочее, хотя и здесь, при форсмажорных обстоятельствах, многие умудряются закрывать миллионные прибыли по позициям, которые они не открывали, а наутро получать открытые позы в обратную сторону.
При разработке роботов следует учитывать каждое из этих мест, где заявка сдохнет.
Особенно для хфт, которые не ждут ответа по каждой заявке, перед отправкой следующей, а фигачат без остановки.
И что делать, если заявка потерялась?
Для начала, удостовериться, что она действительно потерялась :)
Как? Даже это не легкая задача. Установить таймаут? Так ведь раундтрип в разные периоды, взависимости от условий, может варьироваться от 10 мс. до 30 и более сек.
В любом случае, прекратить торговлю незамедлительно, до выяснения обстоятельств.
Фухх… Устал писать…
Видимо, продолжение следует...
Насчет остановки работы. Тут все зависит от логики. Если это не принципиальная заявка, то можно и продолжить работу (например, заявка на усреднение позиции), если позволяет ММ. Если это критическая заявка (переворот, стоп-сигнал), то да, лучше остановить работу.
Вообще тайм-ауты лучше вообще не отслеживать. Потому что они вносят только шум в алгоритм. Получили тайм-аут, а спустя секунду нормальный ответ, что заявка встала в стакан. Лучше следить не за таймаутами, а за потоком данных. Именно он является хорошим индикатором того, что что-то не так с данными. А заявку всегда можно ручками «поправить», чтобы робот не перезапускать.
Как ее учитывать для дальнейших действий?
Если заявка некритическая, то можно смело плюнуть на ее ответ.
Вот и все. Никаких страшилок на ночь =)
Минус поставил не я.
Во-вторых, безотказных систем не существует. Вообще. Делая таймауты и прочие проверки, вы только усложняете логику робота. И вместе ухода от редких ошибок вы привносите в робот новые, и частые ошибки.
И в третьих, то, что я описал выше, как раз является своего рода распространенным подходом борьбы с тайм-аута в заявках. Не нужно с ними бороться. Или робот сам себя застопорит своей логикой (если не так, то надо исправлять робота), или эта ошибка не критическая.
ты отправил заявку роботом — сделал проверку — присвоен ли ей номер в системе или прошла ли транзакция. Даже в простеньком купайле это есть. и все
зачем городить огород не понимаю если честно
без обид :)
И если допустим номер не присвоен, где гарантия что заявка все же ушла на биржу, но робот этого не зафиксировал?
приведите пример плз
Только биржевой номер, и ничего больше.
пс. путаницы не было. просто я хочу создать идеального робота.
вобще не понимаю смысл вашего поста
это из разряда — «я купил 5 контрактов РИ, они в таблице сделок отображаются, в открытых позициях отображаются — как мне проверить, что они дошли до биржи и брокер не лжет»
www.qpile.ru/forum/7-82-1
После этого нам необходимо отследить статус транзакции и статус заявки (нужно помнить, что это две разные вещи).
Статус транзакции мы можем отследить с помощью массива значений, возвращаемых функцией SEND_TRANSACTION
Нас интересуют два параметра:
1) ORDER_NUMBER — регистрационный номер заявки в торговой системе,
2) RESULT_EX — расширенная диагностика выполнения операции
Возможные значения RESULT_EX:
«0» — транзакция отправлена серверу,
«1» — транзакция получена на сервер QUIK от клиента,
«2» — ошибка при передаче транзакции в торговую систему, поскольку отсутствует подключение шлюза ММВБ, повторно транзакция не отправляется,
«3» — транзакция выполнена,
«4» — транзакция не выполнена торговой системой, код ошибки торговой системы будет указан в поле «DESCRIPTION»,
«5» — транзакция не прошла проверку сервера QUIK по каким-либо критериям. Например, проверку на наличие прав у пользователя на отправку транзакции данного типа,
«6» — транзакция не прошла проверку лимитов сервера QUIK,
«7» — транзакция клиента, работающего с подтверждением, подтверждена менеджером фирмы,
«8» — транзакция клиента, работающего с подтверждением, не подтверждена менеджером фирмы,
«9» — транзакция клиента, работающего с подтверждением, снята менеджером фирмы,
«10» — транзакция не поддерживается торговой системой. К примеру, попытка отправить «ACTION = MOVE_ORDERS» на ММВБ,
«11» — транзакция не прошла проверку правильности электронной подписи.
Код для получения доступа к параметрам массива возвращаемого функцией SEND_TRANSACTION:
Code
result = SEND_TRANSACTION (30, transact)
N = get_value (result, " ORDER_NUMBER ")
M = get_value (result, «RESULT_EX»)
Мы определили статус транзакции, теперь нам необходимо отследить статус заявки.
Обратимся к таблице заявок (ORDERS) или таблице стоп-заявок (STOP_ORDERS).
Для начала определим кол-во строк в данной таблице:
K = GET_NUMBER_OF(“ORDERS”)
В данной таблице нас интересуют следующие параметры:
1) NUMBER — номер заявки в торговой системе
2) TRANS_ID — идентификатор транзакции
3) STATUS – статус заявки, значения: «ACTIVE» или «KILLED» или «FILLED»
Таким образом, мы знаем количество заявок (K), TRANS_ID (мы вводили его сами) и NUMBER (N)
Code
FOR i FROM 1 to K
trade = GET_ITEM («ORDERS », i)
If GET_VALUE (trade, " NUMBER ") = n
P = GET_VALUE (trade, «STATUS»)
RETURN
Else
……
End if
END FOR
можно тупо для таких редких ситуаций как технические сбои на бирже сделать оповещение через интернет хозяину робота
Даже человек, как я уже сказал, тыкает кнопку «бай», например, и ждет реакции. А ее нет. Думает, может промахнулся, тыкает еще, опять ноль, еще несколько раз… может кнопка сломалась. Уходит разочарованный, а наутро оказывается в позе на больше чем все.
никакой робот ничего не сделает если биржу выключат на сутки
пусть он хоть обпроверяет свои статусы
В таблице заявок Ваша заявка в квике должна появится в течении 1 секунды. Если ее там нет, то возможны всего четыре варианта:
Ваш робот ее не отправил;
Обрывалась связь клиентского места с сервером;
Не работает вывод таблицы в программу проверки;
У брокера проблемы с выводом заявок на биржу.
Первые три ошибки можно проконтролировать в роботе, последнюю все равно можно решить только вручную путем звонка брокеру.
— интернет затормозил
— на рынке начался большой движняк
— антивирус затеял проверку и забрал всю процессорную мощность
— биржа сломалась
— вискарь вылился на клавиатуру
— мыши сгрызли провод
— жена позвала обедать
а насчет 4-х причин, да, это как раз то, что я перечислил в посте, только сжато. Тем не менее, я бы предпочел рассматривать все звенья цепочки — программные модули на клиентский машине, у брокера и на бирже, и средства коммуникаций между ними.
с таким же успехом можно сказать, что причина только одна — что то пошло не так — и решение либо есть либо его нет.
Какая у робота может быть жена, позвавшая на обед? И как робот может пролить вискарь на клавиатуру? :) А почти все остальное (кроме биржа сломалась) укладывается в проверку связи.
Ну а настраивать робота на техпроблемы на бирже — это бессмыслено. Если биржа сломалась, то надо робота выключать.
Спасибо за участие в дискуссии.