Долгое исполнение сделки

Страницы: 1
RSS
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
 
Доброе утро.
Выставил заявку на демо счете, ожидаю транзакцию OnTransReply, получаю статус = 3, перехожу к ожиданию сделки из функции OnTrade и иногда из этой функции обратного вызова данные приходят более чем через 30 сек.
Пример из таблиц Quick Заявки и Сделки:
Заявка №1182431621 выставлена в 16:37:02 01.10.2020

Сделка №72323274 (Заявка №1182431621) Продажа в 16:37:37 01.10.2020

Это нормальное поведение?

Правильно, что данные по сделку ожидаю от таблицы обратного вызова или нужно другим способом сделки получать?

Спасибо.
 
Зависит от схемы написания Вашего скрипта. Можете использовать колбек, как сигнал, что сделка прошла.
Можете, наоборот, сами читать таблицу сделок, запоминая, допустим, последний индекс, для уменьшения последующих выборок.

Что касается времени срабатывания, то здесь нет понятия "нормально". Можно было бы сказать среднеожидаемое, и оно, действительно, будет небольшим, до 1 сек.
Но сервер брокера может быть загружен, канал связи может плохим и т.д. Так что время может вырастать до минут.

Впрочем, еще есть один вариант, что некорректно производится ожидание сигнала, допустим, цикл ожидания в колбеке.
 
Заявка это заявка, сделка это сделка. Если выставить заявку на покупку по нижнему лимиту, она и вообще никогда не исполнится (ну почти никогда).
 
Цитата
Nikolay написал:
Зависит от схемы написания Вашего скрипта. Можете использовать колбек, как сигнал, что сделка прошла.
Можете, наоборот, сами читать таблицу сделок, запоминая, допустим, последний индекс, для уменьшения последующих выборок.

Что касается времени срабатывания, то здесь нет понятия "нормально". Можно было бы сказать среднеожидаемое, и оно, действительно, будет небольшим, до 1 сек.
Но сервер брокера может быть загружен, канал связи может плохим и т.д. Так что время может вырастать до минут.

Впрочем, еще есть один вариант, что некорректно производится ожидание сигнала, допустим, цикл ожидания в колбеке.
Спасибо за ответ.

Действительно все ответы о сделки приходят до 10 секунд (у меня на это стоит проверка в цикле) и этот самый цикл ожидания организован не в колбэке.
Если я правильно Вас понял,
Код
Можете использовать колбек, как сигнал, что сделка прошла.
то как раз это и делаю - отправляю sendtransaction, в цикле жду ответа от OnTransReply и потом во втором цикле жду ответа от OnTrade.

Если читать таблицу сделок, видимо ничего не изменится, так как там данные появятся в то же время что и данные из OnTrade, верно?
 
Как правильно заметил Anton, сначала надо определиться что за заявку отправляете. Если цена "рыночная", то да, можно ожидать исполнения.

Что касается ожиданий, здесь вопрос организации этих циклов. Корректно не делать их в колбеках. Т.е. отправил транзакцию из main, там же циклы. А колбеки - это просто семафоры, что есть что-то.
Также советую не делать циклы ожидания на транзакции. Если, допустим, скрипт работает с несколькими инструментами, то пока Вы ждете по одному, другие не смогут свои сигналы отработать.
Лучше сделать так, чтобы ответный сигнал вызывал реакцию, но не простой всего алгоритма. Т.е. пока идет сигнал можно было бы выполнять что-то другое.
 
Цитата
Nikolay написал:
Если цена "рыночная", то да, можно ожидать исполнения.
Выставляю так
['ACTION']      = 'NEW_ORDER',
['TYPE']        = 'L',
['TRANS_ID']    = tostring(t_transaction.id),
Цитата
Nikolay написал:
Т.е. отправил транзакцию из main, там же циклы.
Да, реализовано так.
Цитата
Nikolay написал:
Если, допустим, скрипт работает с несколькими инструментами
Пока до такого еще не дошел, один скрипт - один инструмент. За совет спасибо.
Цитата
Nikolay написал:
Лучше сделать так, чтобы ответный сигнал вызывал реакцию, но не простой всего алгоритма. Т.е. пока идет сигнал можно было бы выполнять что-то другое.
Идея хорошая, а можно показать краткий пример?

Спасибо
 
Цитата
Олег написал:
Идея хорошая, а можно показать краткий пример?
Это сложный вопрос. В самом lua нет многопоточности, поэтому надо организовать некие сущности, хранящие состояния и ждущие ответа.
Проще всего это сделать на хеш-таблицах, т.е. на обычных таблицах.

Вы можете при подаче транзакции записать данные в некую таблицу по ключу, допустим код инструмента + номер транзакции.
А далее организовать ожидание когда в этой таблице появится ответная информация. Ответ может туда записаться, в частности колбеком, или сами, опрашивая сделки, ордера, запишете.

Как только ответ получен, делаете что-то дальше. Нет ответа - пропускаете этот инструмент, ждете дальше.
Тогда вы не будете зависеть от того как приходят ответы. В какие-то дни быстро, в какие-то очень медленно. Бывало до 10 минут доходило. Вы не можете предсказать когда он придет, поэтому и не можете поставить некое значение переменной ожидания в простом цикле.
Как организовать ожидание, и саму подачу транзакции, здесь уже как удобнее. Можно через corutine, запуская их и проверяя в них состояние транзакции. Если нет ответа приостанавливаете ее и переходите к следующей.

Можно самому сделать некую сущность "Задача" и периодически опрашивая пул текущих задач, закрывать завершенные.
А можно просто сделать таблицу транзакций, опрашивать ее и проверять состояние самой транзакции (допустим, записанное колбеком onTransReply), ордера, записанное другим колбеком и т.д.
 
Цитата
Nikolay написал:
Цитата
Олег написал:
Идея хорошая, а можно показать краткий пример?
Это сложный вопрос. В самом lua нет многопоточности, поэтому надо организовать некие сущности, хранящие состояния и ждущие ответа.
Проще всего это сделать на хеш-таблицах, т.е. на обычных таблицах.

Вы можете при подаче транзакции записать данные в некую таблицу по ключу, допустим код инструмента + номер транзакции.
А далее организовать ожидание когда в этой таблице появится ответная информация. Ответ может туда записаться, в частности колбеком, или сами, опрашивая сделки, ордера, запишете.

Как только ответ получен, делаете что-то дальше. Нет ответа - пропускаете этот инструмент, ждете дальше.
Тогда вы не будете зависеть от того как приходят ответы. В какие-то дни быстро, в какие-то очень медленно. Бывало до 10 минут доходило. Вы не можете предсказать когда он придет, поэтому и не можете поставить некое значение переменной ожидания в простом цикле.
Как организовать ожидание, и саму подачу транзакции, здесь уже как удобнее. Можно через corutine, запуская их и проверяя в них состояние транзакции. Если нет ответа приостанавливаете ее и переходите к следующей.

Можно самому сделать некую сущность "Задача" и периодически опрашивая пул текущих задач, закрывать завершенные.
А можно просто сделать таблицу транзакций, опрашивать ее и проверять состояние самой транзакции (допустим, записанное колбеком onTransReply), ордера, записанное другим колбеком и т.д.
Спасибо за совет, подумаю над ним.
Страницы: 1
Читают тему
Наверх