elelel/qluacpp

callback OnTransReply

QApplication opened this issue · 9 comments

Добрый день.
При работе с callback OnTransReply возникли следующие проблемы:

  1. в таблице qlua::table::trans_reply файла standalone.hpp отсутсвуют следующие поля
// add from QLUA.chm   QUIK  v7.19.0.51
    LUACPP_TABLE_FIELD(error_code,      int)                                            // Числовой код ошибки. Значение равно «0», если транзакция выполнена успешно
    LUACPP_TABLE_FIELD(error_source,    unsigned int)                                   // Источник сообщения. Возможные значения: «1» – Торговая система; «2» – Сервер QUIK; «3» – Библиотека расчёта лимитов; «4» – Шлюз торговой системы
    LUACPP_TABLE_FIELD(first_ordernum,  double)                                         // Номер первой заявки, которая выставлялась при автоматической замене кода клиента. Используется, если на сервере QUIK настроена замена кода клиента для кросс-сделки
    LUACPP_TABLE_FIELD(gate_reply_time, ::qlua::table::datetime)                        // Дата и время получения шлюзом ответа на транзакцию
  1. отсутствует возможность представить поле
LUACPP_TABLE_FIELD(price,           double                                   )      // Цена *

через optional. Все возможные nil поля просьба заменить через optional

    LUACPP_TABLE_FIELD(order_num,       std::optional<unsigned int>)      // Номер заявки *
    LUACPP_TABLE_FIELD(price,           double                                   )      // Цена *               - error type policy
    LUACPP_TABLE_FIELD(quantity,        std::optional<unsigned int>)      // Количество *
    LUACPP_TABLE_FIELD(balance,         std::optional<unsigned int>)      // Остаток *
    LUACPP_TABLE_FIELD(firm_id,         std::optional<std::string>)       // Идентификатор фирмы *
    LUACPP_TABLE_FIELD(account,         std::optional<std::string>)       // Торговый счет *
    LUACPP_TABLE_FIELD(client_code,     std::optional<std::string>)       // Код клиента *
    LUACPP_TABLE_FIELD(brokerref,       std::optional<std::string>)       // Поручение *
    LUACPP_TABLE_FIELD(class_code,      std::optional<std::string>)       // Код класса *
    LUACPP_TABLE_FIELD(sec_code,        std::optional<std::string>)       // Код бумаги *
    LUACPP_TABLE_FIELD(exchange_code,   std::optional<std::string>)       // Биржевой номер заявки *
  1. В полях с датой и временем
LUACPP_TABLE_FIELD(date_time, ::qlua::table::datetime) // Дата и время
LUACPP_TABLE_FIELD(gate_reply_time, ::qlua::table::datetime)                        // Дата и время получения шлюзом ответа на транзакцию

не возможно достучаться до значений.
При этом, если в callback написать так

::qlua::table::datetime date_time = trans_reply().date_time();
::qlua::table::datetime gate_reply_time= trans_reply().gate_reply_time();

quik не падает. Однако если попробовать обратиться к значениям

int year = trans_reply().date_time().year();

quik падает и try catch не помогает выявить ошибку.
Пробовал даже так на случай если там nil

std::optional<qlua::table::datetime> date_time= trans_reply().date_time();

Возможно необходимо сделать со временем как в callback OnAllTrade.

Обновил в 2efdd93 и 86ef071, но протестировать не могу (нужно обновлять их демо-доступ).

Добрый день.
При обращении к полю ::qlua::table::datetime callback OnTransReply
LUACPP_TABLE_FIELD(date_time, ::qlua::table::datetime) // Дата и время
появляется
EXCEPTION: Luacpp entity get: typecheck failed (Lua type at stack index -1 is nil; content as string: <Oops, got null from Lua when tried to get actual content as string>)

Добрый день.
При обращении к полю ::lua::entity<detail::datetime_type_policy> gate_reply_time{s_, idx_}; // Дата и время получения шлюзом ответа на транзакцию
появляется
Exception thrown at 0x00007FFFF2B1A388 in info.exe: Microsoft C++ exception: std::runtime_error at memory location 0x0000000F705F9A58. EXCEPTION: alltrade table does not have datetime table member

оба поля с датами находятся в файле standalone.hpp

Для проверки использую не тестовую версию QUIKа: при запущенном плагине достаточно отключиться от сервера и подключиться заново, при этом срабатывают некоторые колбеки, в том числе и OnTransReply(args...)

Добавил в политику субтаблиц с датой/временем параметр имени в 88be8a8
Проверить, исправило ли эту ошибку пока не могу.

На поле date_time продолжает кидаться исключение
Luacpp entity get: typecheck failed (Lua type at stack index -1 is nil; content as string: <Oops, got null from Lua when tried to get actual content as string>)
На поле gate_reply_time исключение НЕ кидается.

Для проверки использую не тестовую версию QUIKа: при запущенном плагине достаточно отключиться от сервера и подключиться заново, при этом срабатывают некоторые колбеки, в том числе и OnTransReply(args...)

На Quik 8.1 демо не наблюдаю такого поведения

На поле date_time продолжает кидаться исключение
Luacpp entity get: typecheck failed (Lua type at stack index -1 is nil; content as string: <Oops, got null from Lua when tried to get actual content as string>)
На поле gate_reply_time исключение НЕ кидается.

Исправил в b5c8f31, проверьте

На Quik 8.1 демо не наблюдаю такого поведения

Я тоже был удивлен и qiuk-разработчики не знают ответа

работает отлично, можно закрывать issue