Как получать значения индикаторов в скрипте на LUA?
Юный программист задал мне вопрос, есть ли возможность получать значения технических индикаторов в скрипте, написанном для QUIK. Я подумал, что эта информация может быть интересна и другим участникам сети БАЗАР.
В скриптах на Lua для терминала QUIK такая техническая возможность реализована. Это одна из самых востребованных функций языка QLua. Для этого используется встроенная функция getIndicatorData.
Как работает getIndicatorData
Функция позволяет обратиться к любому индикатору, который запущен на графике, и получить массив его значений. Эти данные можно присвоить переменным, обработать, сравнить и использовать для принятия торговых решений.
Синтаксис функции:
values, name = getIndicatorData(param_name, line, source)
Аргументы:
param_name (строка): Обязательный параметр. Это уникальное имя (идентификатор) индикатора, к которому вы хотите обратиться.
line (число): Номер линии индикатора (если у индикатора несколько линий, например, у MACD их три). Если линия одна, обычно используется 1.
source (строка): Источник данных. source (строка).
Источником данных может быть "Chart", "Current", "All".
Чаще всего используется "Chart". Значения индикатора будут получены с того графика, на котором запущен скрипт.
Что возвращает функция:
values - основной результат. Функция возвращает таблицу (массив) Lua, содержащую числовые значения индикатора для каждого бара на графике.
Name - строковое имя индикатора.
Пошаговый алгоритм использования
Чтобы получить значения индикатора в скрипте, нужно выполнить следующие действия.
Шаг 1. Узнать имя индикатора (param_name)
Самый важный этап. Вы должны знать точное имя, под которым индикатор зарегистрирован в терминале.
Запустите нужный индикатор на графике.
В меню графика выберите «Редактировать индикатор...».
В открывшемся окне найдите поле «Имя (для использования в QLUA)». Скопируйте это значение. Оно и будет вашим param_name.
Шаг 2. Написать код в скрипте
В вашем скрипте вы вызываете функцию getIndicatorData, присваивая результат переменной.
Пример кода
Предположим, на графике с фьючерсом Si у вас запущен индикатор Hull Moving Average (HMA). Вы узнали, что его имя для QLua — "HMA_12" (где 12 — период).
Вот как будет выглядеть код для получения его значений:
-- Период расчета (например, последние 10 баров)
local bars_to_check = 10
-- Уникальное имя индикатора на графике
local indicator_name = "HMA_12"
-- Номер линии индикатора (у HMA линия одна)
local line_number = 1
-- Вызываем функцию для получения данных
local hma_values, indicator_full_name = getIndicatorData(indicator_name, line_number, "Chart")
-- Проверяем, успешно ли получены данные
if hma_values ~= nil then
message("Данные индикатора '" .. indicator_full_name .. "' успешно получены.", 1);
-- Присваиваем значения последних баров переменным
local current_hma = hma_values[0] -- Значение на текущем (нулевом) баре
local previous_hma = hma_values[1] -- Значение на предыдущем баре.
-- Выводим значения в журнал сообщений QUIK
message("Текущее значение HMA: " .. current_hma, 1)
message("Предыдущее значение HMA: " .. previous_hma, 1)
-- Простое условие: если HMA растет, выводим сообщение
if current_hma > previous_hma then
message("Тренд восходящий!", 1)
else
message("Тренд нисходящий или флэт.", 1)
end
else
message("Ошибка: не удалось получить данные индикатора. Проверьте его имя.", 4)
end
Важные нюансы
1. Индексация массива. В QLua, как и во многих других языках программирования, индексация массива значений начинается с 0 values[0] — это текущее (последнее) значение на графике, values[1] — предыдущее, и так далее.
2. Синхронизация. Скрипт получает данные только с того графика (таймфрейма и инструмента), на котором он запущен.
3. Производительность. Частый вызов getIndicatorData в цикле может замедлять работу терминала. Используйте его разумно. Например, запускайте его только один раз на каждом баре. О том, как это сделать, будет мой следующий пост.
Не пропустите!