elelel/qluacpp

datetime table

QApplication opened this issue · 17 comments

При работе с таблицей datetime LUACPP_TABLE_FIELD(datetime, ::qlua::table::datetime) // Дата и время из callback OnAllTrade происходит падение терминала.

err: 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>)

Оно так происходит на всех вызовах из OnAllTrade или только на некоторых?

на всех. пробовал сначала создавать таблицу qlua::table::datetime dt = datetime(); и далее обращался к ее полям, так и непосредственно к конкретному полю таблицы int year = datetime().year(); результат одинаковый.

Вы в своем примере log all trades не используете эту функцию, а вместо ее берете текущее время ПК. Наверное, корректнее брать временную метку из сообщения брокера.

Вы в своем примере log all trades не используете эту функцию, а вместо ее берете текущее время ПК. Наверное, корректнее брать временную метку из сообщения брокера.

Время в этом примере пишется, чтоб показать пользователю разные фактические моменты получения и записи сообщения на единой шкале. Это пример многопоточного приложения, на сегодня единственный корректный из-за особенностей Quik.

уточняю свой тезис.
файл log_all_trades.cpp есть структура

struct all_trade_record {
 std::string       name;
 std::string       class_code;
 std::string       sec_code;
 double            price;
 double            value;
 double            qty;
};

которая испльзуется для обработки данных callback

void OnAllTrade(const lua::state& l,
                ::lua::entity<::lua::type_policy<::qlua::table::all_trades>> data) { ...`

// ...

 all_trade_record r;

        // Copy data from callback
        r.class_code    = data().class_code();
        r.sec_code      = data().sec_code();
        r.price         = data().price();
        r.value         = data().value();
        r.qty           = data().qty();
// ...

При этом в data есть поле data().datetime(); со структурой

LUACPP_TABLE_FIELD(datetime, ::qlua::table::datetime) // Дата и время
namespace qlua {
  namespace table {
    LUACPP_STATIC_TABLE_BEGIN(datetime)
    LUACPP_TABLE_FIELD(mcs, int)
    LUACPP_TABLE_FIELD(ms, int)
    LUACPP_TABLE_FIELD(sec, int)
    LUACPP_TABLE_FIELD(min, int)
    LUACPP_TABLE_FIELD(hour, int)
    LUACPP_TABLE_FIELD(day, int)
    LUACPP_TABLE_FIELD(week_day, int)
    LUACPP_TABLE_FIELD(month, int)
    LUACPP_TABLE_FIELD(year, int)
    LUACPP_STATIC_TABLE_END()
  }
}
LUACPP_STATIC_TABLE_TYPE_POLICY(::qlua::table::datetime)

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

В Вашем примере log all trades фиксируется время получения обезличенной сделки на локальной машине

        rec.all_trade = r;
        // Record creation time
        rec.time = std::chrono::system_clock::now();

а не время сделки с биржы.
При этом собственные попытки получить время из data закончились ошибками.
qlua::table::datetime dt_lua = data().datetime();
Может быть я не правильно обращаюсь к полю datetime в data?
Прошу меня поправить если так.
Если испльзовать время с локальной машины, то как можно сихронизировать время ПК с сервером биржы или брокера?

Если вам нужно время биржи, то конечно нужно получить это время. В примере время биржи не используется, потому что оно там пишется, чтоб показать пользователю асинхронность в условиях многопоточности: когда фактически получили данные и когда фактически записали.
Проблема скорей всего из-за того, что datetime() рассчитывает на стейт, возможно придется переделать это на lambda вместо простой структуры. В ближайшее время постараюсь посмотреть.

Добрый день. Подскажите получается ли попраить ошибку обращения к полю ... = data().datetime();
Реализовал у себя обращение к БД где лежат исторические данные с полем datetime2 в MS SQL. Для того чтобы корректно расположить на одной оси времени исторические данные из БД и данные, полученные с терминала через createdatasourse нужна привязка последних к метке времени. Можно конечно сделать для вех через обычный счетчик типа int, но это опять же временное решение.

у меня перестали работать функции getNumberOf and getItem для таблицы all_trades (не компилируется проект). Хотя сейчас неверное вместо ранее применяемой таблицы all_trades необходимо использовать all_trades_no_datetime

getNumberOf c all_trades_no_datetime не работает?

c all_trades_no_datetime не успел проверить. с all_trades не работает

Да, не будет работать пока и с all_trades_no_datetime

Объединил эти две структуры, теперь работает отовсюду:
https://github.com/elelel/qluacpp-tutorial/blob/22f35bebde0b63089bde84a43a4fa58b5246e61c/log_all_trades/src/log_all_trades.cpp#L91

void getItem(...)
..\..\contrib\qluacpp\include/qluacpp/../../src/qlua/api/table_data.hpp:13:88: error: incomplete type 'qlua::table::detail::name_for_type<qlua::table::all_trades>' used in nested name specifier
   l_.call_and_apply(f, 1, "getItem", ::qlua::table::detail::name_for_type<Table>::value(), Index);                                     
unsigned int getNumberOf()
..\..\contrib\qluacpp\include/qluacpp/../../src/qlua/api/table_data.hpp:33:72: error: incomplete type 'qlua::table::detail::name_for_type<qlua::table::all_trades>' used in nested name specifier
   return getNumberOf(::qlua::table::detail::name_for_type<Table>::value());

у меня ошибка для приведенных функций остались. обновил библиотеку qluacpp до последней версии

Вроде бы исправил (но не проверял)

По существу это не такая проблема, ее стоит рассматривать только исходя из чистоты эксперимента. Время и дата работаю в новом комите.

Проверил, работает, закрываю