Juggler: Эквилибристика графиками
Часто требуется построить какой-то график, реализующий какое-то математическое действие с другими графиками, уже построенными в терминале. В самом простом варианте это может быть разница между двумя графиками - спред. Или среднее значение между двумя графиками. Или процентное соотношение между ними. Или все что угодно иное.
Несколько раз мне заказывали создание таких индикаторов, каждый раз с новой формулой. Каждый раз приходилось либо писать новый индикатор для терминала либо создавать формулу для программы технического анализа. Я решил, что имеет смысл написать для этой цели универсальный инструмент. Знакомьтесь: Juggler.
Итак, имеем в качестве входящей информации:
- Построенный в терминале первый график. Будем называть этот график как график А. Назначим ему во вкладке "Дополнительно" произвольный идентификатор.
- Построенный в терминале второй график (график В). Ему тоже назначим идентификатор на ваш выбор.
- Формулу для расчета необходимой нам функции.
- ВНИМАНИЕ! Для правильной работы индикатора необходимо, чтобы исходные графики находились в пределах одной диаграммы, можно в разных областях. Если исходные графики находятся в разных диаграммах (окнах), индикатор работать будет, но никакой синхронизации по времени происходить не будет.
Например, формула для расчета спреда (первый график минус второй график) выглядит так: A - B. Если нам нужно разделить значения одного графика на соответствующие значения второго графика, то формула будет выглядеть так: A / B.
Можно задавать и более сложные функции, используя арифметические и логические и математические функции. Например, процентная разница между двумя графиками будет выглядеть так: (A-B)/A * 100
Выражения можно задавать сколь угодно большой сложности.
Для примера построим процентный спред между двумя скользящими средними (JMA и EMA), построенных на Газпроме.
Добавляем на график индикатор Juggler. Задаём параметры индикатора:
Задаем выражение, которое необходимо раcсчитать, указываем идентификаторы графиков А и B. ident1 - это идентификатор, который мы дали графика JMA в его настройках, ident2 - идентификатор графика EMA. Если "входящие" индикаторы имеют несколько линий, указываем номер линии (начинается с 1), которую следует принимать в расчет. Можно также выбрать поле для расчета, если в качестве "входящего" графика используется график котировок инструмента. Также можно выбрать номер свечи, считая справа, которая будет участвовать в расчете (0 - последняя свеча, 1 - предпоследняя и т.д.)
Нажимаем кнопку OK и получаем следующий результат:
Кроме обычных математических действий можно использовать логические (not, or, and, <, <=, >,>=, ==, ~=), битовые ( &, |, <<, >> ) а также встроенные функции:
Математические функции, возвращающие одно значение (регистр символов важен)
- ABS (x) Модуль x
- ACOS (x) Арккосинус x (в радианах)
- ASIN (x) Арксинус x (в радианах)
- ATAN (x) Арктангенс x (в радианах)
- CEIL (x) Наименьшее целое число, большее или равное x. (Округление «вверх»)
- COS (x) Косинус x (Угол – в радианах)
- DEG (x) Переводит угол, заданный в радианах (x) в градусы
- EXP (x) e в степени x
- FLOOR (x) Наибольшее целое число, меньшее или равное x. (Округление «вниз»)
- LN (x) или LOG (x) Натуральный логарифм x
- LOG2 (x) Логарифм x по основанию 2
- LOG10 (x) Логарифм x по основанию 10
- RAD (x) Конвертирует угол x, заданный в градусах, в радианы
- ROUND (x) Округление до ближайшего целого
- SIGN (x) Модуль числа. -1 для отрицательных, 0 или 1 для положительных
- SIN (x) Синус x (аргумент – в радианах).
- SQRT (x) Квадратный корень x. (Также можно использовать выражение x^0.5)
- TAN (x) Тангенс угла x (аргумент – в радианах)
Математические функции, возвращающие одно значение для нескольких аргументов (регистр символов важен)
- IIF (x1,x2,x3) Если x1 истинно, возвращает x2. Иначе возвращает x3
- POW (x,y) Возвращает x в степени y
- MIN (x1,x2,x3....) Минимальное значение нескольких значений
- MAX (x1,x2,x3....) Максимальное значение нескольких значений
Также в выражении можно использовать переменную N - она содержит номер рассчитываемой свечи.
Для правильной работы индикатора Juggler исходные индикаторы необходимо располагать в одной диаграмме (можно в разных областях).
Если вычисляемое выражение лишком длинное и задавать его, заполняя поле в настройках индикатора неудобно, можно написать это условие в обычном текстовом файле, а в настройках индикатора вместо выражения указать имя этого файла. Индикатор возьмет выражение из указанного файла. По умолчанию файл ищется в папке LuaIndicators.
Также предусмотрена возможность создания пользовательских функций в качестве расширений. Количество таких функций неограниченно, располагаются во внешних подключаемых файлах.
Кроме построения всевозможных спредов индикатор можно использовать и для других задач. Например, можно построить график стоимости Газпрома в долларах США. Для этого создаём графики GAZP и USDRUB и делим одно на другое (A/B).
Получается красноречивый график имени Алексея Борисовича Миллера, не требующий особых комментариев:

Другой пример - смещение индикатора вверх или вниз по шкале цены. Достаточно построить исходный индикатор, дать ему идентификатор и задать простейшее выражение вида А + 5, чтобы создать еще один индикатор, являющийся копией исходного, но сдвинутый на 5 рублей вверх.
Иногда получается реализовать вообще неожиданные требования. К примеру, можно раскрасить гистограмму объема в разные цвета в зависимости от текущего значения осциллятора стохастик. В этом случае juggler накладывается на график два раза с разными настройками цвета и выражением типа IIF(A>=0,B) для первого и IIF(A<0,B) для второго. Предполагается что А это стохастик, а В это индикатор объёма (для получения объема необходимо указать поле Volume в настройках индикатора juggler). Первый juggler отрисует своим цветом свечи объёма, когда стохастик положительный, а второй - когда отрицательный, но уже своих цветом.
Еще один пример. Построим график бивалютной корзины USD/RUB и EUR/RUB с коэффициентами, используемыми Банком России. Строим графики USDRUB_TOD (красный) и EURRUB_TOD (голубой). Накладываем индикатор Juggler, график USD обозначаем в настройках как A, график EUR как B, формула расчета A * 0.55 + B * 0.45
Жёлтая линия - это график бивалютной корзины:

Также можно использовать для расчетов не текущие значения исходных индикаторов, а предпоследнее, второе, третье и так далее справа. Для указания требуемой свечи укажите ее смещение от текущей в настройках.
Переменная N всегда содержит номер обрабатываемой свечи. Если задать выражение для расчета, состоящее только из одной этой переменной, можно получить индикатор, значение которого в каждой свече равно номеру этой свечи. Это удобно использовать при разработке и отладке индикаторов.
Демонстрационная версия позволяет использовать только 2 исходных графика, полная версия до 26.
Ссылка для скачивания.
