Как запустить QLua(Lua) - скрипт в терминале QUIK

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 3, среднее: 5,00 из 5)
Загрузка...

СнимокДля тог, чтобы запустить QLua(Lua)  - скрипт в терминале QUIK, в начале нужно поместить его в какую-нибудь папку на Вашем компьютере. Удобно для этого создать  новую папку в папке установки терминала, назвать ее, например, "MyLua", или так, как Вам нравится, и хранить в ней все Ваши Lua - скрипты.

Далее, нужно перейти в меню терминала QUIK по пути: "Сервисы" -> "Lua скрипты...". Откроется окно, как на картинке. В этом окне нужно нажать кнопку "Добавить", далее, найти Ваш скрипт, открыть его. Таким образом он добавится в "Загруженные скрипты", после чего, его нужно выделить в этом окне (строка подсветится) и нажать кнопку "Запустить". Если в скрипте нет ошибок, то слева от его названия вместо "красного квадратика" появится "зеленый треугольник", это означает, что скрипт запущен, если в скрипте обнаружились ошибке, то информация об этом будет выведена в подокне "Ошибки выполнения скрипта" данного окна.

Чтобы остановить выполнение скрипта, в любой момент можно нажать кнопку "Остановить", при условии, что выделена строка с нужным скриптом. После запуска скрипта, Вы можете закрыть окно "Доступные скрипты" соответствующими кнопками.

