Оператор if называют условным переходом, он представляет собой новую ветвь (значение, путь) в нашем сценарии. Другими словами, если произошло какое-то событие, прописанное в условии для оператора if, то действия нашего алгоритма должны поменяться.
Есть много вещей, которые можно сделать с помощью операторов if:
- открывать и закрывать сделки
- создавать цели по прибыли и ставить ордера стоп-лосс
- устанавливать значения переменных
- использовать if для внутренних циклов.
Синтаксис оператора if выглядит следующим образом:
1 2 |
[myVariable =] if condition //пишем код, который выполняется, если условие истинно |
Строка кода, которая выполняется, если условие if истинно пишется на следующей строчке и выделяется отступом в 4 пробела или 1 табуляцию. Если условие после if ложно, то строки кода ниже не выполняются вообще.
Результат работы оператора if может возвращаться в какую-то переменную, но это не обязательно.
Например, проверяем условие, если close > open, то в переменную х возвращаем цену закрытия и выводим график х при помощи plot:
1 2 3 |
x = if close > open close plot(x) |
Как использовать оператор if в стратегиях
Пример стратегии, которая открывает позицию в лонг, если происходит пересечение двух скользящих средних EMA50 и EMA100 сверху вниз и в шорт, если происходит пересечение EMA50 и EMA100 снизу вверх.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//@version=5 strategy(title='If strategy', overlay=true) EMA50 = ta.ema(close, 50) EMA100 = ta.ema(close, 100) plot(series=EMA50 , color=color.yellow, linewidth = 2) plot(series=EMA100 , color=color.black,linewidth = 2) if ta.crossover(EMA50,EMA100) strategy.entry(id='Long', direction=strategy.long, qty=2) if ta.crossunder(EMA50,EMA100) strategy.entry(id='Short', direction=strategy.short, qty=2) |
Стратегия на графике:
Иногда одного оператора if недостаточно для реализации логики нашего скрипта. В этом случае мы можем комбинировать операторы if и использовать вложенный оператор if.
Когда мы это делаем, не только первый оператор if должен быть истинным, но и второй оператор также должен быть истинным (и третий, и четвертый, если они есть), прежде чем наш код запустится.
Пример стратегии со вложенным if:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//@version=5 strategy(title='If strategy', overlay=true) enterLong = ta.crossover(ta.ema(close,50), ta.ema(close, 100)) // условие для сделок long enterShort = ta.crossunder(ta.ema(close,50), ta.ema(close, 100)) // условие длz сделок short if (volume > ta.sma(volume, 20)) // проверяем первое условие, если оно верное, то дальше проверяем второе условие if (enterLong) // второе условие - истинность enterLong, // если произошло пересечение ЕМА50 и ЕМА 100 сверху вниз, то в эту переменную возвращается true strategy.entry(id='Long', direction=strategy.long) // входим в long, если 1 и 2 условие истинны if (enterShort) // третье условие, если 2-е условие оказалось ложным, то проверяем 3-е условие // если произошло пересечение ЕМА50 и ЕМА 100 снизу вверх, то в эту переменную возвращается true strategy.entry(id='Short', direction=strategy.short) // // входим в short, если 1 и 3 условие истинны |
Поменяем цвет фона бара, в зависимости от вложенных условий:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//@version=5 indicator(title='If/else', overlay=true) ema50 = ta.ema(close,50) y=ta.cross(close, ema50)//в переменную у возвращается значение true, если произошло пересечение //close и ема50 highlightColour = if (dayofweek!= dayofweek.wednesday)//проверяем первое условие, день недели не должен быть среда // если условие верное, то проверяем второе условие if (y) // второе условие - истинно ли значение у, если да, то в переменную highlightColour color=color.new (color.fuchsia, transp=80) //то в переменную highlightColour возвращаем цвет фуксия bgcolor(highlightColour)// окрашиваем фон баров в цвет переменной highlightColour ,а он будет цветом фуксия // если выполнены 2 вышеуказанных условия. Если нет, то цвет баров остается по умолчанию |
Как заменить вложенный if логическим оператором
Рассмотрим пример, когда нам нужно проверить 2 условия. Мы можем записать код при помощи вложенного оператора if:
1 2 3 4 5 |
if (close > open) if (close > close[2]) strategy.close_all() else strategy.entry() |
а можем заменить двойной if логическим and:
1 2 3 4 |
if (close > open) and (close > close[2]) strategy.close_all() else strategy.entry() |
Заключение
При помощи вложенных операторов if мы можем создавать сложные условия. Существует 2 вида вложенных операторов if, которые мы можем использовать.
- Первый заключается в размещении оператора if внутри другого блока кода if. Это заставляет вложенный оператор if выполняться только тогда, когда предыдущее условие if истинно.
- Второй вариант — когда if мы помещаем внутрь блока кода else. Таким образом, вложенный оператор if запускается только тогда, когда предыдущее условие ложно.
При написании кода с условием if не забывайте использовать отступ в 4 пробела или Tab, чтобы выделить блок относящийся к условным операторам if/else.
Иногда вложенный оператор If можно заменить логическими операторами.