Большинству операторов TradingView требуется два операнда, иногда один, но есть и такие, которым нужно 3 операнда. К ним относится условный тернарный оператор (тернарный значит тройной).
Условный оператор (?:) оценивает условие и возвращает одно из двух значений в зависимости от того, является ли это условие истинным или ложным. Он работает как оператор if/else, которого нет в языке Pine Script TradingView.
Тернарный оператор имеет следующий синтаксис:
1 |
condition ? result 1 : result 2 |
Когда его условие condition оценивается как истинное, возвращается result 1, в противном случае возвращается result 2.
Использовать разные типы не допускается.
Условие condition может быть логическим выражением true/false (например, close > open) или числовым выражением (например, high — high[1]). Во втором случае значения 0, NaN и +Infinity и -Infinity считаются ложными, в то время как другие числовые значения рассматриваются как истинные.
Как определить значения переменной с помощью условного оператора
1 |
barcolor(close > ta.ema(close, 9) ? color.blue : color.red) |
В данном случае условный оператор проверяет больше ли close, чем ta.ema(close, 9), если ДА, то в barcolor возвращается синий цвет, если НЕТ, то красный.
Раскрасим график при помощи тернарного оператора
В данном примере раскрасим фон за красными свечами в светло-красный, а за зелеными — в светло-зеленый:
1 2 3 4 5 |
//@version=5 indicator(title="ternarnii", overlay=true) background = (close > open) ? color.new(color.green,70) : color.new(color.red,70) bgcolor(color=background) |
Создадим переменную background (фон), значение которой устанавливается условным оператором. Оценим условие, больше ли цена закрытия, чем цена открытия? Если условие верно, то в переменную background возвращаем значение color.green,70 — зеленый цвет с прозрачностью 70.
Последний оператор устанавливает фон графика с помощью bgcolor().
Так наш индикатор работает на графике:
Тернарные операторы могут быть вложенными друг в друга, тогда условия проверяются последовательно друг за другом. Самый последний аргумент действует как значение по умолчанию, если ни одно из условий не оценивается как истинное.
Пример вложенного тернарного оператора:
1 2 3 4 5 6 |
//@version=5 indicator(title='ternarnii', overlay=true) arrowPlot = (close > close[1] and close > open) ? 1 : (close < close[1] and close > open) ? -1 : na plotarrow(series=arrowPlot, colordown=color.new(color.red, 35), colorup=color.new(color.lime, 35)) |