QUIK. QLua. Индикаторы технического анализа — различия между версиями
Админ (обсуждение | вклад) м (→3 Изменяем свойства индикатора) |
Админ (обсуждение | вклад) м (→3 Изменяем свойства индикатора) |
||
Строка 70: | Строка 70: | ||
line = { | line = { | ||
{ -- свойства линии № 1 | { -- свойства линии № 1 | ||
− | Name = " | + | Name = "Гафик № 1", -- надпись над линией при наведении курсора |
Color = RGB(255, 0, 0), -- цвет линии | Color = RGB(255, 0, 0), -- цвет линии | ||
Type = TYPE_LINE, -- тип линии | Type = TYPE_LINE, -- тип линии |
Версия 16:58, 28 октября 2019
QUIK. QLua - разрешает русские имена файлов и названия скриптов но не разрешает использовать кириллические переменные
Содержание
1. Как устроены индикаторы в QUIK
Основой для построения всех индикаторов в QUIK является источник данных (далее ИД). Источник Данных представляет собой массив, в котором элементы являются структурами и имеют 6 полей:
1. Open;
2. High;
3. Low;
4. Close;
5. Volume;
6. Time.
Это значит, что все элементы массива в Источнике Данных представляют собой свечи. В случае тиковых данных поля с 1-го по 4-е буду иметь одно значение, и оно будет совпадать со значением параметра в этот момент времени. Источники данных могут быть интервальными графиками (тики, 1 минута, 5 минут и т.д.), рассчитанными по таблице всех сделок или по изменениям параметра торгуемого инструмента.
Индикатор представляет собой функцию, которая для элемента массива Источника Данных может вернуть одно или несколько чисел, в зависимости от количества линий, отображаемых на графике.
Индикатор не может выступать источником данных для другого индикатора.
2. Минимальный код индикатора
ВАЖНО!! Кодировка д.б. Windows-1251 !!
Пример 1 (ex1.lua)
Settings = { Name = "Пример Графика" } function Init() return 1 end function OnCalculate(index) return nil end
Рассмотрим подробнее, что происходит при добавлении такого индикатора на график.
При создании нового индикатора (пункт Добавить график (индикатор)… контекстного меню графика) терминал сканирует папку LuaIndicators в директории Рабочего места QUIK на наличие в ней скриптов, отвечающих следующим требованиям:
1. В скрипте определена глобальная таблица Lua с именем Settings
2. Определена функция Init()
3. Определена функция OnCalculate()
Поле Name в таблице Settings будет определять имя индикатора, с которым он будет отображаться в диалоге Добавить График.
Если скрипт не удовлетворяет перечисленным выше требованиям или содержит синтаксические ошибки языка Lua, то он не будет отображаться в этом диалоге.
Выбрав индикатор Пример Графика и нажав на кнопку «Да», мы увидим диалог настройки отображения индикатора:
- Значение поля Settings.Name попало в подпись нового индикатора и отображается в поле Name группы «Пользовательские настройки».
- В диалоге свойств индикатора присутствуют параметры одной линии с именем «Линия 1».
- Функция Init вернула 1, это говорит терминалу, что индикатор будет состоять из одной линии. Так как мы не описали в коде параметры этой линии, то значения полей Color, Name, Type, Width выбираются значениями по умолчанию.
После нажатия кнопки «Сохранить» мы не увидим никаких новых линий на графике. Потому что функция OnCalculate всегда возвращает nil. Это значение говорит терминалу, что значение индикатора для указанной свечи источника данных не определено.
3 Изменяем свойства индикатора
В качестве примера рассмотрим код:
Settings= { Name = "Пример Графика 2", period = 5, -- период линии line = { { -- свойства линии № 1 Name = "Гафик № 1", -- надпись над линией при наведении курсора Color = RGB(255, 0, 0), -- цвет линии Type = TYPE_LINE, -- тип линии Width = 2 -- толщина линии } } } function Init() return 1 end function OnCalculate(index) return nil end
Здесь в таблицу Settings добавились поля period и line. Поле line является массивом таблиц с индексным доступом. Это значит, что все её элементы доступны через численные индексы – line[1], line[2] и т.д.
Наш индикатор возвращает только одну линию, поэтому и свойства описаны только для одной – линии с индексом 1.
Вот как это будет выглядеть в диалоге настроек:
Все, что не относится к описанию параметров линий, попадает в группу «Пользовательские настройки». Тип параметра определяется начальным значением. Поле Name имеет строковый тип, поле period – числовой, так как в коде мы его инициализировали значением 5.
Параметры линии теперь отличаются от значений по умолчанию. Например, цвет линии определяет функция RGB(255, 0 ,0).
4. Рисуем прямую линию
Для этого будет достаточно изменить только функцию OnCalculate следующим образом:
function OnCalculate(index) return 100 end
5. Считаем среднее
Усложним код, посчитаем среднее значение на заданном нами интервале по ценам закрытия свечи:
Settings= { Name = "Пример Графика 3", period = 5, line = { { -- Первая линия - настройки Name = "MA", Color = RGB(255, 0, 0), Type = TYPE_LINE, Width = 2 } } } function Init() return 1 end function OnCalculate(index) if index < Settings.period then return nil else local sum = 0 for i = index-Settings.period+1, index do sum = sum +C(i) end return sum/Settings.period end end
В коде примера есть несколько важных моментов:
1. Проверяем переданный нам индекс свечи. Если он меньше заданного нами периода, то возвращаем nil. Данных для расчёта недостаточно, поэтому значение индикатора не определено на индексах свечек меньших, чем задано в Settings.period.
2. Для расчёта индикатора мы везде используем поле таблицы Settings.period.
Откроем свойства нашего индикатора и поменяем значение поля period: например на 100, график изменится но файл индикатора нет, при следующем вызове period опять будет 5.
Все значения из диалога настроек индикатора после нажатия кнопки «Сохранить» попадают в работающую виртуальную машину Lua и становятся доступны в функциях скрипта. При этом никак не затрагивается исходный код скрипта на диске и индикаторы уже созданные с его помощью. Если мы ещё раз добавим этот индикатор на график, то получим предыдущую картинку.
6. Доступ к данным
Как говорилось выше, каждый индикатор привязан к источнику данных. Для доступа к данным скрипт может использовать следующие функции:
- O(i) - возвращает значение – Open для бара i - цена открытия
- H(i) - возвращает значение – High для бара i
- L(i) - возвращает значение – Low для бара i
- C(i) - возвращает значение – Close для бара i - цена закрытия
- V(i) - возвращает значение – Volume для бара i
- T(i) - Функция T(i) возвращает таблицу, которая содержит время указанного бара i
За исключением функции T(), все они возвращают соответствующее значение для указанного бара – Open, High, Low, Close и Volume. Функция T() возвращает таблицу, которая содержит время указанного бара.
Среднее значение можно рассчитать не только по цене закрытия. Немного усложним код, добавив функцию:
7
формула экспоненциальной скользящей средней (EMA)
Далее
- Индикаторы технического анализа представляют собой отдельный класс скриптов, которые удовлетворяют определенным условиям и расположены в папке LuaIndicators в каталоге терминала (например C:\Program Files\QUIK\LuaIndicators). Если папка отсутствует в каталоге, необходимо создать ее вручную.
- Список скриптов недоступен из диалога Таблицы / LUA / Доступные скрипты.
- При добавлении нового индикатора на график плагин qlua сканирует папку LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные скрипты lua) на соответствие следующим требованиям:
- определена функция Init;
- определена функция OnCalculate;
- определена таблица Lua с именем Settings, в которой есть поле «Name».