Довольно распространенная задача в скриптах узнать пересекается ли какое-то значение с другим. Например, мы можем захотеть проверить, пересекла ли 50-периодная скользящая средняя 10-периодную SMA. Или проверить не опустился ли Индекс относительной силы (RSI) ниже 30 или поднялся выше 70.

Как узнать, пересекаются ли значения друг с другом?

В TradingView есть три полезные функции, чтобы узнать пересечение значений:

  1. ta.crossover() сообщает нам, пересекается ли серия с другой серией или с некоторым фиксированным значением снизу вверх.
  2. ta.crossunder() сообщает нам, пересекается ли серия с другой серией или с некоторым фиксированным значением сверху вниз.
  3. ta.cross() сообщает, пересекается ли серия над или под другой серией или некоторым фиксированным значением.

Функция ta.crossover()

Встроенная функция ta.crossover (source1, source2) возвращает значение true, если на текущем баре source1 больше, чем значение source2, а на предыдущем баре значение source1 было меньше или равно значению source2.

Проиллюстрируем работу индикатора на графике:

Проиллюстрируем работу индикатора на графике:

Один и тот же индикатор мы нанесли на график и вынесли под ним.

Под графиком вы видите линию красного цвета — цена закрытия close, а синюю линию — ema(close, 50).

Каждая свечка, на которой цена close, больше чем close на предыдущей свечке, и цена пересекается с ЕМА50, снизу вверх, помечается ромбом.

Т.е. если close [1]


ta.crossover() возвращает true, если:

  • На предыдущем баре значение первого аргумента функции должно быть меньше или равно значению второго аргумента.
  • А на текущем баре значение первого аргумента функции должно быть больше второго аргумента.

Рассмотрим другой пример, как определить пересекает ли переменный ряд фиксированный уровень.

Предположим, мы хотим узнать на каких барах индекс относительной силы (RSI) пересекает уровни 30 и 70, и пометить эти бары.


Рассмотрим другой пример, как определить пересекает ли переменный ряд фиксированный уровень.

Функция ta.crossunder()

Встроенная функция ta.crossunder(source1, source2) возвращает значение true, если на текущем баре source1 меньше, чем значение source2, а на предыдущем баре значение source1 было больше или равно значению source2. Т.е. пересечение двух серий происходит сверху вниз.

Добавим в предыдущий индикатор функцию ta.crossunder:


Выделим дополнительно свечи, на которых RSI пересекает уровни 30 и 70 сверху вниз желтым и серым цветом:

Функция ta.crossunder()

ta.crossunder() возвращает true, если:

  • На предыдущем баре значение первого аргумента функции должно быть больше или равно значению второго аргумента.
  • А на текущем баре значение первого аргумента функции должно быть меньше второго аргумента.

Функция ta.cross() определяет любые пересечения

Когда направление пересечения не имеет значения, мы используем функцию ta.cross(). Она возвращает значение true, когда две серии или два значения пересекаются и false, если пересечение не случилось. Т.е. если произошло пересечение двух величин в любом направлении, функция возвращает true.

Функция ta.cross() может использоваться в 2-х вариантах:

  • она определяет пересекаются ли 2 серии значений, например EMA50 и EMA100.
  • пересекается ли серия значений и с фиксированной величиной, например RSI пересекла уровень 50.

Например, проверим пересекаются ли 2 скользящие средние

Первый способ использования ta.cross() состоит в том, чтобы посмотреть, не пересекаются ли некоторые ряды значений с другими.

Скажем, у нас есть индикатор, который строит две скользящие средние, и мы хотим выделить те бары, на которых скользящие средние пересекаются:


Вот так выглядит график:

Например, проверим пересекаются ли 2 скользящие средние

Приведем еще один пример: выделим свечи, на которых произошло пересечение ЕМА50 и цены 4320.


Выделяем свечи на графике:

Как функции пересечения учитывают исторические и реальные бары

  1. ta.crossover(), ta.crossunder() и ta.cross() всегда сравнивают значение текущего бара со значением предыдущего бара.
  2. Когда бар является историческим баром, функции пересечения сравнивают значение бара при закрытии со значением закрытия предыдущего бара.
  3. Когда текущий бар является баром в реальном времени, функции сравнивают текущее обновление цены в реальном времени со значением закрытия предыдущего бара.
  4. Это также означает, что в режиме реального времени мы можем видеть пересечение во время первого обновления цены, но затем при следующем обновлении цены в реальном времени пересечение может исчезнуть, а затем появиться вновь.
  5. Одна вещь, которую функции пересечения не могут сделать, это сравнить текущий тик в реальном времени с предыдущим тиком.