Closed QApplication closed 6 years ago
Оно так происходит на всех вызовах из 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, но это опять же временное решение.
Сделал, но не очень красиво. Пример: https://github.com/elelel/qluacpp-tutorial/blob/80245bbd7850c3b81e3c77932c8b830e21393d4d/log_all_trades/src/log_all_trades.cpp#L92
у меня перестали работать функции 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 до последней версии
Вроде бы исправил (но не проверял)
По существу это не такая проблема, ее стоит рассматривать только исходя из чистоты эксперимента. Время и дата работаю в новом комите.
Проверил, работает, закрываю
При работе с таблицей
datetime
LUACPP_TABLE_FIELD(datetime, ::qlua::table::datetime) // Дата и время
из callbackOnAllTrade
происходит падение терминала.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>)