elelel / qluacpp-tutorial

Tutorial for Qluacpp library (C++ interface for Quik trading terminal)
28 stars 13 forks source link

getItem #9

Open QApplication opened 7 years ago

QApplication commented 7 years ago

функция TABLE getItem (STRING TableName, DOUBLE Index) Такое ощущение, что не хватает входной величины TableName или я не правильно вызываю функцию getItem? api_Lua->getItem('TableName', Index, [this] (const ::qlua::table::firms& firms ) getitem

elelel commented 7 years ago

Имя таблицы и возвращаемый тип данных жестко связаны. Поэтому имя таблицы берется из параметра темплейта. Посмотрите, как сделано примере l2q_spread_bot

QApplication commented 7 years ago

getItemfor table money_limits Компилятор выдал следующую ошибку: contrib\qluacpp\src\qlua\api\table_data.hpp:13: error: incomplete type 'qlua::table::detail::name_for_type' used in nested name specifier l_.call_and_apply(f, 1, "getItem", ::qlua::table::detail::name_for_type

::value(), Index);

elelel commented 7 years ago

Исправил

QApplication commented 7 years ago

getItem('firms')

error getItem('firms'): 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 7 years ago
  try {
    auto n = q.getNumberOf<::qlua::table::firms>();
    if (n < 1) q.message("No firms found");
    for (size_t i = 0; i < n; ++i) {
      using entity = const lua::entity<lua::type_policy<qlua::table::firms>>&;
      q.getItem<::qlua::table::firms>(i, [&q, i] (entity f) {
          std::string s = "Firm [" + std::to_string(i) + "] "  +
                     f().firmid() + " " +
                     f().firm_name() + " " +
                     std::to_string(f().status()) + " " +
            f().exchange() + "\n";
          q.message(s.c_str());
        });

    }
  } catch (std::exception e) {
    q.message(("Error " + std::string(e.what())).c_str());
  }
QApplication commented 7 years ago
`getItem("classes")`

Взял Ваш пример для classes

try { auto n = api_Lua->getNumberOf<::qlua::table::classes>(); if (n < 1) api_Lua->message("No classes found"); message((std::string("row number fnc 'classes' ") + std::to_string(n)).c_str());

    for (size_t i = 0; i < n; ++i) {
        using entity = const lua::entity<lua::type_policy<qlua::table::classes>>&;
        api_Lua->getItem<::qlua::table::classes>(i, [this, i] (entity f)
        {
            std::string s = "Firm [" + std::to_string(i) + "]: "  +
                    "firmid: "     + f().firmid()                   + "; " +
                    "name: "       + f().name()                     + "; " +
                    "code: "       + f().class_code()               + "; " +
                    "npars: "      + std::to_string(f().npars())    + "; " +
                    "nsecs: "      + std::to_string(f().nsecs())    + "\r\n" ;
            message(s.c_str());
        });

    }
} catch (std::runtime_error e) {
    message(("Error " + std::string(e.what())).c_str());
}

и получил ошибку error table: classes: 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>)

QApplication commented 7 years ago
`getItem("trade_accounts")`

в продолжении предыдущего вопроса

try { auto n = api_Lua->getNumberOf<::qlua::table::trade_accounts>(); if (n < 1) api_Lua->message("No trade_accounts found"); message((std::string("row number fnc 'trade_accounts' ") + std::to_string(n)).c_str());

    for (size_t i = 0; i < n; ++i) {
        using entity = const lua::entity<lua::type_policy<qlua::table::trade_accounts>>&;
        api_Lua->getItem<::qlua::table::trade_accounts>(i, [this, i] (entity f)
        {
            std::string s = "Trade_accounts [" + std::to_string(i) + "]: "          +
                    "class_codes: "     + f().class_codes()                         + "; " +
                    "firmid: "          + f().firmid()                              + "; " +
                    "trdaccid: "        + f().trdaccid()                            + "; " +
                    "description: "     + f().description()                         + "; " +
                    "fullcoveredsell: " + std::to_string(f().fullcoveredsell())     + "; " +
                    "main_trdaccid: "   + std::to_string(f().main_trdaccid())       + "; " +
                    "bankid_t0: "       + f().bankid_t0()                           + "; " +
                    "bankid_tplus: "    + f().bankid_tplus()                        + "; " +
                    "trdacc_type: "     + std::to_string(f().trdacc_type())         + "; " +
                    "depunitid: "       + f().depunitid()                           + "; " +
                    "status: "          + std::to_string(f().status())              + "; " +
                    "firmuse: "         + std::to_string(f().firmuse())             + "; " +
                    "depaccid: "        + f().depaccid()                            + "; " +
                    "bank_acc_id: "     + f().bank_acc_id()                         + "; ";
            message(s.c_str());
        });

    }
} catch (std::runtime_error e) {
    message(("Error " + std::string(e.what())).c_str());
}

и получил ошибку error table: trade_accounts: Luacpp entity get: typecheck failed (Lua type at stack index -1 is string; content as string: ) Мое предположение ошибки в переменной trdaccid.

elelel commented 7 years ago

В первом случае навскидку не скажу, но ошибка должна быть в определении какого-то из поля, которое не используется в примере l2q_spread_bot, иначе бы я на нее наткнулся. И скорей всего дело в неправильном наименовании поля. Во втором случае скорей всего ошибка в определении типа поля, то есть одно из полей, которое обозначено в хелпе от Квика как NUMBER на самом деле является STRING. Точнее можно найти, если делать try на каждое поле отдельно: std::string s; try { s = s + f().class_codes(); } catch (std::runtime_error e) { message("Error in field class_codes()") } .... // для каждого поля то же самое message(s.c_str());

QApplication commented 7 years ago

завтра на свежую голову попробую для каждого поля через try catch

QApplication commented 7 years ago

getItem("classes") проблема в "code: " + f().class_code() + "; " причина не понятна, возможно должно быть так "code: " + f().code() + "; "

getItem("trade_accounts") проблема в "main_trdaccid: " + std::to_string(f().main_trdaccid()) + "; " + поле должно быть string

elelel commented 7 years ago

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

QApplication commented 7 years ago

все оставльне таблицы в getItem я проверил - работают нормально, остается не определенным только getItem("classes") с полем class_code().

elelel commented 7 years ago

Нужно иметь в виду, что, чтобы их проверить, в них должны быть данные. Например, если таблица заявок пуста, то там будет 0 записей, и поэтому не вызовется ни один аксесор к полю. В classes у меня кроме class_codes проблемы с двумя другими полями, которые бывают nil.

QApplication commented 7 years ago

Уточняю, проверил все кроме таблиц (ниже), они у меня пустые.

_testing_ccp_holdings
_testing_account_balance
_testing_account_positions
_testing_firm_holding
_testing_futures_client_holding
_testing_neg_deal_reports
_testing_neg_deals
_testing_neg_trades
_testing_orders
_testing_rm_holdings
_testing_stop_orders
_testing_trades