nikolz написал: VMLua - это программа и она запускается вызовом lua_pcall, в которой вызываетсясобственно VMLua - эта функция Вот ее тест из sorce code Lua 5.4
Ну тут всё правильно написали про VMLua, что она именно ЗАПУСКАЕТСЯ, а ранее писали, что VMLua РАБОТАЕТ как самостоятельная единица.
Любая программа сначала запускается, а потом работает как самостоятельная единица. Поэтому я и написал - запускается и работает.
Отсюда все и недопонимания возникли. Программа конечно, чтобы начать работать должна быть сначала быть загружена в память, а потом ей должно быть передано управление(call, jmp, return с адресом в стеке, int, может и ещё что есть). Так вот в моём понимании VMLua сначала просто загружена в качестве библиотеки lua53dll и НЕ работает, а работать начинает только тогда, когда нужные функции из неё для компиляции, интерпретации начинают ВЫЗЫВАТЬСЯ, ну или начинает вызываться специальная функция, которая начинает интерпретировать весь скрипт тем же самым образом, но в любом случае библиотека есть и она НЕ работает пока её функции не начнут вызывать. Поэтому Вы всё объединили в кучу - загрузка и передача управления в функцию одной фразой - VMLua уже работает.
Если в скрипте есть операторы, то они исполнятся при загрузке скрипта т е до вызова функций, вернее сказать после компиляции в байт код, но до вызова OnInit и запуска main и вызова каких либо колбеков терминалом. А VMLua до загрузки скрипта. Cкрипт загружается функцией библиотеки Lua. VMLua это интерпретатор байт-кода. Поэтому естественно, что загрузка и компиляция скрипта в байт код выполняется не VM Lua а библиотечной функцией, а вто исполнение этого кода выполняет функция VMLua.
и еще... функция main имеет доступ к функциям библиотеки QLUA потому, что main запускается в дочерней VMLUA, которая запущена в отдельном потоке, но в том же процессе. Функции QLUA предназначены для получения данных из архивов QUIK. ------------------------------------ Если Вы запустите VMLua в новом процессе, например запустив Lua53.exe и в нем загрузите QLua.dll, то в этом процессе функции этой библиотеки не смогу получить доступ к архивам QUIK. Так как обмен между процессорами делается иначе , чем обмен между потоками в одном процессе, --------------------- Т е библиотека QLUA не предназначена для связи процессов. Поэтому для Вашей хотелки надо писать новую библиотеку , а для этого надо SDK который разработчики не дают, либо делать связь между процессами внутри скрипта в QUIK или через файлы или иным способом.
Alexander написал: Я вот бегло посмотрел это. Там пишете, что: "Мне всегда хотелось иметь под рукой консольный аналог lua.exe прямо в папке с QUIK, да еще такой, чтобы можно было выполнять непосредственно скрипты, предназначенные для QUIK,т.е. с возможностью вызова функций QLua."Но я что-то не понял, а откуда там такая функциональность?
Начну с того, что это лишь набросок, который сильно в жизнь пока не пошел. Поэтому что сделано - только то и сделано. Про функциональность - а какая "такая"? тут бы уточнить. Разумеется, я не предполагал, что запущенный через qlua.exe скрипт будет получать информацию из QUIK и отправлять биржевые транзакции. Во всяком случае на тот момент, когда всё это затевалось.
Хотелось просто иметь возможность запускать Lua-скрипт для отладки какого-то алгоритма или какой-то функции. Потом этот отлаженный функционал использовать уже в реальных торговых скриптах.
Однако, если запустить скрипт написанный для QLua в штатном lua.exe, то скрипт вовсе не будет работать, т.к. он в любом случае использует некоторые функции, которые добавлены в QLua. Та же message. Если используется в скрипте - он будет тупо ломаться. А менять постоянно print / message не очень-то удобно.
Вот такие задачи и ставились при написании этой штуковины, не более.
Цитата
Alexander написал: далее в цикле читаются аргументы переданные вместе с именем файла и пишутся в созданную в стеке таблицу и далее создаётся глобальная переменная и ей присваивается эта таблица
Эта функциональность сделана просто по аналогии с lua.exe, это к QLua уже не имеет отношения.
Цитата
Alexander написал: Так же там написали функцию const char *luaL_tolstring(lua_State *L, int idx, size_t *len), зачем? Она же уже есть в Lua.
Но ведь там даже комментарий есть и условная компиляция. luaL_tolstring появилась только в последних версиях Lua, а qlua.exe делался с возможностью компиляции под разные версии Lua, включая 5.1 и 5.2 И так как luaL_tolstring ну очень удобная - я перенес себе ее исходники.
Хотелось просто иметь возможность запускать Lua-скрипт для отладки какого-то алгоритма или какой-то функции. Потом этот отлаженный функционал использовать уже в реальных торговых скриптах.
Однако, если запустить скрипт написанный для QLua в штатном lua.exe, то скрипт вовсе не будет работать, т.к. он в любом случае использует некоторые функции, которые добавлены в QLua. Та же message. Если используется в скрипте - он будет тупо ломаться. А менять постоянно print / message не очень-то удобно.
Вот такие задачи и ставились при написании этой штуковины, не более.
Непонятно, зачем делать отдельное приложение для запуска скрипта вне терминала, если скрипт можно запускать и отлаживать в SciTe?
nikolz, Непонятно, зачем вообще запускать скрипт вне терминала, если он нужен ТОЛЬКО для роаботы с терминалом. А отладить реальный скрипт в таком говне как SciTe В ПРИНЦИПЕ невозможно. А если "хотелось просто иметь возможность запускать Lua-скрипт для отладки какого-то алгоритма или какой-то функции", то запихните этот алгорнитм и эту функцию в отдельный скрипт и отлаживайтесь там хоть до посинения. А после отладки вставите этот "отлаженный функционал уже в реальные торговые скрипты". Да и то непонятно: что мешает отлаживаться в самом торговом скрипте? Лично я только так и поступаю.
Владимир, вы как-то писали, что предусмотрели работу своего скрипта по историческим данным. Для этого вы его тоже в терминале квика запускаете? Если от квика используется пяток функций, вполне можно заместить их "заглушками" и запускать скрипт для отладки через lua.exe. Ну при условии, конечно, что отлаживаются только алгоритмы торговли, а не взаимодействие с глючным терминалом :)
Glukator, Да, в режиме работы по историческим данным скрипт тоже запускается в терминале. Более того, это тот же самый скрипт, просто данные берутся не из ТТТ, а из файла. Ну и задержки, естественно, нет, прорисовки таблицы нет, в результате чего двухмесячный тиковый массив прокручивается секунд за двадцать. Зачем что-то "замещать заглушками"? Зачем возиться с lua.exe? Это точно такой же скрипт, точно такой же запуск, точно такие же торговые алгоритмы. Просто физически те же самые.
Владимир, ну и вы ведь в коде предусмотрели все эти возможности - отсутствие задержек, прорисовки, отправки транзакций, симуляцию сделок (OnTrade же не приходит?) - тоже своего рода "заглушки". Тут уж кому как удобнее - либо сразу встроить все это в рабочий код, либо подменять часть квиковских функций на время работы с данными из файлов. Не шибко одно другого труднее :)
Glukator, Ну да, в коде предусмотрел. В тестовом режиме и в режиме по историческим данным нет никакой отправки транзакций, вместо них вызывается симулятор OnTrade (все заявки немедленно имполняются), а весь остальной код тот же самый. Что тут сложного? Я вот пару недель назад закончил оформление финального скрипта - подрихтовал структуры данных, алгоритмы принятия решений, подправил диалог, удалил устаревшие куски кода, аккуратно всё закомментировал, прокрутил в режиме по историческим данным, посмотрел логи - нормально, запустил в тестовом режиме, денёк поработала - нормально, запустил в боевом режиме (вернее, заменил работавшую предыдущую версию на новую) - и всё сразу заработало. Параллельно крутится тот же скрипт и в тестовом режиме (решил погонять его до конца августа), но уже не с целью отловить оставшиеся глюки, а посмотреть, какие именно тикеры наиболее интересны для моего скрипта, что именно следует вывести из портфеля (здесь ответ уже известен: ничего), а что не мешало бы туда ввести (понятия не имею, посмотрю логи в начале сентября). Код во всех случаях одинаковый и вряд ли уже будет изменён.