Как и где правильно написать условие по выполненной заявке?

Страницы: 1
RSS
Как и где правильно написать условие по выполненной заявке?, ...когда она не перемещена, не убита, а именно полностью filled?
 
В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 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
 
Цитата
Сергей написал:
В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 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 показывает статусы сделок.

Цитата
Сергей написал:
"Не активна" + "исполнена" почему-то не работает.
Почему не работает? Можно кусочек кода?
 
Цитата
Imersio Arrigo написал:
Цитата
Сергей написал:
В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 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() сработал? Определенно о заявках это.
 
Проверки статуса заявок (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() просто не надо. Совсем.
 
Цитата
SDL написал:
Проверки статуса заявок (1-й и 2-й биты flags):

Вот эти можно немного оптимальнее, если так будет понятно:

"Исполнена":
Код
bit.band(order.flags,3) == 0
"Снята":
Код
bit.band(order.flags,3) == 2
 
Цитата
Применять к сделкам эти биты никак нельзя. Документация и здравый смысл правы. Смотреть на них в OnTrade() просто не надо. Совсем.
Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Код
bit.band(order.flags,1) == 0 and bit.band(order.flags,2) == 0
Код
bit.band(order.flags,3) == 0
Данные два варианта точно эквивалентны? Я всерьез, т.к. не проф. программер и биты не люблю :)
 
Эксперимент показал, что SDL абсолютно прав. В OnTrade() заявка может быть и снята, и исполнена по флагам, но OnOrder() все равно надо дождаться, т.к. там order.balance может не быть равен нулю. В OnTrade() остаток не проверить.
 
Цитата
Сергей написал:
Данные два варианта точно эквивалентны? Я всерьез, т.к. не проф. программер и биты не люблю :)
Точно эквивалентны. С точки зрения логики это одно и то же условие.

По поводу флагов. Коллеги, поймите простую вещь, кто еще не понял. Биты 0 и 1 в trade.flags анализировать бессмысленно, так как они не отражают текущий статус соответствующей заявки. Для сделок они невалидны и могут иметь любые случайные значения.
 
Поразительное упорство незамечать на что нужно обратить внимание :) Три человека говорят одно и тоже, а он упорно игнорирует :))
Цитата
Сергей написал:
Конкретные проверки выше.
Эта?
if bit.band(order.flags,2) > 0 then
Это недостаточное условие. Оно отображает только "снята или исполнена", а нужно еще проверять "активна или нет". Как описано здесь:
Цитата
Сергей написал:
bit.band(order.flags,3) == 0
Это правильный вариант.

Цитата
Сергей написал:
Пожалуйста, обоснуйте. Чем 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() статус заявки. Как без ваших ответов и экспериментов можно было узнать, что это неправильный путь?
Но глобально для меня вопрос решен, спасибо за помощь!
Страницы: 1
Читают тему
Наверх