QUIK. QLua. Индикаторы технического анализа — различия между версиями

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м (Далее)
м (7. Построение графика формула экспоненциальной скользящей средней (EMA))
 
(не показано 19 промежуточных версий этого же участника)
Строка 1: Строка 1:
=== 1. Как устроены индикаторы в QUIK===
+
QUIK. QLua - разрешает русские имена файлов и названия скриптов но не разрешает использовать кириллические переменные
 +
 
 +
=== 1. Как устроены индикаторы в QUIK ===
 
Основой для построения всех индикаторов в QUIK является источник данных (далее ИД). Источник Данных представляет собой массив, в котором элементы являются структурами и имеют 6 полей:
 
Основой для построения всех индикаторов в QUIK является источник данных (далее ИД). Источник Данных представляет собой массив, в котором элементы являются структурами и имеют 6 полей:
  
Строка 36: Строка 38:
 
     return nil
 
     return nil
 
  end
 
  end
 
  
 
Рассмотрим подробнее, что происходит при добавлении такого индикатора на график.
 
Рассмотрим подробнее, что происходит при добавлении такого индикатора на график.
Строка 69: Строка 70:
 
     line = {
 
     line = {
 
               { -- свойства линии № 1
 
               { -- свойства линии № 1
                 Name = "MA", -- надпись над линией
+
                 Name = "Гафик № 1", -- надпись над линией при наведении курсора
 
                 Color = RGB(255, 0, 0), -- цвет линии
 
                 Color = RGB(255, 0, 0), -- цвет линии
 
                 Type = TYPE_LINE, -- тип линии
 
                 Type = TYPE_LINE, -- тип линии
Строка 82: Строка 83:
 
     return nil
 
     return nil
 
  end
 
  end
 
  
 
Здесь в таблицу Settings добавились поля period и line. Поле line является массивом таблиц с индексным доступом. Это значит, что все её элементы доступны через численные индексы – line[1], line[2] и т.д.
 
Здесь в таблицу Settings добавились поля period и line. Поле line является массивом таблиц с индексным доступом. Это значит, что все её элементы доступны через численные индексы – line[1], line[2] и т.д.
  
 
Наш индикатор возвращает только одну линию, поэтому и свойства описаны только для одной – линии с индексом 1.
 
Наш индикатор возвращает только одну линию, поэтому и свойства описаны только для одной – линии с индексом 1.
 
Создание индикаторов технического анализа с помощью скриптов Lua // стр. 4 из 14
 
  
 
Вот как это будет выглядеть в диалоге настроек:
 
Вот как это будет выглядеть в диалоге настроек:
Строка 97: Строка 95:
  
 
== 4. Рисуем прямую линию ==
 
== 4. Рисуем прямую линию ==
 +
 
Для этого будет достаточно изменить только функцию OnCalculate следующим образом:  
 
Для этого будет достаточно изменить только функцию OnCalculate следующим образом:  
  
Строка 103: Строка 102:
 
  end
 
  end
  
 +
== 5. Считаем среднее ==
 +
 +
Усложним код, посчитаем среднее значение на заданном нами интервале по ценам закрытия свечи:
 +
 +
Settings=
 +
{
 +
  Name = "Пример Графика 3",
 +
  period = 5,
 +
  line =
 +
        {
 +
          { -- Первая линия - настройки
 +
            Name = "Среднее Значение", -- надпись над линией при наведении курсора
 +
            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) ==
 +
 +
[[Экспоненциальная скользящая средняя]] (EMA) – это разновидность взвешенной скользящей средней (WMA), в которой придаётся большее значение последним ценовым данным, в отличие от простых скользящих средних (SMA).
 +
ЕМА быстрее реагирует на недавние изменения цены, чем SMA. Формула расчета EMA подразумевает использование множителя и основана на SMA.
 +
 +
<math> E=mc^2 </math>
 +
 +
Как известно EMA вычисляется по следующей итерационной формуле:
 +
 +
Мы не можем обратиться напрямую к предыдущим рассчитанным значениям индикатора. Это значит, что для вычислений текущего значения нам придётся хранить и предыдущие значения. Для таких целей в Lua можно использовать очень удобный механизм замыканий.
 +
Хорошей идеей будет вынести определение такой функции в отдельный файл и даже в '''отдельный каталог, который не будет сканироваться при создании индикатора'''.
  
 +
Пример файла с функцией расчёта EMA (ma.lua):
  
 
== Далее ==
 
== Далее ==

Текущая версия на 12:50, 30 октября 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 = "Среднее Значение", -- надпись над линией при наведении курсора
           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)

Экспоненциальная скользящая средняя (EMA) – это разновидность взвешенной скользящей средней (WMA), в которой придаётся большее значение последним ценовым данным, в отличие от простых скользящих средних (SMA).
ЕМА быстрее реагирует на недавние изменения цены, чем SMA. Формула расчета EMA подразумевает использование множителя и основана на SMA.

<math> E=mc^2 </math>

Как известно EMA вычисляется по следующей итерационной формуле:

Мы не можем обратиться напрямую к предыдущим рассчитанным значениям индикатора. Это значит, что для вычислений текущего значения нам придётся хранить и предыдущие значения. Для таких целей в Lua можно использовать очень удобный механизм замыканий. Хорошей идеей будет вынести определение такой функции в отдельный файл и даже в отдельный каталог, который не будет сканироваться при создании индикатора.

Пример файла с функцией расчёта EMA (ma.lua):

Далее

  • Индикаторы технического анализа представляют собой отдельный класс скриптов, которые удовлетворяют определенным условиям и расположены в папке LuaIndicators в каталоге терминала (например C:\Program Files\QUIK\LuaIndicators). Если папка отсутствует в каталоге, необходимо создать ее вручную.
  • Список скриптов недоступен из диалога Таблицы / LUA / Доступные скрипты.
  • При добавлении нового индикатора на график плагин qlua сканирует папку LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные скрипты lua) на соответствие следующим требованиям:
    • определена функция Init;
    • определена функция OnCalculate;
    • определена таблица Lua с именем Settings, в которой есть поле «Name».