elelel / qluacpp

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

Параметры источника данных в колбэке #34

Open kv-gits opened 3 years ago

kv-gits commented 3 years ago

Можно ли как-то организовать в с++ подобный код?

   self.ds:SetUpdateCallback(function(...) updcallback(self, class, security, startpos,...) end)

Чтобы в колбэке была возможность получить параметры источника данных.

elelel commented 3 years ago

К сожалению, я не понял задачу. Функции коллбеков, назначенные статично, статичны, то есть, если они объявлялись через соответствующие макросы luacpp, они будут привязаны к указанной в макросе соответствующей функции С. Если нужно некое условное исполнение кода внутри такого коллбека, то его следует делать внутри этой функции.

kv-gits commented 3 years ago

В lua это называется closure. Это позволяет динамически создавать датасорсы и получать в колбэке их параметры. Хочется просто универсальный интерфейс создания датасорсов через параметры, вместо того, чтобы в коде прописывать колбэк для каждого инструмента.

elelel commented 3 years ago

Если вы хотите создавать функции lua динамически и наначать им соответстующую функцию С, то дела обстоят как я написал выше. Сейчас коллбек назначается так: https://github.com/elelel/qluacpp/blob/34e658fb05dae739b62f4767a227e1d1fddee973/src/qlua/structs/datasource.hpp#L130 То есть функцию надо называть по имени. Поэтому варианта два: либо делать то что делает эта функция внутри и назначать колбеку обработчик, который не доступен в C++ через luacpp (замыканию). В этом случае можно писать код в любом Lua-виде в качестве обработчиков. Либо использовать эту функцию, назначать один обработчик, а диспетчинг делать на C++ внутри этого.

kv-gits commented 3 years ago

диспетчинг делать на C++ внутри этого.

Смысл в том, что без замыкания не получится сделать универсальный диспетчер, потому что в колбэк не поступают данные о самом источнике данных, только его изменения. Придется для каждого источника писать отдельный колбэк, а если их 50-100 или вообще заранее не известно?

Вот тут подробнее описан механизм. http://www.bot4sale.ru/blog-menu/qlua/379-1-collback-for-al-ds.html Имхо, его не хватает в qluacpp и придется часть кода опять на lua делать.

В принципе, можно по другому подойти к вопросу - не делать колбэк к источнику вообще, а диспетчер прописать в глобальном колбэке onAllTrades. Чуть просадка в скорости будет, но тоже относительно чистое решение.

elelel commented 3 years ago

Все что касается DataSource - это работа со свечками Quik, вторичными данными. Поддержка вторичных данных в Qluacpp - скорее "для красоты". Если не писать что-то, что должно передавать именно вторичные данные Quik, например скрипт рисующий свечки точно так же, как это делает Quik, никакого смысла их использовать нет. И тем более нет преимуществ перед работой с первичными данными. Использование onAllTrades естественно предпочтительнее, также см. https://github.com/elelel/qluacpp/issues/24#issuecomment-670823439