
Эта стратегия представляет собой систему торговли на развороте тренда, основанную на индексе относительной силы (RSI). Она фиксирует поворотные моменты рынка, устанавливая диапазоны перекупленности и перепроданности, и сочетает динамический стоп-лосс ATR для контроля риска. Уникальность стратегии заключается во введении понятия «запрещенного торгового диапазона», что позволяет эффективно избегать частой торговли на волатильном рынке. Эта стратегия подходит для рыночных сред с повышенной волатильностью, особенно для торговли продуктами с явно выраженными трендовыми характеристиками.
Стратегия в основном реализуется на основе следующей базовой логики:
Эта стратегия решает проблему выбора времени в трендовой торговле посредством инновационного сочетания сигналов разворота RSI и запрещенных торговых диапазонов. Внедрение динамического стоп-лосса ATR обеспечивает надежный механизм контроля рисков для стратегии. Хотя стратегия все еще несет в себе некоторые потенциальные риски, ее стабильность и прибыльность можно дополнительно повысить за счет рекомендуемых направлений оптимизации. В целом, это торговая стратегия разворота тренда с четкой логикой и большой практичностью.
/*backtest
start: 2024-12-19 00:00:00
end: 2024-12-26 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI-Based Trading Strategy with No Trading Zone and ATR Stop Loss", overlay=true)
// Input parameters
rsiPeriod = input(14, title="RSI Period")
rsiOverbought = input(60, title="RSI Overbought Level")
rsiOversold = input(40, title="RSI Oversold Level")
rsiExitBuy = input(45, title="RSI Exit Buy Level")
rsiExitSell = input(55, title="RSI Exit Sell Level")
atrPeriod = input(14, title="ATR Period")
atrMultiplier = input(1.5, title="ATR Stop Loss Multiplier")
// Calculate RSI and ATR
rsi = ta.rsi(close, rsiPeriod)
atr = ta.atr(atrPeriod)
// Buy conditions
buyCondition = ta.crossover(rsi, rsiOverbought) and close > high[1]
if (buyCondition and not strategy.position_size)
stopLossLevel = close - atr * atrMultiplier
strategy.entry("Buy", strategy.long, stop=stopLossLevel)
// Exit conditions for buy
exitBuyCondition = rsi < rsiExitBuy
if (exitBuyCondition and strategy.position_size > 0)
strategy.close("Buy")
// Sell conditions
sellCondition = ta.crossunder(rsi, rsiOversold) and close < low[1]
if (sellCondition and not strategy.position_size)
stopLossLevel = close + atr * atrMultiplier
strategy.entry("Sell", strategy.short, stop=stopLossLevel)
// Exit conditions for sell
exitSellCondition = rsi > rsiExitSell
if (exitSellCondition and strategy.position_size < 0)
strategy.close("Sell")
// Plotting RSI for visualization
hline(rsiOverbought, "Overbought", color=color.red)
hline(rsiOversold, "Oversold", color=color.green)
hline(rsiExitBuy, "Exit Buy", color=color.blue)
hline(rsiExitSell, "Exit Sell", color=color.orange)
plot(rsi, title="RSI", color=color.purple)
// // No Trading Zone
// var box noTradingZone = na
// // Create a rectangle for the no trading zone
// if (rsi >= rsiExitBuy and rsi <= rsiExitSell)
// // If the no trading zone box does not exist, create it
// if (na(noTradingZone))
// noTradingZone := box.new(bar_index, high, bar_index + 1, low, bgcolor=color.new(color.gray, 90), border_color=color.new(color.gray, 90))
// else
// // Update the existing box to cover the current candle
// box.set_left(noTradingZone, bar_index)
// box.set_right(noTradingZone, bar_index + 1)
// box.set_top(noTradingZone, high)
// box.set_bottom(noTradingZone, low)
// else
// // If the RSI is outside the no trading zone, delete the box
// if (not na(noTradingZone))
// box.delete(noTradingZone)
// noTradingZone := na