Как и где правильно написать условие по выполненной заявке?, ...когда она не перемещена, не убита, а именно полностью filled?
Пользователь
Сообщений: Регистрация: 26.02.2015
13.03.2019 19:50:04
В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 100% filled? "Не активна" + "исполнена" почему-то не работает. Только флагами и непосредственно в OnTrade() определяется или без order.balance не обойтись?
OnTrade()?
Код
if bit_set(trade.flags, 0) == false and bit_set(trade.flags, 1) == false then
OnOrder()?
Код
if bit.band(order.flags,2) > 0 then
Пользователь
Сообщений: Регистрация: 02.07.2015
13.03.2019 20:49:43
Цитата
Сергей написал: В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 100% filled?"Не активна" + "исполнена" почему-то не работает.Только флагами и непосредственно в OnTrade() определяется или без order.balance не обойтись?
Причем тут OnTrade? Надо узнать статус заявки? Обрабатываем OnOrder. Нас интересуют два флага: OF_ACTIVE = 0x01 OF_KILL = 0x02 По определению: первый флаг показывает активная ли заявка, второй снята или исполнена если не активна. Т.о. существует всего 3 состояния. 0х01 = активна. order.balance (если не ошибаюсь) показывает неисполненный остаток. 0х02 = неактивна, снята. order.balance показывает неисполненный остаток. 0х00 = неактивна, исполнена полностью.
OnTrade показывает статусы сделок.
Цитата
Сергей написал: "Не активна" + "исполнена" почему-то не работает.
написал: В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 100% filled?"Не активна" + "исполнена" почему-то не работает.Только флагами и непосредственно в OnTrade() определяется или без order.balance не обойтись?
Причем тут OnTrade? Надо узнать статус заявки? Обрабатываем OnOrder. Нас интересуют два флага: OF_ACTIVE = 0x01 OF_KILL = 0x02 По определению: первый флаг показывает активная ли заявка, второй снята или исполнена если не активна. Т.о. существует всего 3 состояния. 0х01 = активна. order.balance (если не ошибаюсь) показывает неисполненный остаток. 0х02 = неактивна, снята. order.balance показывает неисполненный остаток. 0х00 = неактивна, исполнена полностью.
OnTrade показывает статусы сделок.
Цитата
написал: "Не активна" + "исполнена" почему-то не работает.
Почему не работает? Можно кусочек кода?
Конкретные проверки выше. OnTrade() стабильно срабатывает раньше OnOrder(), и я б не стал дожидаться ничего другого, если мне в OnTrade() сразу и скажут, что на эту заявку можно "забить", т.к. она более не существует.
В официальной справке QLUA по OnTrade() указано, что первый и второй биты касаются именно ЗАЯВКИ. Собственно, по-другому их и интерпретировать нельзя. Что значит применительно к сделке "снята" и как сделка может не быть исполнена (частично хотя бы), если OnTrade() сработал? Определенно о заявках это.
Пользователь
Сообщений: Регистрация: 29.04.2015
13.03.2019 22:14:46
Проверки статуса заявок (1-й и 2-й биты flags):
"Активна":
Код
bit.band(order.flags,1) > 0
"Нективна" (исполнена либо снята):
Код
bit.band(order.flags,1) == 0
"Исполнена":
Код
bit.band(order.flags,1) == 0 and bit.band(order.flags,2) == 0
"Снята":
Код
bit.band(order.flags,1) == 0 and bit.band(order.flags,2) > 0
Не надо трогать OnTrade() и trade.flags, они тут совершенно ни при чем. Можете, конечно, контролировать исполнение подсчетом количества в сделках по заявке, но это будет другой способ.
Цитата
Сергей написал: Какой гарантирует, что заявка была на 100% filled?
Статус "Исполнена" - заявка была на 100% filled, можно не сомневаться.
Цитата
Сергей написал: что первый и второй биты касаются именно ЗАЯВКИ. Собственно, по-другому их и интерпретировать нельзя. Что значит применительно к сделке "снята" и как сделка может не быть исполнена
Применять к сделкам эти биты никак нельзя. Документация и здравый смысл правы. Смотреть на них в OnTrade() просто не надо. Совсем.
Пользователь
Сообщений: Регистрация: 29.04.2015
13.03.2019 22:21:03
Цитата
SDL написал: Проверки статуса заявок (1-й и 2-й биты flags):
Вот эти можно немного оптимальнее, если так будет понятно:
"Исполнена":
Код
bit.band(order.flags,3) == 0
"Снята":
Код
bit.band(order.flags,3) == 2
Пользователь
Сообщений: Регистрация: 26.02.2015
13.03.2019 22:50:07
Цитата
Применять к сделкам эти биты никак нельзя. Документация и здравый смысл правы. Смотреть на них в OnTrade() просто не надо. Совсем.
Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Код
bit.band(order.flags,1) == 0 and bit.band(order.flags,2) == 0
Код
bit.band(order.flags,3) == 0
Данные два варианта точно эквивалентны? Я всерьез, т.к. не проф. программер и биты не люблю :)
Пользователь
Сообщений: Регистрация: 26.02.2015
14.03.2019 13:47:30
Эксперимент показал, что абсолютно прав. В OnTrade() заявка может быть и снята, и исполнена по флагам, но OnOrder() все равно надо дождаться, т.к. там order.balance может не быть равен нулю. В OnTrade() остаток не проверить.
Пользователь
Сообщений: Регистрация: 29.04.2015
14.03.2019 15:24:25
Цитата
Сергей написал: Данные два варианта точно эквивалентны? Я всерьез, т.к. не проф. программер и биты не люблю :)
Точно эквивалентны. С точки зрения логики это одно и то же условие.
По поводу флагов. Коллеги, поймите простую вещь, кто еще не понял. Биты 0 и 1 в trade.flags анализировать бессмысленно, так как они не отражают текущий статус соответствующей заявки. Для сделок они невалидны и могут иметь любые случайные значения.
Пользователь
Сообщений: Регистрация: 02.07.2015
14.03.2019 18:11:54
Поразительное упорство незамечать на что нужно обратить внимание :) Три человека говорят одно и тоже, а он упорно игнорирует :))
Эта? if bit.band(order.flags,2) > 0 then Это недостаточное условие. Оно отображает только "снята или исполнена", а нужно еще проверять "активна или нет". Как описано здесь:
Сергей написал: Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Что значит "обоснуйте"? Он не хуже. Он другой, и сообщает о других событиях. Это примерно как "обоснуйте почему ноги хуже рук". OnTrade вызывается при приходе сделок(!). И только их. Неважно откуда они взялись. (может брокер за вас исполнил заявку, или маржинколл, или экспирация опционов. Неважно). А OnOrder вызвается когда есть изменения в ЗАЯВКЕ(!). Сделок может и не быть (например если заявка выставлена и тут же снята), и поэтому если нужен статус заявки, то анализировать нужно OnOrder.
Цитата
Сергей написал: OnTrade() стабильно срабатывает раньше OnOrder(), и я б не стал дожидаться ничего другого, если мне в OnTrade() сразу и скажут, что на эту заявку можно "забить", т.к. она более не существует.
OnTrade может срабатывать раньше, может позже. Колбеки - штука асинхронная. Вообще нельзя полагаться на порядок их вызова. Понять что по OnTrade "на заявку можно забить" только в том случае, если все OnTrade-ы по одной заявке (надо отслеживать номер) в сумме дали кол-во указанное в заявке. Но этого может не произойти, потому что частично исполненная заявка может быть снята, и тогда это никогда не произойдет.
Пользователь
Сообщений: Регистрация: 26.02.2015
15.03.2019 09:52:01
Цитата
Imersio Arrigo написал: Поразительное упорство незамечать на что нужно обратить внимание :) Три человека говорят одно и тоже, а он упорно игнорирует :))
А кто третий? Я? Так я автор топика, только переименовался, поскольку Сергеев тут слишком до фига :)
Вопрос в оптимизации. Вот _sk_ утверждал, что менее, чем в 1000 строк управление заявками-сделками организовать нельзя, причем большинство пытается использовать абсолютно все поступающие данные, включая OnTransReply().
Вы используете OnTransReply()? Если да, то зачем?
Цитата
Цитата
Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Что значит "обоснуйте"? Он не хуже. Он другой, и сообщает о других событиях. Это примерно как "обоснуйте почему ноги хуже рук". OnTrade вызывается при приходе сделок(!). И только их. Неважно откуда они взялись. (может брокер за вас исполнил заявку, или маржинколл, или экспирация опционов. Неважно). А OnOrder вызвается когда есть изменения в ЗАЯВКЕ(!). Сделок может и не быть (например если заявка выставлена и тут же снята), и поэтому если нужен статус заявки, то анализировать нужно OnOrder.
OnTrade() прекрасен тем, что приходит только один раз с одним trade_num, а также там есть trans_id из заявки. Есть там и флаги ЗАЯВКИ. Не сделки, не транзакции, а именно заявки. Если бы они корректно показывали, что заявка полностью налита и более не существует, то очень разумно не ждать более ничего в OnOrder().
Цитата
OnTrade может срабатывать раньше, может позже. Колбеки - штука асинхронная. Вообще нельзя полагаться на порядок их вызова. Понять что по OnTrade "на заявку можно забить" только в том случае, если все OnTrade-ы по одной заявке (надо отслеживать номер) в сумме дали кол-во указанное в заявке. Но этого может не произойти, потому что частично исполненная заявка может быть снята, и тогда это никогда не произойдет.
Опять же, вопрос исключительно в поиске оптимального и надежного решения.
Ну, приходит в OnTrade() статус заявки. Как без ваших ответов и экспериментов можно было узнать, что это неправильный путь? Но глобально для меня вопрос решен, спасибо за помощь!