Полосы Боллинджера: Код стратегии, метки сделок и выбор направления торговли

Следующая стратегия, которую мы будем разбирать — это Полосы Боллинджера.

Чаще всего её применяют как вспомогательную для принятия концептуальных и стратегических решений. Значения индикатора стратегии рассчитываются как отклонения от скользящей средней. Когда цена достигает верхней полосы, то можно предположить, что рынок перекуплен. Когда цена у нижней полосы — перепродан. Сужение полос говорит о снижении волатильности, расширение — о её росте.

Ниже представлен код стратегии и мои пояснения к нему. Мы изучим как записать условия с отменой заявки и как их помечать для этого.

Код стратегии «Полосы Боллинджера»

//@version=5
strategy("Bollinger Bands Strategy", overlay=true)
source = close1
length = input.int(20, minval=1)2
mult = input.float(2.0, minval=0.001, maxval=50)3
direction = input.int(0, title = "Strategy Direction", minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))4
basis = ta.sma(source, length)5
dev = mult * ta.stdev(source, length)6
upper = basis + dev
lower = basis - dev
buyEntry = ta.crossover(source, lower)
sellEntry = ta.crossunder(source, upper)
if (ta.crossover(source, lower))
	strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands", oca_type=strategy.oca.cancel, comment="BBandLE")7
else
	strategy.cancel(id="BBandLE")8
if (ta.crossunder(source, upper))
	strategy.entry("BBandSE", strategy.short, stop=upper,  oca_name="BollingerBands", oca_type=strategy.oca.cancel, comment="BBandSE")
else
	strategy.cancel(id="BBandSE")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Сноски и пояснения

  1. source — выбор цен закрытия (close) как базы для расчетов; ↩︎
  2. lenght — количество баров для расчета (по умолчанию берутся 20, минимальное значение — 1); ↩︎
  3. Мультипликатор mult с диапазоном значений от 0.001 до 50. По умолчанию равен 2. Его можно изменить через настройки стратегии как и все значения input; ↩︎
  4. Блок direction позволяет выбрать направление сделок. При значении 0 будут открываться длинные и короткие позиции. При значениях -1 и 1 только короткие и длинные соответственно. Встроенная функция strategy.risk.allow_entry_in определяет в каком направлении будут открываться сделки исходя из значения параметра direction; ↩︎
  5. basis — это значение средней полосы (высчитывается через встроенную функцию скользящей средней); ↩︎
  6. dev — значение отклонения от средней полосы. Рассчитывается как двойное стандартное отклонение умноженное на мультипликатор mult. Далее высчитываются значения верхней (upper) и нижней (lower) полос; ↩︎
  7. В этой части кода прописано условие если — то (if — else). Если происходит пересечение нижней полосы ta.crossover(source, lower), то открывается длинная позиция со стопом за ней (stop=lower). Здесь используется метка группы заявок oca_name, чтобы можно было их отменить используя идентификатор BBandLE (сразу задается тип oca_type=strategy.oca.cancel); ↩︎
  8. Условия, при которых вход в длинную позицию отменяется (блок else). Далее следует аналогичный код для открытия короткой позиции; ↩︎
Понравилась статья? Поделиться с друзьями: