Для тог, чтобы запустить QLua(Lua) - скрипт в терминале QUIK, в начале нужно поместить его в какую-нибудь папку на Вашем компьютере. Удобно для этого создать новую папку в папке установки терминала, назвать ее, например, "MyLua", или так, как Вам нравится, и хранить в ней все Ваши Lua - скрипты.
Далее, нужно перейти в меню терминала QUIK по пути: "Сервисы" -> "Lua скрипты...". Откроется окно, как на картинке. В этом окне нужно нажать кнопку "Добавить", далее, найти Ваш скрипт, открыть его. Таким образом он добавится в "Загруженные скрипты", после чего, его нужно выделить в этом окне (строка подсветится) и нажать кнопку "Запустить". Если в скрипте нет ошибок, то слева от его названия вместо "красного квадратика" появится "зеленый треугольник", это означает, что скрипт запущен, если в скрипте обнаружились ошибке, то информация об этом будет выведена в подокне "Ошибки выполнения скрипта" данного окна.
Чтобы остановить выполнение скрипта, в любой момент можно нажать кнопку "Остановить", при условии, что выделена строка с нужным скриптом. После запуска скрипта, Вы можете закрыть окно "Доступные скрипты" соответствующими кнопками.
ВАЖНО !!! Если Вы запустили скрипт и затем закрыли терминал QUIK, то при последующем запуске терминала скрипт автоматически запустится !!! Это удобно, например, при использовании скрипта автоматической авторизации.
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Добрый день. Сделал простой скрипт (робот для квика). Работает, но самопроизвольно останавливается в самый неподходящий момент, на мой взгляд без закономерностей.
Помогите, пожалуйста понять, в чем причина. Слип = 0.1. Повторюсь, скрипт очень простой, прим. 120 строк. Используемые ф-и - только чтение стакана и отправка заявок.
Спасибо.
Добрый день. Если никаких ошибок не вылетает при самозавершении, то значит где-то в алгоритме ошибка. Делайте простую отладку, при помощи message(), или в лог-файл выводите шаги, которые в данный момент выполняются и смотрите на каком шаге происходит обрыв, потом более детально проверяйте данный шаг, с выводом значений переменных, которые, например, в условиях каких-то проверяются. Таким образом будете видеть что не так, как Вы ожидаете, работает.
Добрый день,
Отличная статья, однако столкнулся с проблемой запуска луа-скрипта на Quik. Может профи подскажут как ее решить?
Суть. Если добавлять луа -скрипт через соответствующее окно Quik ("Таблицы" -> "Lua" -> "Доступные скрипты") все работает. Но если закрыть Quik, открыть его и запустить скрипт заново, он выдает ошибку! Чтобы он заработал, надо удалить его из окна "Доступные скрипты", затем снова добавить, тогда он работает! Что делать?
Спасибо за любой совет.
PS. Скрипт читает содержимое файла. Путь к файлу прописан filename=getScriptPath().."\\z1.exe"
и хэндл берется без ошибки: f=io.popen(filename,"r")
Ошибка (out=nil) возникает в следующей строчке кода: out = f:read("*n")
Версии Quik и Lua for Win - последние
Здравствуйте! Даже не знаю что это может быть. А Вы закрываете файл по завершению работы скрипта? Что у Вас делает z1.exe и что Вы из него читаете, если не секрет ?
Да, закрываю: f:close()
а из файла я принимаю stdout (одно цифровое значение). К z1.exe нареканий не имею тк его запуск все правильно выводит в консоль (одно цифровое значение)...
?
Кто-то подсказал, что в моем случае надо настроить пути относительно скрипта, т.е. "поиграться" с "package.path" А где находится этот зверь и как правильно настроить путь относительно для моей рабочей директории? Попробовал добавить строку
package.path = getScriptPath() .. "\\z1.exe" -- результат тот же
Кто-нибудь решал эту тему?
На сколько я понимаю, package.path используется только для require(), он даже называется "путь пакетов", чем он поможет popen?
Очевидно, что QUIK теряет путь. Просто подумал про package.path. Если не это, то как получить доступ к путям из скрипта lua? Может теряется LUA_PATH? Как его увидеть из скрипта lua, чтобы проверить, может кто знает?
Попробуйте этот вопрос задать разработчикам на форуме QUIK, возможно это недоработка новой версии терминала. Это в любом случае халатность разработчиков, потому что так быть не должно, поиск пути - задача терминала. Вы же указали где файл (getScriptPath().."\\z1.exe") и он там действительно есть.
Спасибо, так и сделал, жду ответа...
На их форуме нашел похожую проблему в теме "Ошибка при запуске Луа-скрипта". Кому интересно могут погуглить. Хотя ветку они удалили но ее копию можно увидеть в кэше. Так правды там и не нашли...
🙂
Спасибо )) сейчас "прикручу")))
Всегда пожалуйста)))
Дмитрий, добрый день.
Хороший скрипт, удобно!!! Спасибо. )))
Дмитрий, подскажите пожалуйста.
Если QUIK остановил работу, как внешней программой к примеру на С#, дать команду QUIKу, повторно установить связь.
Сейчас приходится закрывать QUIKи и заново их запускаю.
Может можно проще?
Добрый день, Александр! Сейчас найду где у меня эта реализация и отпишусь!
Выдержки из кода C#, отвечающие за работу терминала:
Как сделать, чтобы при нажатии на крестик таблицы скрипта, было эквивалентно остановке скрипта из таблицы "Доступные скрипты"?
IsWindowClosed
Функция возвращает «true», если окно с таблицей «t_id» закрыто.
Например, если у Вас в функции main работает цикл типа while Run do ... end;, то можно сделать так:
Вместо строки "while IsRun do", только тогда нужно вставить строку "while not IsWindowClosed(t_id) and IsRun do"
Спасибо! Получилось
Пожалуйста!
Суть в том, что любой скрипт QLua работает, пока работает функция main(), для того, чтобы функция main() не прекратила свою работу, в ней у Вас находится цикл
Который будет выполняться, пока переменная IsRun равна истине(true), ее значение станет ложным(false), если Вы нажмете кнопку "остановить", тогда вызовется функция OnStop() и в ней переменной IsRun будет присвоено значение false.
И при следующей итерации(прокрутке) цикл while завершит свою работу, т.к. перестанет выполняться условие "ПОКА IsRun истина ДЕЛАТЬ", следовательно функция main() завершит свою работу, т.к. в ней больше не останется задач для выполнения (после цикла while больше нет операторов), а значит и скрипт завершит свою работу.
Строкой "while not IsWindowClosed(t_id) and IsRun do" Вы говорите "ПОКА НЕ закрыто окно И IsRun истина ДЕЛАТЬ", следовательно, когда Вы закрываете окно, условие перестает выполняться и скрипт останавливается по той же схеме.
для запуска можно просто сменить тип файла с *.luac на *.lua
Нет, LuaForWin не установлена. Я раньше пользовался только "портфелями" в квике. Со скриптами не имел дела.. Вообще очень сложно найти в интернете информацию по язкам типа Qlua и LISP рассчитанную именно на пользователя, а не на программиста...
Тогда установите, перезагрузите пк и отпишитесь как будет вести себя скрипт.
Я очень извиняюсь за то что так туплю... Но результатов я никаких не добился. LuaForWindows установил, скрип запустил даблкликом.. Промелькнуло окно командной строки и всё. Из квика скрипт по прежнему не стартует.
Попытался как в старых версиях винды поставить галочку в свойствах ярлыка "не закрывать окно после завершения работы программы", чтобы посмотреть с какой ошибкой завершилась работа, но в win8.1 такого не обнаружил, потому не могу сказать что там в окне командной строки происходит..
Так же попробовал: положил этот уже ненавистный скрипт в папку с Lua4win, запустил с раб.стола ярлык lua, в командной строке написал имя этого скрипта, последовал переход на новую строку с символами ">>" (было ">") - выглядит как успешный старт и приглашение дальше вводить команды.. Дальше не понятно что делать. Еще пробовал перетягивать файл скрипта на luac.exe и на lua.exe - безрезультатно.
Утилита SciTE файлы *.luac не открывает. Через интерфейс этой программы попытался снова создать скрипт с функцией reqiure, получил тот же перечень недостающих файлов.
А может быть Вы мне скинете этот скрипт на reply@quikluacsharp.ru, я попробую с ним повозиться, может быть у меня что-то получится, тогда бы я Вам рассказал в чем проблема.
Спасибо за оперативный ответ!
Опишу подробнее свою ситуацию:
1. Скачал с одного сайта архив, в нем лежит один файл - назовем его script.luac
2. Распаковал архив в папку ...\info\lua\
3. Открыл квик. Таблицы - Lua - просмотр доступных... Нашел распакованный файл. Тыкнул "запустить" - реакции никакой.
4. Создаю файл текстовым редактором - test.lua. В файле пишу require "script". Сохранил, пробую запустить, получаю сообщение:
Info\lua\test.lua:1: module 'script' not found:
no field package.preload['script']
no file '.\script.lua'
no file 'D:\Info\lua\script.lua'
no file 'D:\Info\lua\script\init.lua'
no file 'D:\Info\script.lua'
no file 'D:\Info\script\init.lua'
no file '.\script.dll'
no file 'D:\Info\script.dll'
no file 'D:\Info\loadall.dll'
Мои предположения:
Что-то не в порядке с самим скриптом.
Я не правильно создаю новый скрипт.
Действительно отсутствуют файлы, необходимые для работы скрипта.
Если у Вас на компьютере установлена LuaForWindows, то скорее всего проблема с самим скриптом (кстати, я не совсем правильно Вам до этого написал, его можно и напрямую запускать, без подключения в еще один скрипт, я Вам описал способ подключения библиотеки luac к скрипту, прошу прощения). У Вас установлена LuaForWindows ?
Добрый день! А можно подробнее о запуске *.luac? Спасибо!
Добрый день, Владислав! Luac это скомпилированный lua-файл, когда Вы запускаете скрипт lua в QUIK'е, он сначала компилирует его в luac, и запускает именно скомпилированный файл. Если вам нужно запустить файл luac, нужно создать скрипт lua и подключить в нем файл luac с помощью команды require.
Добрый день!
А как запустить luac ?
Спасибо.
Добрый день, Евгений! Luac подключается сначала к скрипту при помощи конструкции require "имя без .luac", а потом уже этот скрипт запускается в QUIKе.
Ок, получилось!
Спасибо за оперативность)