ВАЖНО !!! Если Вы запустили скрипт и затем закрыли терминал QUIK, то при последующем запуске терминала скрипт автоматически запустится !!! Это удобно, например, при использовании скрипта автоматической авторизации.

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Как запустить QLua(Lua) - скрипт в терминале QUIK: 52 комментария

  1. Добрый день. Сделал простой скрипт (робот для квика). Работает, но самопроизвольно останавливается в самый неподходящий момент, на мой взгляд без закономерностей.
    Помогите, пожалуйста понять, в чем причина. Слип = 0.1. Повторюсь, скрипт очень простой, прим. 120 строк. Используемые ф-и - только чтение стакана и отправка заявок.
    Спасибо.

    1. Добрый день. Если никаких ошибок не вылетает при самозавершении, то значит где-то в алгоритме ошибка. Делайте простую отладку, при помощи message(), или в лог-файл выводите шаги, которые в данный момент выполняются и смотрите на каком шаге происходит обрыв, потом более детально проверяйте данный шаг, с выводом значений переменных, которые, например, в условиях каких-то проверяются. Таким образом будете видеть что не так, как Вы ожидаете, работает.

  2. Добрый день,

    Отличная статья, однако столкнулся с проблемой запуска луа-скрипта на Quik. Может профи подскажут как ее решить?

    Суть. Если добавлять луа -скрипт через соответствующее окно Quik ("Таблицы" -> "Lua" -> "Доступные скрипты") все работает. Но если закрыть Quik, открыть его и запустить скрипт заново, он выдает ошибку! Чтобы он заработал, надо удалить его из окна "Доступные скрипты", затем снова добавить, тогда он работает! Что делать?

    Спасибо за любой совет.

    PS. Скрипт читает содержимое файла. Путь к файлу прописан filename=getScriptPath().."\\z1.exe"
    и хэндл берется без ошибки: f=io.popen(filename,"r")
    Ошибка (out=nil) возникает в следующей строчке кода: out = f:read("*n")
    Версии Quik и Lua for Win - последние

      1. Да, закрываю: f:close()
        а из файла я принимаю stdout (одно цифровое значение). К z1.exe нареканий не имею тк его запуск все правильно выводит в консоль (одно цифровое значение)...
        ?

      2. Кто-то подсказал, что в моем случае надо настроить пути относительно скрипта, т.е. "поиграться" с "package.path" А где находится этот зверь и как правильно настроить путь относительно для моей рабочей директории? Попробовал добавить строку
        package.path = getScriptPath() .. "\\z1.exe" -- результат тот же
        Кто-нибудь решал эту тему?

          1. Очевидно, что QUIK теряет путь. Просто подумал про package.path. Если не это, то как получить доступ к путям из скрипта lua? Может теряется LUA_PATH? Как его увидеть из скрипта lua, чтобы проверить, может кто знает?

            1. Попробуйте этот вопрос задать разработчикам на форуме QUIK, возможно это недоработка новой версии терминала. Это в любом случае халатность разработчиков, потому что так быть не должно, поиск пути - задача терминала. Вы же указали где файл (getScriptPath().."\\z1.exe") и он там действительно есть.

              1. Спасибо, так и сделал, жду ответа...
                На их форуме нашел похожую проблему в теме "Ошибка при запуске Луа-скрипта". Кому интересно могут погуглить. Хотя ветку они удалили но ее копию можно увидеть в кэше. Так правды там и не нашли...
                🙂

  3. Дмитрий, добрый день.
    Хороший скрипт, удобно!!! Спасибо. )))
    Дмитрий, подскажите пожалуйста.
    Если QUIK остановил работу, как внешней программой к примеру на С#, дать команду QUIKу, повторно установить связь.
    Сейчас приходится закрывать QUIKи и заново их запускаю.
    Может можно проще?

    1. Выдержки из кода C#, отвечающие за работу терминала:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      
      Process ProcQUIK_Data1;
      ...
      //Запускает QUIK от имени администратора(если не ошибаюсь)
      ProcessStartInfo proc = new ProcessStartInfo();
      proc.UseShellExecute = true;
      proc.WorkingDirectory = "D:\\QUIK-DEMO-DATA1";
      proc.FileName = "info.exe";
      proc.Verb = "runas";
      ProcQUIK_Data1 = Process.Start(proc);
      //Ждет, пока процесс начнет отвечать(после запуска), так же проверяется завис ли QUIK
      while (!ProcQUIK_Data1.Responding)
      ...
      //Принудительно завершает процесс
      ProcQUIK_Data1.Kill();
      ...
      //Если процесс завершен
      if (ProcQUIK_Data1.HasExited)
    1. IsWindowClosed

      Функция возвращает «true», если окно с таблицей «t_id» закрыто.

      Например, если у Вас в функции main работает цикл типа while Run do ... end;, то можно сделать так:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      Run  = true;
      t_id = nil;   -- Идентификатор таблицы, который возвращает функция AllocTable()
       
      function main()
         while not IsWindowClosed(t_id) and Run do
            ...
         end;
      end;
       
      function OnStop()
         Run = false;
      end;
      1.  --CLASS_CODE		      = "SPBFUT";	   -- Класс бумаги
        --SEC_CODE		      = "SiU5";
        
        IsRun = true;
        
        Array5MinPurchase = {}; --массив для хранения покупок
        Array5MinSale = {}; --массив для хранения продаж
        LastBarSeconds = 0;  -- Время последнего бара в секундах
        
        TimeInSecond=0;
        
        function main()
           -- Создает таблицу
           CreateTable();
        ---------------------------------------------------
        SetWindowPos(t_id, 1450,725, 420, 120);
           -- Основной цикл
        	while IsRun do
              sleep(1);
           end;
        end;
        
        --- Функция создает таблицу
        function CreateTable()
        	-- Получает доступный id для создания
        	t_id = AllocTable();
        	-- Добавляет 5 колонок
        	AddColumn(t_id, 0, "1", true, QTABLE_INT_TYPE, 15);
        	AddColumn(t_id, 1, "2", true, QTABLE_INT_TYPE, 15);
           AddColumn(t_id, 2, "3", true, QTABLE_INT_TYPE, 15);
           AddColumn(t_id, 3, "4", true, QTABLE_INT_TYPE, 15);
           AddColumn(t_id, 4, "5", true, QTABLE_INT_TYPE, 15);
        	-- Создаем
        	t = CreateWindow(t_id);
        	-- Даем заголовок
        	SetWindowCaption(t_id, "");
           -- Добавляет строку
        	InsertRow(t_id, -1);
           -- Добавляет строку
        	InsertRow(t_id, 2);
           -- Добавляет строку
        	InsertRow(t_id, 3);
           -- Добавляет строку
        	InsertRow(t_id, 4);
           -- Добавляет строку
        	--InsertRow(t_id, 5);
        
        
        end;
        -- Функция вызывается когда пользователь останавливает скрипт
        function OnStop()
           IsRun = false;
        end;  
         
        
        Куда именно нужно вставить "while not IsWindowClosed(t_id) and Run do" ?
        1. Пожалуйста!
          Суть в том, что любой скрипт QLua работает, пока работает функция main(), для того, чтобы функция main() не прекратила свою работу, в ней у Вас находится цикл

          1
          2
          3
          4
          
          -- Основной цикл
          while IsRun do
             sleep(1);
          end;

          Который будет выполняться, пока переменная IsRun равна истине(true), ее значение станет ложным(false), если Вы нажмете кнопку "остановить", тогда вызовется функция OnStop() и в ней переменной IsRun будет присвоено значение false.
          И при следующей итерации(прокрутке) цикл while завершит свою работу, т.к. перестанет выполняться условие "ПОКА IsRun истина ДЕЛАТЬ", следовательно функция main() завершит свою работу, т.к. в ней больше не останется задач для выполнения (после цикла while больше нет операторов), а значит и скрипт завершит свою работу.

          Строкой "while not IsWindowClosed(t_id) and IsRun do" Вы говорите "ПОКА НЕ закрыто окно И IsRun истина ДЕЛАТЬ", следовательно, когда Вы закрываете окно, условие перестает выполняться и скрипт останавливается по той же схеме.

  4. Нет, LuaForWin не установлена. Я раньше пользовался только "портфелями" в квике. Со скриптами не имел дела.. Вообще очень сложно найти в интернете информацию по язкам типа Qlua и LISP рассчитанную именно на пользователя, а не на программиста...

      1. Я очень извиняюсь за то что так туплю... Но результатов я никаких не добился. LuaForWindows установил, скрип запустил даблкликом.. Промелькнуло окно командной строки и всё. Из квика скрипт по прежнему не стартует.

        Попытался как в старых версиях винды поставить галочку в свойствах ярлыка "не закрывать окно после завершения работы программы", чтобы посмотреть с какой ошибкой завершилась работа, но в win8.1 такого не обнаружил, потому не могу сказать что там в окне командной строки происходит..

        Так же попробовал: положил этот уже ненавистный скрипт в папку с Lua4win, запустил с раб.стола ярлык lua, в командной строке написал имя этого скрипта, последовал переход на новую строку с символами ">>" (было ">") - выглядит как успешный старт и приглашение дальше вводить команды.. Дальше не понятно что делать. Еще пробовал перетягивать файл скрипта на luac.exe и на lua.exe - безрезультатно.

        Утилита SciTE файлы *.luac не открывает. Через интерфейс этой программы попытался снова создать скрипт с функцией reqiure, получил тот же перечень недостающих файлов.

  5. Спасибо за оперативный ответ!

    Опишу подробнее свою ситуацию:
    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'

    Мои предположения:
    Что-то не в порядке с самим скриптом.
    Я не правильно создаю новый скрипт.
    Действительно отсутствуют файлы, необходимые для работы скрипта.

    1. Если у Вас на компьютере установлена LuaForWindows, то скорее всего проблема с самим скриптом (кстати, я не совсем правильно Вам до этого написал, его можно и напрямую запускать, без подключения в еще один скрипт, я Вам описал способ подключения библиотеки luac к скрипту, прошу прощения). У Вас установлена LuaForWindows ?

    1. Добрый день, Владислав! Luac это скомпилированный lua-файл, когда Вы запускаете скрипт lua в QUIK'е, он сначала компилирует его в luac, и запускает именно скомпилированный файл. Если вам нужно запустить файл luac, нужно создать скрипт lua и подключить в нем файл luac с помощью команды require.

    1. Добрый день, Евгений! Luac подключается сначала к скрипту при помощи конструкции require "имя без .luac", а потом уже этот скрипт запускается в QUIKе.