Germany | Finland | Saint Petersburg | Drive

Juggler: Эквилибристика графиками

Опубликовано в Утилиты

Часто требуется построить какой-то график, реализующий какое-то математическое действие с другими графиками, уже построенными в терминале. В самом простом варианте это может быть разница между двумя графиками - спред. Или среднее значение между двумя графиками. Или процентное соотношение между ними. Или все что угодно иное.

 

Несколько раз мне заказывали создание таких индикаторов, каждый раз с новой формулой. Каждый раз приходилось либо писать новый индикатор для терминала либо создавать формулу для программы технического анализа. Я решил, что имеет смысл написать для этой цели универсальный инструмент. Знакомьтесь: Juggler.

Итак, имеем в качестве входящей информации:

  1. Построенный в терминале первый график. Будем называть этот график как график А. Назначим ему во вкладке "Дополнительно" произвольный идентификатор. 
  2. Построенный в терминале второй график (график В). Ему тоже назначим идентификатор на ваш выбор.
  3. Формулу для расчета необходимой нам функции.

Например, формула для расчета спреда (первый график минус второй график) выглядит так: A - B. Если нам нужно разделить значения одного графика на соответствующие значения второго графика, то формула будет выглядеть так: A / B.

Можно задавать и более сложные функции, используя арифметические и логические и математические функции. Например, процентная разница между двумя графиками будет выглядеть так: (A-B)/A * 100

Выражения можно задавать сколь угодно большой сложности.

 

Для примера построим процентный спред между двумя скользящими средними (JMA и EMA), построенных на Газпроме.

Добавляем на график индикатор Juggler. Задаём параметры индикатора:

Настройка параметров индикатора

 

Задаем выражение, которое необходимо раcсчитать, указываем идентификаторы графиков А и B. ident1 - это идентификатор, который мы дали графика JMA в его настройках, ident2 - идентификатор графика EMA. Если "входящие" индикаторы имеют несколько линий, указываем номер линии, которую следует принимать в расчет. Можно также выбрать поле для расчета, если в качестве "входящего" графика используется график котировок инструмента.

Нажимаем кнопку OK и получаем следующий результат:


Кроме обычных математических действий можно использовать логические (not, or, and, <, <=, >,>=, ==, ~=) а также встроенные функции:

 

Математические функции, возвращающие одно значение (регистр символов важен)


ABS (x) Модуль x.
ACOS (x) Арккосинус x (в радианах).
ASIN (x) Арксинус x (в радианах).
ATAN (x) Арктангенс x (в радианах).
CEIL (x) Наименьшее целое число, большее или равное x. (Округление «вверх»).
COS (x) Косинус x (Угол – в радианах).
COSH (x) Кошинус (гиперболический косинус) x.
DEG (x) Переводит угол, заданный в радианах (x) в градусы.
EXP (x) e в стенени x.
FLOOR (x) Наибольшее целое число, меньшее или равное x. (Округление «вниз»)
LN (x) Натуральный логарифм x.
LOG10 (x) Логарифм x по основанию 10.
RAD (x) Конвертирует угол x, заданный в градусах, в радианы.
ROUND (x) Округление до ближайшего целого
SIGN (x) Модуль числа. -1 для отрицательных, 0 или 1 для положительных
SIN (x) Синус x (аргумент – в радианах).
SINH (x) Шинус (гиперболический синус) x.
SQRT (x) Квадратный корень x. (Также можно использовать выражение x^0.5)
TAN (x) Тангенс угла x (аргумент – в радианах)
TANH (x) Гиперболический тангенс x.

Математические функции, возвращающие одно значение для нескольких аргументов (регистр символов важен)


IIF (x1,x2,x3) Если x1 истинно, возвращает x2. Иначе возвращает x3
MIN (x1,x2,x3....) Минимальное значение нескольких значений
MAX (x1,x2,x3....) Максимальное значение нескольких значений

Для правильной работы индикатора Juggler "входящие" индикаторы необходимо располагать на одном графике (можно в разных областях).

 

Если вычисляемое выражение длинное и задавать его, заполняя поле в настройках индикатора неудобно, можно написать это условие в файле, а в настройках вместо выражения указать имя этого файла. По умолчанию файл ищется в папке LuaIndicators.

 


 

Кроме построения всевозможных спредов индикатор можно использовать и для других задач. Например, можно построить график стоимости Газпрома в долларах США. Для этого создаём графики GAZP и USDRUB и делим одно на другое (A/B).

Получается красноречивый график имени Алексея Борисовича Миллера, не требующий особых комментариев:

 

Другой пример - смещение индикатора вверх или вниз по шкале цены. Достаточно построить исходный индикатор, дать ему идентификатор и задать простейшее выражение вида А + 5, чтобы создать еще один индикатор, являющийся копией исходного, но сдвинутый на 5 рублей вверх.

 

Иногда получается реализовать вообще неожиданные требования. К примеру, можно раскрасить гистограмму объема в разные цвета в зависимости от текущего значения осциллятора стохастик. В этом случае juggler накладывается на график два раза с разными настройками цвета и выражением типа IIF(A>=0,B) для первого и  IIF(A<0,B) для второго. Предполагается что А это стохастик, а В это индикатор объёма (для получения объема необходимо указать поле Volume в настройках индикатора juggler). Первый juggler отрисует своим цветом свечи объёма, когда стохастик положительный, а второй - когда отрицательный, но уже своих цветом.

Ссылка для скачивания. 

Комментарии   
# perfectly 08.12.2016 08:53
Интересное решение, по возможности добавить настройку в индикатор, отображать длину линий на количество свечей или с даты, пример дополнительной строки настройки в индикаторе :

Period/Data = P-50 или прописываем с даты D-08122016
-- отображает длину линий по кол-ву свечей (Р-50) или с даты D-08122016 (D-ДДММГГГГ)

Позволит отображать данные на небольшом отрезке графика, не загромождая окно графика линиями, индикаторами, а также уменьшит нагрузку на вычисления.
Ответить | Ответить с цитатой | Цитировать
# admin 08.12.2016 11:03
Нагрузку это, конечно, только увеличит..

Можно сделать функции DATA() и TIME() и использовать их в условии. Например, если DATA() < 20161208, то не рисуем (возвращаем nil).

Вопрос, насколько это нужно....
Ответить | Ответить с цитатой | Цитировать
# perfectly 08.12.2016 11:30
Например, некоторые данные расчетов можно разместить рядом с ценой, длинной линий в 5-10 свечей с данными на шкале цены, не загромождать всю историю окна графика. Или данные только текущего дня на графике, остальные данные не нужны на графике окна.

Проще наверно сделать настройки по количеству свечей от текущей цены, длину линий.

Period - 50 -- длина линий от 1 до 3000 свечей
------------------------------------------------------------------------------
Можно сделать функции DATA() и TIME() и использовать их в условии. Например, если DATA() < 20161208, то не рисуем (возвращаем nil)

- Это уже можно прописать в текущей версии?
Ответить | Ответить с цитатой | Цитировать
# Юрий77 11.07.2017 20:26
Здравствуйте Михаил
А можно в этом скрипте возвращать для одного из графика предпоследние значение, если последние отсутствует?
Ответить | Ответить с цитатой | Цитировать
# admin 11.07.2017 20:53
Юрий,

В общем случае этого делать нельзя.

Дело в том, что этого значения индикатора может не быть в принципе и тогда juggler будет вам показывать неправильный результат.
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий