Архив рубрики: QLua основы

Компиляция скрипта QLua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основыЧтобы скомпилировать(получить байт-код) Ваш скрипт, Вам понадобится файл luac.exe, находится в корневом каталоге Вашей LuaForWindows, если у Вас ее еще нет, то установите отсюда code.google.com
Затем, положите в папку с Вашим скриптом копию файла luac.exe, создайте в этой папке текстовый файл, добавьте в него строчку:
luac.exe -o MyScript.luac MyScript.lua
"MyScript" замените на имя Вашего скрипта и сохраните этот файл под любым названием, главное с расширением .bat
Теперь выполните этот файл и в папке появится еще один файл с расширением .luac, перекиньте его куда-нибудь, поменяйте его расширение на .lua и запускайте в терминале как обычный скрипт.

Тот же результат можно получить программным путем:

1
2
3
local f = io.open(FilePathLuac, 'wb')        -- FilePathLuac по этому пути будет создан скомпилированный файл, например: "C:\\MyScript.lua"
f:write(string.dump(loadfile(FilePathSrc)))  -- FilePathSrc путь к Вашему исходному файлу .lua
f:close()

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

Из QLua (Lua) в Excel (CSV)

Автор записи: Дмитрий (Admin)

csvФайл CSV-формата это обычный текстовый файл, с которым Excel и аналогичные программы могут работать как с таблицей. Каждая строка таблицы в этом файле записывается как новая строка со знаком переноса в конце, а значения полей разделены между собой каким-то символом, чаще ";". В самой первой строке такого файла можно (не обязательно) указать названия столбцов, так же через ";".

Ниже приведен пример создания такого файла и записи в него данных о совершенных сделках средствами QLua(Lua):
Смотреть полностью...

Список констант тайм-фреймов графиков

Автор записи: Дмитрий (Admin)

Qlua-основы

INTERVAL_TICK -- (0)       Тиковые данные
INTERVAL_M1   -- (1)       1 минута
INTERVAL_M2   -- (2)       2 минуты
INTERVAL_M3   -- (3)       3 минуты
INTERVAL_M4   -- (4)       4 минуты
INTERVAL_M5   -- (5)       5 минут
INTERVAL_M6   -- (6)       6 минут
INTERVAL_M10  -- (10)      10 минут
INTERVAL_M15  -- (15)      15 минут
INTERVAL_M20  -- (20)      20 минут
INTERVAL_M30  -- (30)      30 минут
INTERVAL_H1   -- (60)      1 час
INTERVAL_H2   -- (120)     2 часа
INTERVAL_H4   -- (240)     4 часа
INTERVAL_D1   -- (1440)    1 день
INTERVAL_W1   -- (10080)   1 неделя
INTERVAL_MN1  -- (23200)   1 месяц

Функция для работы с битовыми флагами в Qlua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы

Сейчас в QLua появилась встроенная функция bit.test, которая решает ту же задачу, т.е. смысла в использовании функции CheckBit больше нет !

true - флаг установлен
false - флаг не установлен

-- Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
   -- Проверяет, что переданные аргументы являются числами
   if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!") end
   if type(_bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!") end
 
   if _bit == 0 then _bit = 0x1
   elseif _bit == 1 then _bit = 0x2
   elseif _bit == 2 then _bit = 0x4
   elseif _bit == 3 then _bit  = 0x8
   elseif _bit == 4 then _bit = 0x10
   elseif _bit == 5 then _bit = 0x20
   elseif _bit == 6 then _bit = 0x40
   elseif _bit == 7 then _bit  = 0x80
   elseif _bit == 8 then _bit = 0x100
   elseif _bit == 9 then _bit = 0x200
   elseif _bit == 10 then _bit = 0x400
   elseif _bit == 11 then _bit = 0x800
   elseif _bit == 12 then _bit  = 0x1000
   elseif _bit == 13 then _bit = 0x2000
   elseif _bit == 14 then _bit  = 0x4000
   elseif _bit == 15 then _bit  = 0x8000
   elseif _bit == 16 then _bit = 0x10000
   elseif _bit == 17 then _bit = 0x20000
   elseif _bit == 18 then _bit = 0x40000
   elseif _bit == 19 then _bit = 0x80000
   elseif _bit == 20 then _bit = 0x100000
   end
 
   if bit.band(flags,_bit ) == _bit then return true
   else return false end
end
Пример использования
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Run = true;
 
function main()
   -- ОСНОВНОЙ ЦИКЛ
   while Run do
      sleep(500);
   end;
end;
 
function OnOrder(order)
   --бит 0 (0x1)     Заявка активна, иначе – не активна
   --бит 1 (0x2)     Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена
   --бит 2 (0x4)     Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL)
   --бит 3 (0x8)     Заявка лимитированная, иначе – рыночная
   --бит 4 (0x10)    Разрешить / запретить сделки по разным ценам
   --бит 5 (0x20)    Исполнить заявку немедленно или снять (FILL OR KILL)
   --бит 6 (0x40)    Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту
   --бит 7 (0x80)    Для адресных заявок – заявка получена от контрагента
   --бит 8 (0x100)   Снять остаток
   --бит 9 (0x200)   Айсберг-заявка
 
   -- Проверка бита 2
   if CheckBit(order.flags, 2) then
      message("Заявка на продажу");
   else
      message("Заявка на покупку");
   end;
