Вопрос к разработчикам.
Столкнулся с очень странным эффектом при работе callback-функции OnOrder().
Картина следующая. Работает скрипт, выставляется заявка, отрабатывает. Далее следуют два вызова OnOrder() в ситуации, когда оба раза флаги показывают, что заявка снята. Но двойной вызов OnOrder() на СНЯТОЙ заявке - это еще ладно, проблема в другом.
Суть проблемы.
В скрипте создан массив, куда заносятся номера выставленных заявок. После того, как заявка снята, соответствующий элемент с order_num снятой заявки из массива исключается. СУЩЕСТВЕННО: обе операции - и включение в массив заявки , и исключение ее из этого массива происходят именно в OnOrder(), а не где-либо еще в скрипте.
Трассируя функцию OnOrder(), обнаружил, что почти мгновенно происходят ДВА ее вызова при снятии заявки ( lags показывает, что заявка снята), но при этом оба вызова, проходя через тело OnOrder(), отрабатывают, как если бы в первом вызове не было указано, что заявка на биржевом сервере уже снята, и она с ее order_num не была бы исключена из массива.
Я могу понять такую ситуацию, если допустить что два эти вызова OnOrder() происходят из РАЗНЫХ потоков. Тогда - да, возможна ситуация, что VM LUA еще не успела полностью отработать код OnOrder(), вызванный первым потоком, тогда как сразу же запустилось исполнение экземпляра OnOrder(), созданного для второго потока.
Но разработчики QUIK все время говорят, что ВСЕ вызовы callback-функций со стороны терминала происходят исключительно в главном (т.е. одном и том же) потоке терминала. В этом случае описанного мною эффекта достичь не получится, так как обработка второго вызова OnOrder() для уже снятой заявки произойдет только после полного завершения отработки первого вызова OnOrder(), который априори исключит данную заявку по ее order_num из массива.
На мой взгляд возможны два варианта:
а) вызовы callback-функций, в том числе и OnOrder(), ДЕЙСТВИТЕЛЬНО происходят из разных потоков терминала, а не только из одного единственного - главного; при этом очередность вызовов не предустановлена, и тогда руководство по QLUA и комментарии на форуме от разработчиков вводят нас в явное заблуждение.
б) разработчики не знают, какой конкретно поток внутри терминала может в конкретный момент времени - помимо ОСНОВНОГО потока рабочего места QUIK - вклиниться в цепочку вызовов callback-функций. И имеют в виду, что?, к примеру, вызов OnOrder() происходит не строго, а ПРЕИМУЩЕСТВЕННО в главном потоке терминала, что допускает такие вызовы и другими потоками терминала, в том числе и с неуловимой для VM QLUA задержкой по времени вызова.
Прошу разработчиков прокомментировать изложенное, и - либо подтвердить один из вариантов, либо опровергнуть.
Вопрос очень существенный.
Столкнулся с очень странным эффектом при работе callback-функции OnOrder().
Картина следующая. Работает скрипт, выставляется заявка, отрабатывает. Далее следуют два вызова OnOrder() в ситуации, когда оба раза флаги показывают, что заявка снята. Но двойной вызов OnOrder() на СНЯТОЙ заявке - это еще ладно, проблема в другом.
Суть проблемы.
В скрипте создан массив, куда заносятся номера выставленных заявок. После того, как заявка снята, соответствующий элемент с order_num снятой заявки из массива исключается. СУЩЕСТВЕННО: обе операции - и включение в массив заявки , и исключение ее из этого массива происходят именно в OnOrder(), а не где-либо еще в скрипте.
Трассируя функцию OnOrder(), обнаружил, что почти мгновенно происходят ДВА ее вызова при снятии заявки ( lags показывает, что заявка снята), но при этом оба вызова, проходя через тело OnOrder(), отрабатывают, как если бы в первом вызове не было указано, что заявка на биржевом сервере уже снята, и она с ее order_num не была бы исключена из массива.
Я могу понять такую ситуацию, если допустить что два эти вызова OnOrder() происходят из РАЗНЫХ потоков. Тогда - да, возможна ситуация, что VM LUA еще не успела полностью отработать код OnOrder(), вызванный первым потоком, тогда как сразу же запустилось исполнение экземпляра OnOrder(), созданного для второго потока.
Но разработчики QUIK все время говорят, что ВСЕ вызовы callback-функций со стороны терминала происходят исключительно в главном (т.е. одном и том же) потоке терминала. В этом случае описанного мною эффекта достичь не получится, так как обработка второго вызова OnOrder() для уже снятой заявки произойдет только после полного завершения отработки первого вызова OnOrder(), который априори исключит данную заявку по ее order_num из массива.
На мой взгляд возможны два варианта:
а) вызовы callback-функций, в том числе и OnOrder(), ДЕЙСТВИТЕЛЬНО происходят из разных потоков терминала, а не только из одного единственного - главного; при этом очередность вызовов не предустановлена, и тогда руководство по QLUA и комментарии на форуме от разработчиков вводят нас в явное заблуждение.
б) разработчики не знают, какой конкретно поток внутри терминала может в конкретный момент времени - помимо ОСНОВНОГО потока рабочего места QUIK - вклиниться в цепочку вызовов callback-функций. И имеют в виду, что?, к примеру, вызов OnOrder() происходит не строго, а ПРЕИМУЩЕСТВЕННО в главном потоке терминала, что допускает такие вызовы и другими потоками терминала, в том числе и с неуловимой для VM QLUA задержкой по времени вызова.
Прошу разработчиков прокомментировать изложенное, и - либо подтвердить один из вариантов, либо опровергнуть.
Вопрос очень существенный.