이 전략은 상대적 강도 지수 (RSI) 와 이동 평균 (MA) 를 결합하여 시장 추세와 거래 기회를 식별하는 양적 거래 시스템이다. 이 시스템은 거래 신호의 신뢰성을 향상시키기 위해 볼륨 및 변동성 필터도 포함합니다. 핵심 개념은 RSI를 사용하여 추진력을 확인하는 동안 빠르고 느린 이동 평균의 크로스오버를 통해 트렌드 방향을 결정하는 것입니다. 궁극적으로 완전한 거래 결정 프레임워크를 형성합니다.
이 전략은 이중 신호 확인 메커니즘을 사용합니다. 트렌드 확인 계층: 시장 추세를 결정하기 위해 빠른 이동 평균 (FastMA) 과 느린 이동 평균 (SlowMA) 의 교차를 사용합니다. 빠른 선이 느린 선 위에 넘을 때 상승 추세가 설정됩니다. 빠른 선이 느린 선 아래에 넘을 때 하락 추세가 설정됩니다. 2. 모멘텀 확인 계층: 모멘텀 확인 도구로 RSI를 사용합니다. 상승 트렌드에서 RSI는 상승 잠재력을 나타내는 50 이하여야합니다. 하락 트렌드에서 RSI는 하락 잠재력을 나타내는 50 이상해야합니다. 3. 거래 필터: 유동성 또는 변동성이 충분하지 않은 신호를 필터링하기 위해 볼륨 및 ATR 변동성에 대한 최소한의 문턱을 설정합니다.
이 전략은 트렌드 및 모멘텀 지표의 통합적 사용을 통해 포괄적인 거래 시스템을 구축한다. 이 시스템의 강점은 다층 신호 확인 메커니즘과 포괄적인 리스크 관리 프레임워크에 있다. 그러나 실질적인 적용은 실제 상황에 따라 전략 성과 및 매개 변수 최적화에 대한 시장 조건의 영향에 대한 관심을 필요로 한다. 지속적인 개선과 최적화를 통해 이 전략은 다양한 시장 환경에서 안정적인 성과를 유지할 잠재력을 가지고 있다.
/*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="Закрито по сигналу")