Ошибка снятия заявки. [GW][3] "Сейчас эта сессия не идет."

Страницы: 1
RSS
Ошибка снятия заявки. [GW][3] "Сейчас эта сессия не идет."
 
Добрый день!
При попытке снять заявку возникла ошибка: Ошибка снятия заявки. [GW][3] "Сейчас эта сессия не идет."
При этом ни OnOrder, ни OnTransReply небыли вызваны.
Как роботу понять что произошла ошибка снятия конкретной заявки, если колбеки не вызываются?
 
У меня так:
Код
function OnParam(class, sec)
  if class == "SPBFUT" and (sec == Tr[1].sec or sec == Tr[2].sec) then
    local sessn = (getParamEx("SPBFUT",sec,"TRADINGSTATUS").param_image == "открыта")
    if sessn and (cond & 0x0080 == 0x0080) then
      cond = cond & 0xFF7F -- Сброс "Сессия стоп".
      SetColor(tw_id, 5, -1, -1, -1, -1, -1)
    elseif not sessn and cond & 0x0080 == 0 then
      cond = cond | 0x0080  -- "Сессия стоп".
      SetColor(tw_id, 5, -1, yellow, -1, -1, -1)
    end
  end
end
Всё пройдет. Но это не точно.
 
Это не решение. Я отправляю транзакцию и хочу получить на нее ответ, чтобы продолжить работу. Пока ответа нет, робот не может выставлять новые заявки. Где роботу взять этот ответ?
 
А зачем Вы отправляете транзакцию, если сессия в это время закрыта?
Если нет OnTransReply и  сессия закрыта, какой вывод должен сделать робот?
Всё пройдет. Но это не точно.
 
А sendTransaction ничего не возвращает?
 
Цитата
paluke написал:
А sendTransaction ничего не возвращает?
Не возвращает
Цитата
Ziveleos написал:
А зачем Вы отправляете транзакцию, если сессия в это время закрыта?
Транзакция отправляется автоматически в ответ на срабатывание заявки.
Заявка сработала в 08:59:21, на что робот среагировал и снял оставшуюся заявку, после чего получил ошибку, которая отобразилась в таблице сообщений.
Цитата
Ziveleos написал:
Если нет OnTransReply и  сессия закрыта, какой вывод должен сделать робот?
Вывод робот делает, но это как-то костыльно. А если это не ошибка, а долгая задержка ответа или косяки на сервере. Хотелось бы получать конкретный ответ, тем более, учитывая что в таблицу сообщений он приходит.

Мы можем проверять состояние сессий перед отправкой транзакции, но даже так мы будем натыкаться на ошибки транзакций в первые секунды неторгового времени.
Поэтому я проверяю состояние сессии после получения ошибки на транзакцию. Как ошибка появляется, тогда уже ждем начала торгов и обрабатываем ошибку.

На данный момент вопрос в том, как роботу получить ответ Ошибка снятия заявки. [GW][3] "Сейчас эта сессия не идет." который отображается в таблице сообщений. Если никак, то нужно реализовать в QUIK такую возможность т.к.  OnTransReply вызывается в ответ на выставление и было бы логично вызывать его в ответ на снятие.  
 
А если, реализовать "Конечный автомат состояний", например доработав функцию Ziveleos,  чтоб не доводить до ошибки?
 1. Чёткое разделение на состояния: Активен/Приостановлен/Авария ...
 2. Автоматические действия при смене состояний (например, отмена ордеров в аварийном режиме или вашей ситуации)?
 
Не очень понятно почему должен быть вызван колбек OnOrder, если никаких изменений с ордером не произошло. Что касается колбека OnTransReply, то использовать его для проверки состояния сессии - это так себе идея. Сессия может быть приостановлена, закрыты торги по инструменту, просто не допущен к торгам в это время и т.д. При этом "долбить" сервер транзакцией в надежде "а вдруг" не даст результата. да и брокер может сказать на это "фи".

У каждого метода есть своё предназначение. Транзакция - для подачи торговых команд и только. Подавать их необходимо когда торги по инструменту проводятся. Поэтому необходимо проверять состояние сессии перед подачей торговой команды.

Правда пример функции не самый удачный, на мой взгляд. Но это дело вкуса, не более. Лишь бы работало.
 
Я не предлагаю использовать OnTransReply для проверки состояния сессии.
OnTransReply вызывается в том числе когда мы выставляем заявку и получаем сообщения:
"Сейчас эта сессия не идет"
"Идет пром. клиринг, нельзя совершать торговые операции"
"Инструмент недопустим в аукционе открытия"
"Торги по этому финансовому инструменту сейчас не проводятся"
"Превышен лимит отправки транзакций для данного логина"
...
И робот видит этот вызов и что он произошел на конкретную транзакцию и дальше обрабатывает эту ошибку.

