elelel / qluacpp

C++ interface for Quik trading terminal via lua bindings
48 stars 26 forks source link

datetime table #12

Closed QApplication closed 6 years ago

QApplication commented 6 years ago

При работе с таблицей 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>)

elelel commented 6 years ago

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

QApplication commented 6 years ago

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

QApplication commented 6 years ago

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

elelel commented 6 years ago

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

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

QApplication commented 6 years ago

уточняю свой тезис. файл 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? Прошу меня поправить если так. Если испльзовать время с локальной машины, то как можно сихронизировать время ПК с сервером биржы или брокера?

elelel commented 6 years ago

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

QApplication commented 6 years ago

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

elelel commented 6 years ago

Сделал, но не очень красиво. Пример: https://github.com/elelel/qluacpp-tutorial/blob/80245bbd7850c3b81e3c77932c8b830e21393d4d/log_all_trades/src/log_all_trades.cpp#L92

QApplication commented 6 years ago

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

elelel commented 6 years ago

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

QApplication commented 6 years ago

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

elelel commented 6 years ago

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

elelel commented 6 years ago

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

QApplication commented 6 years ago
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 до последней версии

elelel commented 6 years ago

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

QApplication commented 6 years ago

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

elelel commented 6 years ago

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