Enfernuz / quik-lua-rpc

RPC-сервис для вызова API Lua-библиотеки торгового терминала QUIK (ARQA Technologies)
Apache License 2.0
103 stars 43 forks source link

Падает при вызове getQuoteLevel2_pb2 #49

Closed gojmpz closed 3 years ago

gojmpz commented 4 years ago

Падает на такой ошибке в quik-lua-rpc getQuoteLevel2_pb2:

stack traceback:
    G:\quik\QUIK_BCS\lua\quik-lua-rpc/service.lua:374: in function <G:\quik\QUIK_BCS\lua\quik-lua-rpc/service.lua:373>
    [C]: in function 'table.sinsert'
    ...ua\quik-lua-rpc/impl\protobuf_request_response_serde.lua:461: in function <...ua\quik-lua-rpc/impl\protobuf_request_response_serde.lua:450>
    ...ua\quik-lua-rpc/impl\protobuf_request_response_serde.lua:46: in function 'impl.protobuf_request_response_serde.serialize_response'
    G:\quik\QUIK_BCS\lua\quik-lua-rpc/service.lua:141: in function <G:\quik\QUIK_BCS\lua\quik-lua-rpc/service.lua:98>
    (...tail calls...)
    G:\quik\QUIK_BCS\lua\lzmq\poller.lua:80: in method 'poll'
    G:\quik\QUIK_BCS\lua\lzmq\poller.lua:88: in function <G:\quik\QUIK_BCS\lua\lzmq\poller.lua:85>
    (...tail calls...)
    [C]: in function 'xpcall'
    G:\quik\QUIK_BCS\lua\quik-lua-rpc/service.lua:369: in functi
Abrosimov-a-a commented 4 years ago

Пишет какую-нибудь ошибку, кроме стэк трэйса? А то мне не очень понятно, что ему на ровном месте не понравилось.

BVladimir2 commented 4 years ago

Quik ругается: https://gitlab.com/abrosimov.a.a/qlua/-/issues/4

Сори, не знаю как картинку вставить...

Ошибка, похоже такая же !

Enfernuz commented 4 years ago

Точно пока не знаю, но дело может быть в том, что в скрипте из результата вызова функции GetQuoteLevel2 парсятся переменные bids и offers, в то время как в QLua они называются bid и offer соответственно. https://github.com/Enfernuz/quik-lua-rpc/blob/6f24f12d767e07bae81707950c18ba09b0a95355/impl/protobuf_request_response_serde.lua#L457 Если так, то как оно раньше работало -- мне неведомо (я вроде ж тестил...), ибо, судя по старым версиям документации, эти переменные всегда назывались bid и offer.

Судя по стектрейсу, ошибка, впрочем, внутри цикла, так что навскидку пока не понятно. Проверяю.

gojmpz commented 3 years ago

Есть ли какая-то новая информация по данной ошибке?

gojmpz commented 3 years ago

Я очень плохо знаю Lua, сделав такие изменения в quik-lua-rpc/impl/protobuf_request_response_serde.lua:

result.bids = {}
  for _, v in ipairs(proc_result.bids) do
    --local bid = pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)
    --bid.price = v.price
    --bid.quantity = v.quantity
    table.sinsert(result.bids, {price = v.price, quantity = v.quantity})
  end

  result.offers = {}
  for _, v in ipairs(proc_result.offers) do
    --local offer = pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)
    --offer.price = v.price
    --offer.quantity = v.quantity
    table.sinsert(result.offers, {price = v.price, quantity = v.quantity})
  end

У меня хотя бы стали приходить стаканы.

BVladimir2 commented 3 years ago

тоже плохо знаю lua, но "table.sinsert(" это вставка в таблицу. Но зачем, если "proc_result.bids" и "proc_result.offers" это уже таблицы ? Работать медленнее будет явно...

gojmpz commented 3 years ago

Я очень плохо знаю Lua, сделав такие изменения в quik-lua-rpc/impl/protobuf_request_response_serde.lua:

result.bids = {}
  for _, v in ipairs(proc_result.bids) do
    --local bid = pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)
    --bid.price = v.price
    --bid.quantity = v.quantity
    table.sinsert(result.bids, {price = v.price, quantity = v.quantity})
  end

  result.offers = {}
  for _, v in ipairs(proc_result.offers) do
    --local offer = pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)
    --offer.price = v.price
    --offer.quantity = v.quantity
    table.sinsert(result.offers, {price = v.price, quantity = v.quantity})
  end

У меня хотя бы стали приходить стаканы.

result.bids = proc_result.bids result.offers = proc_result.offers

Enfernuz commented 3 years ago

@gojmpz, с этим кодом cтаканы приходят и наполняются? Если так, то давайте смёрджим.

P.S. Ребята, прошу прощения за задержки. У меня сейчас личные трудности, и сложно находить силы на работу над проектом. Буду признателен за пул-реквесты. Спасибо!

Abrosimov-a-a commented 3 years ago

@Enfernuz Мне кажется, что с этим способом что-то не так:

result.bids = proc_result.bids
result.offers = proc_result.offers

Получается, что мы выпиливаем:

pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)

Не должно такого быть... Попробую потестить сегодня вечером.

gojmpz commented 3 years ago

@Enfernuz Мне кажется, что с этим способом что-то не так:

result.bids = proc_result.bids
result.offers = proc_result.offers

Получается, что мы выпиливаем:

pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)

Не должно такого быть... Попробую потестить сегодня вечером.

Верно, выпиливать pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry) не надо. Я предложил залепуху, чтобы хоть получать стакан. )

gojmpz commented 3 years ago

@Enfernuz Мне кажется, что с этим способом что-то не так:

result.bids = proc_result.bids
result.offers = proc_result.offers

Получается, что мы выпиливаем:

pb.defaults(qlua_pb_types.getQuoteLevel2.QuoteEntry)

Не должно такого быть... Попробую потестить сегодня вечером.

Получилось посмотреть?

Enfernuz commented 3 years ago

Пофиксил в 7f1ecdb. В общем, ничего нового я не придумал -- Вы уже сделали всё за меня. Раньше эта штука работала. Возможно, @Abrosimov-a-a при обновлении репозитория скомпилировал обновлённую версию pb.dll (https://github.com/starwing/lua-protobuf), которая теперь по умолчанию инициализирует для protobuf-полей типа message соответствующие поля в Lua как nil в соответствии со спекой Protocol Buffers.