Здравствуйте. Иногда бывает такое, что робот пытаясь либо выставить заявку, либо изменить её, либо снять, отправляет транзакцию, и не дождавшись ответа, происходит обрыв связи с сервером. Когда связь восстанавливается, робот не знает, что случилось с заявкой. Я пытаюсь получить состояние заявки из таблицы заявок, но проблема в том, что при восстановлении связи окно квика часто зависает на некоторое время, и в это время getOrder_by_ID и getOrder_by_Number возвращают ответ, аналогичный ответу при отсутствии заявки, хотя заявка на самом деле существует. Когда квик перестаёт висеть, приходит нормальный ответ с существующей заявкой. Но как роботу понять, перестал квик висеть или нет, я не знаю. Есть ли какое-то решение, как роботу корректно восстановить статусы заявок, которые ему неизвестны, после восстановления связи?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.05.2026 19:23:53
Это так часто уже обсуждалось на форуме. Необходимо организовать процедуру ожидания загрузки данных с сервера брокера. К сожалению, разработчики считают, что это не проблема, поэтому никаких конкретных методов для этого нет.
Что можно сделать: - Сравнивать время последнего полученного пакета и время сервера, чтобы расхождение укладывалось в допустимую дельту. - Также можно сравнивать время сервера и локальное время, но оно должно быть точным. - Если в процессе работы были установлены ордера, то необходимо запоминать число записей в таблицах и после восстановления связи ожидать пока там не появится необходимое число записей, или хотя бы отличное от нуля. - Ожидать загрузки таблиц денежных лимитов и лимитов срочной секции (если есть)
т.е. процедуры проверки, что в таблицах данные есть, что пакеты данных догнали время сервера.
Пользователь
Сообщений: Регистрация: 24.01.2022
27.05.2026 20:56:16
Nikolay, спасибо, конечно, но это всё ненадёждные методы. А как найти то, что уже обсуждалось на форуме? Я немного поискал, но ничего не нашёл.
Пользователь
Сообщений: Регистрация: 30.01.2015
28.05.2026 07:33:40
Цитата
Максим Трейдер написал: Здравствуйте. Иногда бывает такое, что робот пытаясь либо выставить заявку, либо изменить её, либо снять, отправляет транзакцию, и не дождавшись ответа, происходит обрыв связи с сервером. Когда связь восстанавливается, робот не знает, что случилось с заявкой. Я пытаюсь получить состояние заявки из таблицы заявок, но проблема в том, что при восстановлении связи окно квика часто зависает на некоторое время, и в это время getOrder_by_ID и getOrder_by_Number возвращают ответ, аналогичный ответу при отсутствии заявки, хотя заявка на самом деле существует. Когда квик перестаёт висеть, приходит нормальный ответ с существующей заявкой. Но как роботу понять, перестал квик висеть или нет, я не знаю. Есть ли какое-то решение, как роботу корректно восстановить статусы заявок, которые ему неизвестны, после восстановления связи?
Попробуйте проверять время сервера : getInfoParam
Функция возвращает значения параметров информационного окна (пункт меню Система / О программе / Информационное окно…).
Формат вызова:
STRING getInfoParam (STRING param_name)
Параметр «param_name» может принимать значения, представленные в таблице.
Значение параметра
Описание
VERSION
Версия программы
TRADEDATE
Дата торгов
SERVERTIME
Время сервера
LASTRECORDTIME
Время последней записи
NUMRECORDS
Число записей
LASTRECORD
Последняя запись
LATERECORD
Отставшая запись
CONNECTION
Соединение
IPADDRESS
IP-адрес сервера
IPPORT
Порт сервера
IPCOMMENT
Описание соединения
SERVER
Описание сервера
SESSIONID
Идентификатор сессии
USER
Пользователь
USERID
ID пользователя
ORG
Организация
MEMORY
Занято памяти
LOCALTIME
Текущее время
CONNECTIONTIME
Время на связи
MESSAGESSENT
Передано сообщений
ALLSENT
Передано всего байт
BYTESSENT
Передано полезных байт
BYTESPERSECSENT
Передано за секунду
MESSAGESRECV
Принято сообщений
BYTESRECV
Принято полезных байт
ALLRECV
Принято всего байт
BYTESPERSECRECV
Принято за секунду
AVGSENT
Средняя скорость передачи
AVGRECV
Средняя скорость приема
LASTPINGTIME
Время последней проверки связи
LASTPINGDURATION
Задержка данных при обмене с сервером
AVGPINGDURATION
Средняя задержка данных
MAXPINGTIME
Время максимальной задержки
MAXPINGDURATION
Максимальная задержка данных
Пример:
function main( ) params = {"VERSION", "TRADEDATE", "SERVERTIME", "LASTRECORDTIME", "NUMRECORDS", "LASTRECORD","LATERECORD", "CONNECTION", "IPADDRESS", "IPPORT", "IPCOMMENT", "SERVER", "SESSIONID", "USER", "USERID", "ORG", "MEMORY", "LOCALTIME", "CONNECTIONTIME", "MESSAGESSENT", "ALLSENT", "BYTESSENT", "BYTESPERSECSENT", "MESSAGESRECV", "BYTESRECV", "ALLRECV", "BYTESPERSECRECV", "AVGSENT", "AVGRECV", "LASTPINGTIME", "LASTPINGDURATION", "AVGPINGDURATION", "MAXPINGTIME", "MAXPINGDURATION"} file = io.open("res.txt", "w+t") for key,v in ipairs(params) do file:write(v .. " = " .. getInfoParam(v) .. "\n") end file:close() end