
Esta estratégia é um sistema de negociação quantitativa que combina o índice de força relativa (RSI) e a média móvel (MA) para identificar tendências de mercado e oportunidades de negociação por meio da sinergia dos dois indicadores. O sistema também incorpora filtros de volume e volatilidade para aumentar a confiabilidade dos sinais de negociação. A ideia central da estratégia é determinar a direção da tendência por meio do cruzamento da média móvel rápida e da média móvel lenta e usar o RSI para confirmar o momentum, formando, em última análise, uma estrutura completa de decisão de negociação.
A estratégia adota um mecanismo de confirmação de sinal de camada dupla:
Esta estratégia estabelece um sistema de negociação relativamente completo usando de forma abrangente indicadores de tendência e momentum. As vantagens do sistema estão em seu mecanismo de confirmação de sinal multinível e no sistema de gerenciamento de risco perfeito, mas na aplicação real, é necessário prestar atenção ao impacto do ambiente de mercado no desempenho da estratégia e otimizar os parâmetros com base nas condições reais. Por meio de melhoria e otimização contínuas, espera-se que a estratégia mantenha um desempenho estável em diferentes ambientes de mercado.
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
// © Boba2601
//@version=5
strategy("RSI-MA Synergy", overlay=true, margin_long=100, margin_short=100)
// === Налаштування індикаторів ===
length_rsi = input.int(14, title="RSI Period", group="Індикатори")
fastMALength = input.int(9, title="Fast MA Length", group="Індикатори")
slowMALength = input.int(21, title="Slow MA Length", group="Індикатори")
// === Налаштування стоп-лосу і тейк-профіту ===
useStopLossTakeProfit = input.bool(true, title="Використовувати стоп-лос і тейк-профіт", group="Стоп-лос і Тейк-профіт")
stopLossPercent = input.float(2.0, title="Стоп-лос (%)", minval=0.1, step=0.1, group="Стоп-лос і Тейк-профіт")
takeProfitPercent = input.float(4.0, title="Тейк-профіт (%)", minval=0.1, step=0.1, group="Стоп-лос і Тейк-профіт")
// === Налаштування об'єму та волатильності ===
useVolumeFilter = input.bool(false, title="Використовувати фільтр об'єму", group="Об'єм та Волатильність")
volumeThreshold = input.int(50000, title="Мінімальний об'єм", group="Об'єм та Волатильність")
useVolatilityFilter = input.bool(false, title="Використовувати фільтр волатильності", group="Об'єм та Волатильність")
atrLength = input.int(14, title="Період ATR для волатильності", group="Об'єм та Волатильність")
volatilityThreshold = input.float(1.5, title="Мінімальна волатильність (ATR)", step=0.1, group="Об'єм та Волатильність")
// === Розрахунок індикаторів ===
rsiValue = ta.rsi(close, length_rsi)
fastMA = ta.sma(close, fastMALength)
slowMA = ta.sma(close, slowMALength)
// === Розрахунок об'єму та волатильності ===
averageVolume = ta.sma(volume, 20)
atrValue = ta.atr(atrLength)
// === Умови входу в позицію ===
longCondition = ta.crossover(fastMA, slowMA) and rsiValue < 50
if useVolumeFilter
longCondition := longCondition and volume > volumeThreshold
if useVolatilityFilter
longCondition := longCondition and atrValue > volatilityThreshold
shortCondition = ta.crossunder(fastMA, slowMA) and rsiValue > 50
if useVolumeFilter
shortCondition := shortCondition and volume > volumeThreshold
if useVolatilityFilter
shortCondition := shortCondition and atrValue > volatilityThreshold
// === Логіка входу та виходу з позиції ===
if (longCondition)
strategy.entry("Long", strategy.long)
if (useStopLossTakeProfit)
stopLossPrice = close * (1 - stopLossPercent / 100)
takeProfitPrice = close * (1 + takeProfitPercent / 100)
strategy.exit("Exit Long", "Long", stop = stopLossPrice, limit = takeProfitPrice)
if (shortCondition)
strategy.entry("Short", strategy.short)
if (useStopLossTakeProfit)
stopLossPrice = close * (1 + stopLossPercent / 100)
takeProfitPrice = close * (1 - takeProfitPercent / 100)
strategy.exit("Exit Short", "Short", stop = stopLossPrice, limit = takeProfitPrice)
// === Закриття позицій за зворотнім сигналом ===
if (strategy.position_size > 0 and (ta.crossunder(fastMA, slowMA) or rsiValue > 50))
strategy.close("Long", comment="Закрито по сигналу")
if (strategy.position_size < 0 and (ta.crossover(fastMA, slowMA) or rsiValue < 50))
strategy.close("Short", comment="Закрито по сигналу")