Сейчас речь идет о том, что при попытке снять заявку вызов OnTransReply не произошел и робот ждет ответ на снятие, но в ответ - ничего. Только сообщение в таблице сообщений которое он не видит.
И нам остается проверять состояние сессии и делать предположение о том, что заявка не снята потому-что попытка снятия отклонена с ошибкой "Сейчас эта сессия не идет."
А если вызов OnTransReply происходил еще и при снятии, то в робота не пришлось бы включать предположения, он мог бы обработать конкретную ситуацию.
Цитата
Nikolay написал:
Подавать их необходимо когда торги по инструменту проводятся.
Цитата
Владислав написал:
Мы можем проверять состояние сессий перед отправкой транзакции, но даже так мы будем натыкаться на ошибки транзакций в первые секунды неторгового времени.
 
Если нет ответа транзакции (т.е. ответа шлюза биржи), то, скорее всего, транзакция не прошла дальше сервера брокера. А значит есть ответ и ошибка самого метода sendTranscation. Где тоже необходимо проверять - ушла ли транзакция на биржу.
 
Код
function KillOrder (sec_info, order_num)
   local transaction = {
      ["TRANS_ID"]      = '1', 
      ["ACTION"]      = "KILL_ORDER",
      ["CLASSCODE"]      = sec_info.class_code,
      ["ORDER_KEY"]      = tostring(order_num)
   }
   local result = sendTransaction(transaction)
   if result == '' then return order_num end
   for key, val in pairs(transaction) do result = result..'\n'..key.."  =  "..tostring(val) end
   error("\nОшибка снятия заявки: "..result)
end
Проверка осуществляется, ошибки нет, робот продолжил работу.
 
Цитата
Nikolay написал:
Правда пример функции не самый удачный, на мой взгляд. Но это дело вкуса, не более. Лишь бы работало.
Что Вас смущает? Как можно улучшить?
Всё пройдет. Но это не точно.
 
Цитата
Nikolay написал:
Если нет ответа транзакции (т.е. ответа шлюза биржи), то, скорее всего, транзакция не прошла дальше сервера брокера. А значит есть ответ и ошибка самого метода sendTranscation. Где тоже необходимо проверять - ушла ли транзакция на биржу.
При попытке отправки транзакции в неторговое время, sendTranscation возвращает ошибку: Ошибка снятия заявки:  Указанная транзакция по указанному классу не найдена: "SPBFUT".

Нашел старые логи по которым видно, что c 08:50 до 08:59 идет аукцион открытия.
Код
[28.01.2025 08:50:33]: status: торгуется
[28.01.2025 08:59:42]: status: приостановлена
[29.01.2025 08:50:40]: status: торгуется
[29.01.2025 08:59:28]: status: приостановлена
[30.01.2025 08:50:38]: status: торгуется
[30.01.2025 08:59:32]: status: приостановлена
[31.01.2025 08:50:36]: status: торгуется
[31.01.2025 08:59:34]: status: приостановлена
[03.02.2025 08:50:38]: status: торгуется
[03.02.2025 08:59:35]: status: приостановлена
[04.02.2025 08:50:41]: status: торгуется
[04.02.2025 08:50:41]: trading_status: открытие
[04.02.2025 08:50:41]: trading_phase: аукцион открытия
[04.02.2025 08:59:09]: status: приостановлена
[04.02.2025 08:59:09]: trading_status: закрыта
[04.02.2025 08:59:11]: trading_phase: закрыта
[05.02.2025 08:50:35]: status: торгуется
[05.02.2025 08:50:35]: trading_status: открытие
[05.02.2025 08:50:35]: trading_phase: аукцион открытия
[05.02.2025 08:59:45]: status: приостановлена
[05.02.2025 08:59:45]: trading_status: закрыта
[05.02.2025 08:59:49]: trading_phase: закрыта

Моя ситуация возникла вчера в 08:59:21, тогда еще был аукцион открытия, поэтому sendTranscation не выдал ошибку.

Поэтому мой вопрос остается открытым)
Цитата
Владислав написал:
Как роботу понять что произошла ошибка снятия конкретной заявки, если колбеки не вызываются?
 
Вы отправили транзакцию на снятие. Она успешно создалась на сервере квика, поэтому на ошибок на создание нет. А сообщение о сессии пришло от биржи, это то же самое, что отправить заявку на покупку с ценой, не попадающей в коридор.
После исполнения сделки в аукционе 08:59:21 (секунды варьируются) до начала торгов 09:00:00 сессия закрыта, снятие и выставление заявок невозможно, вы можете проверить это, попытавшись вручную выставить заявку в 08:59:55
 
Цитата
Владислав написал:
Добрый день!
При попытке снять заявку возникла ошибка: Ошибка снятия заявки. [GW][3] "Сейчас эта сессия не идет."
При этом ни OnOrder, ни OnTransReply небыли вызваны.
Как роботу понять что произошла ошибка снятия конкретной заявки, если колбеки не вызываются?
простой вариант решения проблемы - проверка наличия активных заявок по таблице заявок.
-------------------------
Я для этого формирую специально таблицу активных заявок.
В этой таблице отмечаю состояние заявки.
1) активная
2) отправлена транзакция на снятие
------------------------
Пассивная заявка удаляется из таблицы.
Страницы: 1
Читают тему
Наверх