end;
 
function OnStop()
   Run = false;
end;
 
-- Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
   -- Проверяет, что переданные аргументы являются числами
   if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!") end
   if type(_bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!") end
 
   if _bit == 0 then _bit = 0x1
   elseif _bit == 1 then _bit = 0x2
   elseif _bit == 2 then _bit = 0x4
   elseif _bit == 3 then _bit  = 0x8
   elseif _bit == 4 then _bit = 0x10
   elseif _bit == 5 then _bit = 0x20
   elseif _bit == 6 then _bit = 0x40
   elseif _bit == 7 then _bit  = 0x80
   elseif _bit == 8 then _bit = 0x100
   elseif _bit == 9 then _bit = 0x200
   elseif _bit == 10 then _bit = 0x400
   elseif _bit == 11 then _bit = 0x800
   elseif _bit == 12 then _bit  = 0x1000
   elseif _bit == 13 then _bit = 0x2000
   elseif _bit == 14 then _bit  = 0x4000
   elseif _bit == 15 then _bit  = 0x8000
   elseif _bit == 16 then _bit = 0x10000
   elseif _bit == 17 then _bit = 0x20000
   elseif _bit == 18 then _bit = 0x40000
   elseif _bit == 19 then _bit = 0x80000
   elseif _bit == 20 then _bit = 0x100000
   end
 
   if bit.band(flags,_bit ) == _bit then return true
   else return false end
end

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

Пример работы с файлами в QLua (Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- Флаг поддержания работы скрипта
IsRun = true;
 
function main()
   -- Пытается открыть файл в режиме "чтения/записи"
   f = io.open(getScriptPath().."\\Test.txt","r+");
   -- Если файл не существует
   if f == nil then
      -- Создает файл в режиме "записи"
      f = io.open(getScriptPath().."\\Test.txt","w");
      -- Закрывает файл
      f:close();
      -- Открывает уже существующий файл в режиме "чтения/записи"
      f = io.open(getScriptPath().."\\Test.txt","r+");
   end;
   -- Записывает в файл 2 строки
   f:write("Line1\nLine2"); -- "\n" признак конца строки
   -- Сохраняет изменения в файле
   f:flush();
   -- Встает в начало файла
      -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла
      -- 2-ым параметром задается смещение
   f:seek("set",0);
   -- Перебирает строки файла, выводит их содержимое в сообщениях
   for line in f:lines() do message(tostring(line));end
   -- Закрывает файл
   f:close();
   -- Цикл будет выполнятся, пока IsRun == true
   while IsRun do
      sleep(100);
   end;
end;
 
function OnStop()
   IsRun = false;
end;

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

Функции обратного вызова, встроенные в QLua

Автор записи: Дмитрий (Admin)

Qlua-основы
Во время работы терминала QUIK в нем происходят различные события, такие, как приход новой обезличенной сделки, выставление заявки, сработал стоп-ордер и т.п. Для того, чтобы своевременно и определенным образом реагировать на эти события, в скрипте QLua можно использовать функции обратного вызова, которые будут выполнять блок кода, расположенного внутри них, в тот момент, когда это событие произойдет.

Для каждого определенного события есть своя предопределенная разработчиками QLua функция!Смотреть полностью...

Сервисные функции QLua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы
isConnected()   - возвращает 1, если QUIK подключен к серверу и 0, если не подключен

getScriptPath()   - возвращает путь, по которому находится скрипт, без последнего обратного слэша ("\"), например, "C:\Program Files (x86)\Info\MyLua"

getInfoParam()   - возвращает значение параметра из окна:"Связь" -> "Информационное окно..."
Смотреть полностью...

Приведение типов в QLua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы
Для приведения типов в QLua(Lua) служат всего 2 функции:

tostring()   - принимает любой параметр и конвертирует его в строку в подходящем формате, для применения конкретного формата, используйте функцию string.format

tonumber()   - пытается преобразовать переданный параметр в число, иначе возвращает nil

Математические функции в QLua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы
Стандартные арифметические операции:
"+" - сложение,
"-" - вычитание,
"/" - деление,
"*" - умножение,
"%" - остаток от деления (5%2 == 1).

   math.abs (x) -- Модуль x.

   math.acos(x) -- Возвращает арккосинус x

   math.asin(x) -- Возвращает арксинус x (в радианах).

   math.atan(x) -- Возвращает арктангенс x (в радианах).

   math.atan2(x, y) -- Возвращает арктангенс x/y (в радианах), но использует знаки обоих параметров для вычисления «четверти» на плоскости. (Также корректно обрабатывает случай когда y равен нулю.)Смотреть полностью...

Дата/время в QLua(Lua)

Автор записи: Дмитрий (Admin)

Qlua-основы
Материал статьи взят здесь: http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/368-lua-time.html

Дата/время в QLua(Lua) может быть представлено либо в виде секунд, прошедших с полуночи 1 января 1970 года, либо в виде таблицы, имеющей следующие поля:

   year - год (четыре цифры)
   month - месяц (1 – 12)
   day - день (1 – 31)
   hour - час (0 – 23)
   min - минуты (0 – 59)
   sec - секунды (0 – 59)
   wday - день недели (1 - 7), воскресенью соответствует 1
   yday - день года
   isdst - флаг дневного времени суток, тип booleanСмотреть полностью...