1 (2022-11-18 00:13:01 отредактировано Serg_)

Тема: OnAllTrade на Lua C API

Подскажите пожалуйста, а как вызвать функцию OnAllTrade на Lua C ?

Что то я в ступор встал - одно дело к примеру вызывать CreateDataSource для которого нужно указывать callback функцию и создать callback-функцию на Си.

А тут нет callback функции, собственно сама OnAllTrade - является одной глобальной callback-функцией.


Ну то есть я могу поместить на стек эту функцию:

lua_getglobal(L, "OnAllTrade ");

И вызвать lua_pcall...  ну дальше то что ? Это же не "обычная" функция.

Но, на этом мое понимание заканчивается. sad

2

Re: OnAllTrade на Lua C API

Вам её не надо вызывать. Её вызовет quik
Вам надо сделать на Си обычную луа функцию и зарегистрировать её в качестве глобальной.

lua_pushcfunction
lua_setglobal

3

Re: OnAllTrade на Lua C API

Что то не работает. Сделал вот так:


static int global_callback__OnQuote(lua_State* L)
{
    std::cout << "global_callback__OnQuote" << std::endl;

    return 0;
}



int main()
{

lua_pushcfunction(L, global_callback__OnQuote);
lua_setglobal(L, "OnQuote");

}

Ошибок вроде бы нет, но функция global_callback__OnQuote - не вызывается Квиком.
Предварительно заказ получение стакана я конечно же сделал, да и в Квике у меня стаканы открыты.

4

Re: OnAllTrade на Lua C API

Serg_ пишет:
int main()
{
lua_pushcfunction(L, global_callback__OnQuote);
lua_setglobal(L, "OnQuote");
}

main??
Наверное все же в luaopen_XXX код инициализации, инаеч не понятно откуда у вас L берется

5 (2022-11-28 13:58:20 отредактировано Serg_)

Re: OnAllTrade на Lua C API

swerg пишет:
Serg_ пишет:
int main()
{
lua_pushcfunction(L, global_callback__OnQuote);
lua_setglobal(L, "OnQuote");
}

main??
Наверное все же в luaopen_XXX код инициализации, инаеч не понятно откуда у вас L берется


Это я автоматом написал. Там естественно не int main, а функция из dll вызываемая скриптом из самого Квика, которая и передает "L".

Но суть в том, что установленная глобальной функция, как "OnQuote" - почему то не хочет вызываться Квиком.

6 (2022-11-28 14:51:14 отредактировано swerg)

Re: OnAllTrade на Lua C API

Serg_ пишет:

не int main, а функция из dll вызываемая скриптом из самого Квика, которая и передает "L"

Поздно. Надо делать в luaopen_XXX

Есть нюанс в том, как QUIK распознает наличие callback-функций.
Когда загружается Lua-скрипт, он выполняется, что приводит к
1) выполнению кода, находящегося все function
2) формированию в глобальной области видимости имен переменных-функций с именами, указанных в function

Пункт 2) - это особенность Lua, когда синтаксис описания функций на самом деле просто определяет глобальные переменные с тем же именем, что названа функция, тип у этих переменных "функция", и содержимое равно описанию функции.

Пункты 1) и 2) делает сам интерпретатор Lua.
После этого QUIK просматривает все глобальные определения, ищет среди них известные имена callback-функций и для тех callback, которые находит, у себя прописывает признак "такой callback найден".
Далее, когда возникает то или иное событие, QUIK смотрит был ли определен соответствующий callback, и если был - то он вызывается, а если не был -то не вызывается.
Т.е. если какой-то callback не был определен на старте скрипта - то он уже никогда не вызовется, даже если в процессе работы скрипта его доопределить (синтаксис Lua это позволяет).

Эта особенность работы давно была обнаружена при использовании Lua в QUIK, про нее надо просто знать и учитывать. Сделано разработчиками видимо для ускорения, чтобы для каждого события не сканировать заново глобальные определения в поисках функции-обработчика.

Соответственно у вас при определении callback в dll происходит тоже самое: стартовый скрипт загружается, выполняется, в этот момент  из библиотеки вызывается  luaopen_XXX. Если эта функция что-то добавила в глобальную область видимости - то соответствующие callback будут вызываться; если не добавила - то потом уже добавлять какие-то callback-функции бесполезно, QUIK про них не знает (на этапе загрузки скрипта) и вызывать не будет.

7

Re: OnAllTrade на Lua C API

Что то я видимо все равно не так делаю.

Перенес установку "OnQuote" в luaopen_xxx ... однако callback все равно не вызывается.

8

Re: OnAllTrade на Lua C API

Оказалось, что еще в самом Lua-Скрипте нужно еще прописать вызов OnQuote.

Спасибо теперь все работает!

9

Re: OnAllTrade на Lua C API

Serg_ пишет:

в Lua-Скрипте нужно еще прописать вызов OnQuote.

Это как? можно код? Что вы вызываете в Lua-Скрипте?

10

Re: OnAllTrade на Lua C API

swerg пишет:
Serg_ пишет:

в Lua-Скрипте нужно еще прописать вызов OnQuote.

Это как? можно код? Что вы вызываете в Lua-Скрипте?

Вот это:

function OnQuote(class, sec)
end

Если я этого не прописываю в Lua-срипте, то в dll-моя функция объявленная через lua_setglobal - не вызывается.