Эта стратегия использует полосы Боллинджера для оценки трендов путем сравнения колебаний внутри и вне полос и использует индикаторы импульса для отслеживания тренда. Она относится к стратегии, следующей за трендом. Она генерирует новые сигналы направления тренда, когда волатильность внутри полосы меньше, чем снаружи, и открывает позиции. Стоп-лосс использует кратные ATR, а прибыль - кратные ATR соотношения риска и вознаграждения.
Стратегия состоит из следующих основных частей:
Настройки полос Боллинджера: большие полосы длиной 40, маленькие полосы длиной 20, ширина полосы - 2 стандартных отклонения.
Суждение о взрыве полосы: Если верхняя часть большой полосы находится ниже верхней части малой полосы, а нижняя часть большой полосы находится выше нижней части малой полосы, это указывает на повышенную волатильность и генерирует новые сигналы направления тренда.
Индикатор импульса: 240 временных рамок 14 EMA оценивает направление тренда.
ATR стоп-лосс и take profit: ATR в 14 раз больше расстояния стоп-лосса, take profit - в 1,5 раза больше расстояния стоп-лосса.
Стратегия сначала оценивает, если диапазон взрывается, а затем определяет длинный или короткий, основанный на направлении импульса.
Использование двойных полос Боллинджера позволяет сравнить волатильность в разных временных рамках, чтобы определить точки разрыва тренда.
Использование индикаторов импульса позволяет избежать рыночных колебаний.
ATR останавливается на расстоянии от остановки на основе волатильности рынка.
Разумное соотношение риска и вознаграждения, не слишком агрессивное или консервативное.
Может оказаться в ловушке на рынках без четких тенденций. Может оптимизировать параметры импульса, чтобы уменьшить ложные сигналы.
Подумайте о других методах остановки, таких как остановки на заднем пути.
Фиксированные кратные ATR могут не подходить для всех продуктов.
Эффективность двойного Боллинджера не доказана.
Испытывайте различные параметры импульса, чтобы найти оптимальные комбинации.
Попробуйте разные методы остановки, например, остановки на заднем плане, адаптивный АТР.
Сделать множители ATR регулируемыми в зависимости от продуктов и рыночных условий.
Испытайте различные индикаторы канала для большей стабильности.
Подумайте о добавлении управления соединениями для лучшего контроля прибыли.
Фильтр сигналов входа по колебаниям, времени и т.д. для улучшения скорости победы.
Логика стратегии ясна, использование двойного Боллинджера для определения разрыва тренда является самым большим изюминкой. Но все еще необходимы оптимизации на остановках, каналах, управлении рисками и т. Д., Чтобы параметры стали более адаптивными в различных рыночных условиях. В целом стратегия имеет хорошие преимущества и потенциал, достойный дальнейшего исследования.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © kasaism //@version=4 // strategy(title="[EURUSD60] BB Expansion Strategy", shorttitle="[EURUSD60] BBEXP",overlay=true, max_bars_back=5000, max_labels_count=500) // === INPUTS === // ////BB largeBbRes = input(title="Large BB Resolution", type=input.resolution, defval="", group="BB") largeBbLength = input(title="Large BB Length", type=input.integer, defval=40, minval=1, group="BB") smallBbRes = input(title="Small BB Resolution ", type=input.resolution, defval="", group="BB") smallBbLength = input(title="Small BB Length", type=input.integer, defval=20, minval=1, group="BB") multi = input(title="BB StdDev", type=input.float, defval=2.0, maxval=10, minval=0.01, group="BB") validLen = input(title="BB expand valid length", defval=14, group="BB") // 3 each EMA settings. EMA directions are as each time frame directions. resFirstTime = input(title="EMA Trend t/f", type=input.resolution, defval="240", group="SMT") // resSecondTime = input(title="Second t/f", type=input.resolution, defval="30", group="SMT") // resThirdTime = input(title="Third t/f", type=input.resolution, defval="", group="SMT") emaLen = input(14, minval=1, title="Length", group="SMT") smooth = input(3, minval=1, title="Smooth factor", group="SMT") //Lisk Management var riskManagementRule1 = "ATR" var riskManagementRule2 = "Bracket" riskManagementRule = input(riskManagementRule1, "Detect Risk Management Based On", options=[riskManagementRule1, riskManagementRule2, "No detection"], group="Trade") atrMulti = input(3.0, title="ATR Multiple", type=input.float, minval = 1.0, group="ATR") riskRewardRatio = input(1.5, title="Risk Reward Ratio for ATR", type=input.float, minval = 0.01, group="ATR") stopLossPoint = input(100, title="Stop Loss Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket") takeProfitPoint = input(200, title="Take Profit Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket") // === /INPUTS/ === // // === CONSTANT === // //For barmerge.lookahead_off index = barstate.isrealtime ? 1 : 0 //For Entry NOENTRY=0 LONG=1 SHORT=2 //SMT color int up=1 int dn=2 int up_HL=3 int dn_HL=4 //label color color_bearish = color.red color_bullish = color.blue C_label_color_bearish = color.red C_label_color_bullish = color.blue // === /CONSTANT/ === // // === FUNCTIONS === // //BB trade direction bbTradeDetection(lrgUpper, lrgLower, smlUpper, smlLower) => if not(na(lrgUpper) or na(lrgLower) or na(smlUpper) or na(smlLower)) if lrgUpper < smlUpper and lrgLower > smlLower true else false else na // === /FUNCTIONS/ === // // === CALCURATES === // ////BB //large BB lrgBbBasis = security(syminfo.tickerid, largeBbRes, sma(close[index], largeBbLength)) lrgBbDev = multi * security(syminfo.tickerid, largeBbRes, stdev(close[index], largeBbLength)) lrgBbUpper = lrgBbBasis + lrgBbDev lrgBbLower = lrgBbBasis - lrgBbDev //small BB smlBbBasis = security(syminfo.tickerid, smallBbRes, sma(close[index], smallBbLength)) smlBbDev = multi * security(syminfo.tickerid, smallBbRes, stdev(close[index], smallBbLength)) smlBbUpper = smlBbBasis + smlBbDev smlBbLower = smlBbBasis - smlBbDev bbTrade = bbTradeDetection(lrgBbUpper, lrgBbLower, smlBbUpper, smlBbLower) //EMA Trend base=security(syminfo.tickerid, resFirstTime, ema(close[index],emaLen)) sig=security(syminfo.tickerid, resFirstTime, ema(base[index],smooth)) emaTrend = not(na(base) or na(sig)) ? base < sig ? dn : up : na ////LISK MANAGEMENT float stopLossLineForLong = na float stopLossLineForShort = na float takeProfitLineForLong = na float takeProfitLineForShort = na atr_ = atr(14) * atrMulti if riskManagementRule == riskManagementRule1 stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : round(close[index] - atr_,3) : na stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : round(close[index] + atr_,3) : na takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] + atr_*riskRewardRatio : na takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - atr_*riskRewardRatio : na if riskManagementRule == riskManagementRule2 stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : close[index] - stopLossPoint * syminfo.mintick : na stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : close[index] + stopLossPoint * syminfo.mintick : na takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] +takeProfitPoint * syminfo.mintick : na takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - takeProfitPoint * syminfo.mintick : na // === /CALCURATES/ === // // === CONDITIONS === // //BB bool isBbEntry = na for i=0 to validLen isBbEntry := bbTrade==true ? true : bbTrade[i]==true ? true : false //plotshape(isBbEntry, style=shape.circle, location=location.bottom) isBbLong = isBbEntry and open[index] < smlBbBasis[index] and close[index] > smlBbBasis[index] isBbShort = isBbEntry and open[index] > smlBbBasis[index] and close[index] < smlBbBasis[index] //SMT isEmaLong = emaTrend == up isEmaShort = emaTrend == dn //ATR isAtrLongStop = low[index] <= stopLossLineForLong isAtrShortStop = high[index] >= stopLossLineForShort isAtrLongLimit = high[index] >= takeProfitLineForLong isAtrShortLimit = low[index] <= takeProfitLineForShort // === /CONDITIONS/ === // // === TRADE === // //ENTRY if (isBbLong and isEmaLong) strategy.entry("LongEntry", strategy.long, comment="LongEntry") if riskManagementRule == riskManagementRule2 strategy.exit("LongEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket") if (isBbShort and isEmaShort) strategy.entry("ShortEntry", strategy.short, comment="ShortEntry") if riskManagementRule == riskManagementRule2 strategy.exit("ShortEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket") //EXIT if riskManagementRule == riskManagementRule1 if(isAtrLongStop) strategy.close("LongEntry", when=isAtrLongStop, comment="ATR Stop") if(isAtrShortStop) strategy.close("ShortEntry", when=isAtrShortStop, comment="ATR Stop") if(isAtrLongLimit) strategy.close("LongEntry", when=isAtrLongLimit, comment="ATR Limit") if(isAtrShortLimit) strategy.close("ShortEntry", when=isAtrShortLimit, comment="ATR Limit") // === /TRADE/ === // // === PLOTS === // plot(lrgBbBasis, title="Large BB Basis", linewidth=2, color=color.gray) plot(lrgBbUpper, title="Large BB Upper", linewidth=2, color=color.gray) plot(lrgBbLower, title="Large BB Lower", linewidth=2, color=color.gray) plot(smlBbBasis, title="Small BB Basis", color=color.white) plot(smlBbUpper, title="Small BB Upper", color=color.white) plot(smlBbLower, title="Small BB Lower", color=color.white) plot(base, title="EMA Line", color= emaTrend==dn ? color_bearish : emaTrend==up ? color_bullish : color.gray) plot(stopLossLineForLong ? stopLossLineForLong : na, title="S/L Line For Long", color=color.yellow, style=plot.style_circles) plot(stopLossLineForShort ? stopLossLineForShort : na, title="S/L Line For Short", color=color.yellow, style=plot.style_circles) plot(takeProfitLineForLong ? takeProfitLineForLong : na, title="T/P Line For Long", color=color.purple, style=plot.style_circles) plot(takeProfitLineForShort ? takeProfitLineForShort : na, title="T/P Line For Short", color=color.purple, style=plot.style_circles) // /=== PLOTS ===/ //