В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 100% filled? "Не активна" + "исполнена" почему-то не работает. Только флагами и непосредственно в OnTrade() определяется или без order.balance не обойтись?
OnTrade()?
Код
if bit_set(trade.flags, 0) == false and bit_set(trade.flags, 1) == false then
Сергей написал: В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 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() сработал? Определенно о заявках это.
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() просто не надо. Совсем.
Эксперимент показал, что SDL абсолютно прав. В OnTrade() заявка может быть и снята, и исполнена по флагам, но OnOrder() все равно надо дождаться, т.к. там order.balance может не быть равен нулю. В OnTrade() остаток не проверить.
Сергей написал: Данные два варианта точно эквивалентны? Я всерьез, т.к. не проф. программер и биты не люблю :)
Точно эквивалентны. С точки зрения логики это одно и то же условие.
По поводу флагов. Коллеги, поймите простую вещь, кто еще не понял. Биты 0 и 1 в trade.flags анализировать бессмысленно, так как они не отражают текущий статус соответствующей заявки. Для сделок они невалидны и могут иметь любые случайные значения.
Эта? if bit.band(order.flags,2) > 0 then Это недостаточное условие. Оно отображает только "снята или исполнена", а нужно еще проверять "активна или нет". Как описано здесь:
Сергей написал: Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Что значит "обоснуйте"? Он не хуже. Он другой, и сообщает о других событиях. Это примерно как "обоснуйте почему ноги хуже рук". OnTrade вызывается при приходе сделок(!). И только их. Неважно откуда они взялись. (может брокер за вас исполнил заявку, или маржинколл, или экспирация опционов. Неважно). А OnOrder вызвается когда есть изменения в ЗАЯВКЕ(!). Сделок может и не быть (например если заявка выставлена и тут же снята), и поэтому если нужен статус заявки, то анализировать нужно OnOrder.
Цитата
Сергей написал: OnTrade() стабильно срабатывает раньше OnOrder(), и я б не стал дожидаться ничего другого, если мне в OnTrade() сразу и скажут, что на эту заявку можно "забить", т.к. она более не существует.
OnTrade может срабатывать раньше, может позже. Колбеки - штука асинхронная. Вообще нельзя полагаться на порядок их вызова. Понять что по OnTrade "на заявку можно забить" только в том случае, если все OnTrade-ы по одной заявке (надо отслеживать номер) в сумме дали кол-во указанное в заявке. Но этого может не произойти, потому что частично исполненная заявка может быть снята, и тогда это никогда не произойдет.
Imersio Arrigo написал: Поразительное упорство незамечать на что нужно обратить внимание :) Три человека говорят одно и тоже, а он упорно игнорирует :))
А кто третий? Я? Так я автор топика, только переименовался, поскольку Сергеев тут слишком до фига :)
Вопрос в оптимизации. Вот _sk_ утверждал, что менее, чем в 1000 строк управление заявками-сделками организовать нельзя, причем большинство пытается использовать абсолютно все поступающие данные, включая OnTransReply().
Вы используете OnTransReply()? Если да, то зачем?
Цитата
Цитата
Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Что значит "обоснуйте"? Он не хуже. Он другой, и сообщает о других событиях. Это примерно как "обоснуйте почему ноги хуже рук". OnTrade вызывается при приходе сделок(!). И только их. Неважно откуда они взялись. (может брокер за вас исполнил заявку, или маржинколл, или экспирация опционов. Неважно). А OnOrder вызвается когда есть изменения в ЗАЯВКЕ(!). Сделок может и не быть (например если заявка выставлена и тут же снята), и поэтому если нужен статус заявки, то анализировать нужно OnOrder.
OnTrade() прекрасен тем, что приходит только один раз с одним trade_num, а также там есть trans_id из заявки. Есть там и флаги ЗАЯВКИ. Не сделки, не транзакции, а именно заявки. Если бы они корректно показывали, что заявка полностью налита и более не существует, то очень разумно не ждать более ничего в OnOrder().
Цитата
OnTrade может срабатывать раньше, может позже. Колбеки - штука асинхронная. Вообще нельзя полагаться на порядок их вызова. Понять что по OnTrade "на заявку можно забить" только в том случае, если все OnTrade-ы по одной заявке (надо отслеживать номер) в сумме дали кол-во указанное в заявке. Но этого может не произойти, потому что частично исполненная заявка может быть снята, и тогда это никогда не произойдет.
Опять же, вопрос исключительно в поиске оптимального и надежного решения.
Ну, приходит в OnTrade() статус заявки. Как без ваших ответов и экспериментов можно было узнать, что это неправильный путь? Но глобально для меня вопрос решен, спасибо за помощь!