Основная идея этой стратегии заключается в объединении индекса относительной силы (RSI) и полос Боллинджера, двух технических индикаторов, для фильтрации двойных торговых сигналов и минимизации помех от ложных сигналов насколько это возможно, улучшая качество сигнала.
Когда индикатор RSI показывает сигналы перекупа или перепродажи, в то время как цена прорывается или отталкивает верхние и нижние рельсы полос Боллинджера, появляются торговые возможности. Он объединяет преимущества двух различных индикаторов, учитывая как статистические характеристики колебаний рынка, так и длинную/короткую позицию участников рынка, чтобы сформировать всеобъемлющую основу для суждения.
Для части RSI мы одновременно отслеживаем два индикатора RSI с различными длинами цикла. Один с более коротким циклом используется для улавливания сигналов перекупа и перепродажи, в то время как другой с более длинным циклом используется для подтверждения обратного движения тренда. Когда краткосрочный RSI показывает перекуп / перепродажу, а длинный цикл RSI показывает обратный ход, мы считаем, что сформировалась торговая возможность.
Для Bollinger Bands мы контролируем, проходит ли цена через верхние и нижние рельсы. Пробивание через верхние рельсы Bollinger Bands является точкой продажи, а прорыв через нижние рельсы - точкой покупки. В то же время мы также контролируем, возвращается ли цена к Bollinger Bands, чтобы возможности обратного движения могли быть вовремя захвачены.
Когда сигналы RSI и Bollinger Bands появляются одновременно, мы считаем, что торговая возможность сформировалась и выдан ордер на торговлю.
Риски можно избежать и контролировать путем оптимизации параметров, соответствующего сокращения позиций, ручного вмешательства и т.д.
Двойная стратегия RSI и Bollinger Bands в полной мере использует сильные стороны обоих индикаторов для создания высококачественных сигналов. При надлежащей оптимизации параметров и управлении рисками она может достигать стабильной доходности от инвестиций.
/*backtest start: 2023-11-11 00:00:00 end: 2023-12-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Ezieh Str.v2", shorttitle="Ezieh Str.v2", overlay=true, pyramiding=10, currency=currency.USD, slippage=3, commission_type=strategy.commission.cash_per_order, commission_value=0.04, initial_capital=1000) UseDateFilter = input(title="Enable Date Filter" ,type=input.bool ,defval=false ,group="Date & Time" ,tooltip="Turns on/off date filter") StartDate = input(title="Start Date Filter" ,type=input.time ,defval=timestamp("1 Jan 2000 00:00 +0000") ,group="Date & Time" ,tooltip="Date & time to start excluding trades") EndDate = input(title="End Date Filter" ,type=input.time ,defval=timestamp("1 Jan 2100 00:00 +0000") ,group="Date & Time" ,tooltip="Date & time to stop excluding trades") UseTimeFilter = input(title="Enable Time Session Filter" ,type=input.bool ,defval=false ,group="Date & Time" ,tooltip="Turns on/off time session filter") TradingSession = input(title="Trading Session" ,type=input.session ,defval="1000-2200:1234567" ,group="Date & Time" ,tooltip="No trades will be taken outside of this range") In(t) => na(time(timeframe.period, t)) == false TimeFilter = (UseTimeFilter and not In(TradingSession)) or not UseTimeFilter DateFilter = time >= StartDate and time <= EndDate DateTime = (UseDateFilter ? not DateFilter : true) and (UseTimeFilter ? In(TradingSession) : true) ///////////// RSI L_RSI_Length = input(7 , title="L_Length") L_RSI_OverSold = input(45 , title="L_OverSold") S_RSI_Length = input(14 , title="S_Length") S_RSI_OverBought = input(65 , title="S_OverBought") price = close Lvrsi = rsi(price, L_RSI_Length) Svrsi = rsi(price, S_RSI_Length) ///////////// Bollinger Bands BBlength = input(title="Bollinger Period Length", type=input.integer, defval=100, minval=2) BBmult = 2.1 // input(2.0, minval=0.001, maxval=50,title="Bollinger Bands Standard Deviation") BBbasis = sma(price, BBlength) BBdev = BBmult * stdev(price, BBlength) BBupper = BBbasis + BBdev BBlower = BBbasis - BBdev source = close plot(BBbasis, color=color.aqua,title="Bollinger Bands SMA Basis Line") p1 = plot(BBupper, color=color.silver,title="Bollinger Bands Upper Line") p2 = plot(BBlower, color=color.silver,title="Bollinger Bands Lower Line") fill(p1, p2) ///////////// Colors switch1=input(true, title="Enable Bar Color?") switch2=input(true, title="Enable Background Color?") ///////////// Condition LongCondition = crossover(Lvrsi, L_RSI_OverSold) and crossover(close ,BBlower) ShortCondition = crossunder(Svrsi, S_RSI_OverBought) and crossunder(close,BBupper) Longexcon = crossunder(low, BBupper) Shortexcon = crossover(low, BBlower) qt = round(strategy.equity/price, 3) ///////////// RSI + Bollinger Bands Strategy if (not na(Lvrsi)) if LongCondition and DateTime strategy.entry("RSI_BB_L", strategy.long, qty=qt, comment="Long") else strategy.cancel(id="RSI_BB_L") if Longexcon strategy.close("RSI_BB_L", qty_percent = 100, comment = "L_exit") if ShortCondition and DateTime strategy.entry("RSI_BB_S", strategy.short, qty=qt, comment="Short") else strategy.cancel(id="RSI_BB_S") if Shortexcon strategy.close("RSI_BB_S", qty_percent = 100, comment = "S_exit") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)