Это торговая стратегия, которая использует полосы Боллинджера. Стратегия направлена на выявление возможностей, когда цены сильно колеблются, используя полосы Боллинджера, и принятие соответствующих решений о покупке или продаже.
Стратегия рассчитывает верхнюю полосу, среднюю полосу и нижнюю полосу полос Боллинджера, чтобы определить, находится ли текущая цена в пределах волатильного диапазона и, следовательно, принимать решения об открытии или закрытии позиций. Когда цена приближается к верхней полосе, она считается крайней точкой для длинных позиций, и стратегия выбирает закрыть длинные позиции. Когда цена падает близко к нижней полосе, она считается крайней точкой для коротких позиций, и стратегия выбирает открыть длинные позиции.
Кроме того, стратегия также вводит факторы обратного тренда. Если есть сигнал обратного тренда, он также запускает соответствующие решения о покупке или продаже. В частности, логика стратегии следующая:
Выше приведена основная логика торговли этой стратегии. Используя характеристики полос Боллинджера и комбинируя факторы тренда и реверсии, стратегия пытается поймать точки реверсии при увеличении волатильности.
По сравнению с обычными стратегиями скользящей средней, эта стратегия имеет следующие преимущества:
В целом эта стратегия относительно хорошо сочетает в себе полосы Боллинджера и ценовые панели.
Тем не менее, эта стратегия все еще сопряжена с некоторыми рисками:
Соответственно, будущие оптимизации могут сосредоточиться на:
В заключение, это типичный шаблон торговой стратегии Bollinger Bands. Он избегает чрезмерно неэффективных сделок, распространенных при использовании только Bollinger Bands, путем внедрения реверсии тренда для фильтрации сигналов, что теоретически может привести к хорошей эффективности стратегии. Но параметры и фильтрация сигналов все еще нуждаются в дальнейшей оптимизации и улучшении для надежности и снижения ошибочных суждений.
/*backtest start: 2023-12-18 00:00:00 end: 2024-01-17 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy("Noro's Bollinger Strategy v1.2", shorttitle = "Bollinger str 1.2", overlay = true ) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length") mult = input(2.0, defval = 2.0, minval = 0.001, maxval = 50, title = "Bollinger Mult") source = input(ohlc4, defval = ohlc4, title = "Bollinger Source") uset = input(true, defval = true, title = "Use trend entry") usect = input(true, defval = true, title = "Use counter-trend entry") fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") showbands = input(true, defval = true, title = "Show Bollinger Bands") //Bollinger Bands basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Lines col = showbands ? black : na plot(upper, linewidth = 1, color = col) plot(basis, linewidth = 1, color = col) plot(lower, linewidth = 1, color = col) //Body body = abs(close - open) abody = ema(body, 30) //Signals bar = close > open ? 1 : close < open ? -1 : 0 up1 = bar == -1 and close >= basis and close < upper and (close < strategy.position_avg_price or strategy.position_size == 0) and uset dn1 = bar == 1 and close <= basis and close > lower and (close > strategy.position_avg_price or strategy.position_size == 0) and uset up2 = close <= lower and usect dn2 = close >= upper and usect exit = (strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open) and body > abody / 2 //Trading if up1 or up2 strategy.entry("Long", strategy.long, needlong == false ? 0 : na) if dn1 or dn2 strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if exit strategy.close_all()