다중 필터링 RSI 모멘텀 확인 거래 전략

RSI ATR supertrend SMA EMA RMA WMA
생성 날짜: 2025-05-22 10:28:45 마지막으로 수정됨: 2025-05-22 10:28:45
복사: 1 클릭수: 422
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다중 필터링 RSI 모멘텀 확인 거래 전략 다중 필터링 RSI 모멘텀 확인 거래 전략

개요

다중 필터링 RSI 동력 확인 거래 전략은 암호화폐 시장을 위해 특별히 설계된 체계적인 거래 방법이다. 이 전략은 RSI 동력 신호, 거래량 확인 및 정확한 K선 형태를 인식하는 것을 결합하여 높은 확률의 진입 지점을 식별하고, 약한 신호를 필터링한다. 이 전략은 RSI 동력 변환, 눈에 띄는 거래량 및 강력한 K선 형태를 요구함으로써 거래에 들어가기 위해 동시에 충족되는 여러 조건을 요구하는 다중 필터링 시스템을 시행한다.

이 전략의 핵심은 여러 확증 메커니즘의 강력한 조합에 있습니다. RSI는 잠재적인 동력 전환을 식별하지만, 흔들리는 시장에서 가짜 신호를 생성할 수 있습니다. 거래량 확증은 충분한 시장 관심이있을 때만 거래하도록 보장하고, K선 형태는 강력한 가격 행동을 요구하여 약한 역전을 필터링하도록 요구합니다. 이 세 가지 필터가 결합되어 사용되면, 강력한 동력 전환을 포착하면서 가짜 신호를 크게 줄입니다.

전략 원칙

이 전략의 핵심 논리는 세 가지 주요 기술 지표의 연동 작용에 기초한다. 첫째는 RSI 동력 검출 메커니즘이다. 전략은 14주기 RSI 지표를 사용하여 70을 초과 구매 수준으로 설정하고, 30을 초과 판매 수준으로 설정한다.

두 번째 핵심 구성 요소는 거래량 확인 시스템이다. 전략은 현재 K 라인의 거래량이 14주기 거래량 간단한 이동 평균을 초과해야 한다고 요구하며, 이는 거래가 충분한 시장 참여가 있을 때만 실행되도록 보장하며, 따라서 낮은 유동성 환경에서 가짜 돌파구를 필터링한다. 세 번째 필터는 K 라인 형태 분석이며, 강력한 호불호 또는 호불호 K 라인을 요구하며, 그 중 실물 부분은 K 라인의 총 범위에 적어도 50%를 차지해야하며, 이는 가격 움직임이 결정적인 특성을 지니고 있으며, 불확실한 시장 조건에서 약한 신호를 피한다.

전략은 또한 선택 가능한 슈퍼 트렌드 필터를 제공하며, 활성화되면, 다중 헤드 입장은 슈퍼 트렌드의 상승 방향과 일치해야하며, 허드 입장은 하향 경향과 일치해야 한다. 동적 ATR 중지 시스템은 현재 시장의 변동에 따라 보호 수준을 조정하고, 3.5 배의 ATR 배수를 사용하여 중지 및 수익 목표를 계산하거나, 고정 0.5%의 중지 옵션을 제공하며, 리스크 수익률은 1.5: 1으로 설정된다.

우위 분석

다중 필터링 RSI 동력 확인 거래 전략에는 여러 가지 중요한 장점이 있습니다. 첫째, 강력한 신호 필터링 능력으로 RSI 동력 전환, 거래량 확인 및 강력한 K선 형태를 요구하는 세 가지 조건이 동시에 충족됨으로써 전략은 가짜 신호의 가능성을 크게 줄입니다. 이러한 다중 확인 메커니즘은 시장이 진정한 동력 전환의 징후를 표시 할 때만 거래를 수행하도록 보장하여 거래의 성공률을 높입니다.

둘째, 전략은 뛰어난 적응력과 유연성을 가지고 있다. 동적 ATR 중지 시스템은 시장의 변동에 따라 보호 수준을 자동으로 조정할 수 있으며, 높은 변동기간에 더 느슨한 중지, 낮은 변동기간에 엄격한 보호 기능을 제공하며, 이러한 적응 특성은 전략이 다양한 시장 조건에서 유효성을 유지할 수 있도록 한다. 선택 가능한 슈퍼 트렌드 필터는 트레이더에게 추가적인 트렌드 확인 도구를 제공하여 신호 품질을 더욱 향상시킵니다.

세 번째 중요한 장점은 포괄적 인 위험 관리 시스템입니다. 전략은 두 가지 출구 방법을 제공합니다. ATR 기반의 동적 중지 및 고정 비율 중지, 거래자는 자신의 위험 취향에 따라 적절한 방법을 선택할 수 있습니다. 1.5: 1의 리스크 수익 비율 설정은 우수한 이익과 손실의 균형을 보장하며, 약간의 승률이 낮더라도 수익성을 유지할 수 있습니다. 전략은 또한 다중 방향의 거래 구성을 지원합니다.

위험 분석

이 전략은 여러 가지 필터링 메커니즘을 가지고 있음에도 불구하고, 몇 가지 잠재적인 위험이 있습니다. 주의해야 할 주요 위험은 강력한 트렌드 시장에서 거래 기회를 놓칠 수 있습니다. 전략이 RSI의 과매매 신호에 의존하기 때문에, 지속적인 상승 또는 하락의 강한 트렌드에서 RSI는 극단적인 수준에서 오랫동안 유지될 수 있으며, 전략이 입찰 신호를 생성하지 못하여 중요한 트렌드 기회를 놓치게됩니다.

두 번째 중요한 위험은 흔들리는 시장에서 자주 거래하는 것입니다. 다중 필터가 가짜 신호를 줄였음에도 불구하고, 수평 정리 단계에서 시장은 여전히 효과가있는 것처럼 보이지만 결국 실패한 여러 돌파구를 만들 수 있습니다. 이것은 연속적으로 작은 손실이 쌓이는 데 이어질 수 있습니다. 완화 전략은 변동률 지표 또는 추세 강도 지표와 같은 추가 시장 상태 필터를 추가하여 낮은 추세 환경에서 거래를 중단하는 것입니다.

세 번째 위험은 변수 최적화 과잉 적합에 관한 것입니다. 전략에는 RSI 길이는 물론 ATR 주기, 리스크 수익률 등과 같은 여러 가지 조정 가능한 변수가 포함되어 있습니다. 이러한 변수를 역사 데이터에 맞게 과잉 최적화하면 미래의 성능이 좋지 않을 수 있습니다.

최적화 방향

이 전략에는 여러 가지 중요한 최적화 방향이 있습니다. 첫째, 시장 상태를 식별하는 능력을 강화하는 것입니다. 평균 실제 범위 비율, 변동률 지수 또는 추세 강도 지표와 같은 추가 시장 분류 지표를 통합하여 다른 시장 환경을 더 잘 식별 할 수 있습니다. 높은 변동률 환경에서 전략은 RSI 경계를 조정하거나 추가 확인 조건을 추가 할 수 있습니다. 낮은 변동률 환경에서 신호 감성을 높이기 위해 매개 변수를 강화 할 수 있습니다. 이러한 적응 매개 변수 조정은 다양한 시장 조건에서 전략의 성능을 크게 향상시킬 것입니다.

두 번째 최적화 방향은 다중 시간 프레임 분석을 수행하는 것입니다. 현재 전략은 주로 단일 시간 프레임에서 작동하며, 더 높은 시간 프레임의 트렌드 확인을 통합하여 신호 품질을 크게 향상시킬 수 있습니다. 예를 들어, 5 분 차트에 전략을 실행할 때, 15 분 또는 1 시간 차트에 대한 트렌드 방향이 정렬되도록 요청할 수 있습니다.

세 번째 핵심 최적화는 동적 위치 관리 시스템의 구현이다. 현재 전략은 고정된 리스크/이익 비율을 사용하지만, 시장의 변동성, 신호 강도 또는 역사적인 성과에 따라 위치 크기와 목표를 조정할 수 있다. 고확정성 신호가 있을 때 포지션을 늘리고, 불확실성이 높을 때 포지션을 줄이는 이러한 동적 조정은 자본의 효율성을 극대화한다.

네 번째 최적화 방향은 통합된 기계 학습 구성요소이다. 최우수 입시 조건 조합을 식별하거나 신호의 성공 가능성을 예측하기 위해 역사 데이터 훈련 모델을 사용할 수 있다. 이 방법은 정적인 설정에 의존하지 않고 현재 시장 조건에 따라 전략 매개 변수를 동적으로 조정할 수 있다.

요약하다

다중 필터링 RSI 동력 확인 거래 전략은 기술 지표, 거래량 분석 및 위험 관리를 능숙하게 결합하여 강력한 거래 시스템을 만드는 숙련된 양적 거래 방법을 나타냅니다. 이 전략의 핵심 장점은 여러 층의 필터링 메커니즘으로 거짓 신호를 효과적으로 줄이면서 실제 시장 기회에 대한 민감성을 유지하는 것입니다. 동적 ATR 제지 시스템과 유연한 파라미터 구성은 다른 시장 환경과 거래 선호도에 적응할 수 있습니다.

이 전략은 BTCUSDT 5분 차트에 대한 피드백 결과에서 58.49%의 승률, 1.472의 수익 인자, 그리고 단지 3.01%의 최대 회수에서 위험 조정된 수익의 유효성을 증명합니다. 그러나 거래자는 모든 전략에, 특히 빠르게 변화하는 암호화폐 시장에서, 고유한 위험이 있음을 인식해야합니다.

이 전략을 성공적으로 실행하려면 지속적인 모니터링, 정기적인 파라미터 평가 및 시장 조건의 변화에 대한 적응적 조정이 필요합니다. 이 전략은 특히 다중 시간 프레임 분석 및 동적 파라미터 조정과 같은 제안된 최적화 방향을 통해 성과를 더욱 향상시킬 수있는 큰 잠재력을 가지고 있습니다. 궁극적으로,이 전략은 체계적인 방법을 찾는 거래자에게 암호화폐 거래에 진입하는 데 강력한 기반을 제공하지만 항상 적절한 위험 관리와 지속적인 학습과 함께해야합니다.

전략 소스 코드
/*backtest
start: 2024-05-21 00:00:00
end: 2025-05-20 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © nioboi

// Best settings already at default. 
// Use at BTCUSDT 5m chart
// strategy properties: start with 100 usdt capital, set order size to be 20 usdt
// for indicator use (buy sell signals only), rightclick on chart and disable "Trades On Chart"

//@version=6
strategy("Volume FIltered RSI Buy/Sell Strategy", overlay=true, process_orders_on_close=true, commission_value=0.055, initial_capital=100, currency=currency.USDT, pyramiding=1)

// =========================================
// Input Groups
// =========================================
string rsi_group = "RSI"
string atr_sl_finder_group = "ATR SL Finder"
string trade_execution_group = "Strategy Execution"
string supertrend_group = "Supertrend Filter"
string range_filter_group = "Range Detector Filter"

// =========================================
// RSI Calculation
// =========================================
rsi_ob = input.int(70, "Overbought Level", group=rsi_group)
rsi_os = input.int(30, "Oversold Level", group=rsi_group)
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group=rsi_group)
rsiSourceInput = input.source(close, "Source", group=rsi_group)

change = ta.change(rsiSourceInput)
up = ta.rma(math.max(change, 0), rsiLengthInput)
down = ta.rma(-math.min(change, 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsi_can_long = rsi[1] < rsi_os and rsi >= rsi_os
rsi_can_short = rsi[1] > rsi_ob and rsi <= rsi_ob

// =========================================
// Candle Body Conditions
// =========================================
isBullCandle = close > open and (math.abs(close - open) > (high - low) * 0.5)
isBearCandle = close < open and (math.abs(close - open) > (high - low) * 0.5)

// =========================================
// Volume Filter
// =========================================
has_volume = volume >= ta.sma(volume, 14)

// Initial can_long and can_short
can_long = rsi_can_long and isBullCandle and has_volume
can_short = rsi_can_short and isBearCandle and has_volume

// =========================================
// Supertrend Filter
// =========================================
useSupertrendFilter = input.bool(false, "Use Supertrend Filter", group=supertrend_group)
st_tf = input.timeframe("", "Supertrend Timeframe", group=supertrend_group)
atrPeriod = input.int(10, "ATR Length", minval=1, group=supertrend_group)
factor = input.float(3.0, "Factor", minval=0.01, step=0.01, group=supertrend_group)

[supertrendVal, directionVal] = request.security(syminfo.tickerid, st_tf, ta.supertrend(factor, atrPeriod))

if useSupertrendFilter
    can_long := can_long and directionVal < 0 and close > supertrendVal
    can_short := can_short and directionVal > 0 and close < supertrendVal

// =========================================
// ATR SL Finder © Veryfid
// =========================================
atrlength = input.int(title='Length', defval=14, minval=1, group=atr_sl_finder_group)
smoothing = input.string(title='Smoothing', defval='RMA', options=['RMA','SMA','EMA','WMA'], group=atr_sl_finder_group)
m = input(3.5, 'Multiplier', group=atr_sl_finder_group)
src1 = high
src2 = low

ma_function(source, length) =>
    if smoothing == 'RMA'
        ta.rma(source, length)
    else
        if smoothing == 'SMA'
            ta.sma(source, length)
        else
            if smoothing == 'EMA'
                ta.ema(source, length)
            else
                ta.wma(source, length)

x = ma_function(ta.tr(true), atrlength) * m + src1 // SHORT SL
x2 = src2 - ma_function(ta.tr(true), atrlength) * m // LONG SL

p1 = plot(x, title="ATR Short Stop Loss", color=#ffffff18)
p2 = plot(x2, title="ATR Long Stop Loss", color=#ffffff18)

// =========================================
// Strategy Execution
// =========================================
tradeDirection = input.string("Both", "Trade Direction", ["Long Only","Short Only","Both"], group=trade_execution_group)
risk_reward_ratio = input.float(1.5, "Risk Reward Ratio", group=trade_execution_group)
exit_strategy = input.string("Fixed Percent", "Exit Strategy", ["ATR","Fixed Percent"], group=trade_execution_group)
SLPercent = input.float(0.5, "Stoploss Percent (%)", group=trade_execution_group)

enterLong = can_long and (tradeDirection == "Long Only" or tradeDirection == "Both")
enterShort = can_short and (tradeDirection == "Short Only" or tradeDirection == "Both")

var bool plotMarkers_long = false
var float sl_long = na
var float tp2_long = na
var float entryPrice_long = na

var bool plotMarkers_short = false
var float sl_short = na
var float tp2_short = na
var float entryPrice_short = na

if exit_strategy == "ATR"
    // Long Entries
    if enterLong and strategy.position_size == 0
        entryPrice_long := close
        sl_long := x2
        risk = entryPrice_long - sl_long
        tp2_long := entryPrice_long + (risk_reward_ratio * risk)
        strategy.entry("Long", strategy.long)
        strategy.exit("Exit Long", "Long", limit=tp2_long, stop=sl_long)
    // Short Entries
    if enterShort and strategy.position_size == 0
        entryPrice_short := close
        sl_short := x
        risk = sl_short - entryPrice_short
        tp2_short := entryPrice_short - (risk_reward_ratio * risk)
        strategy.entry("Short", strategy.short)
        strategy.exit("Exit Short", "Short", limit=tp2_short, stop=sl_short)

if exit_strategy == "Fixed Percent"
    // Long Entries
    if enterLong and strategy.position_size == 0
        entryPrice_long := close
        sl_long := close * (1 - SLPercent / 100)
        risk = entryPrice_long - sl_long
        tp2_long := entryPrice_long + (risk_reward_ratio * risk)
        strategy.entry("Long", strategy.long)
        strategy.exit("Exit Long", "Long", limit=tp2_long, stop=sl_long)
    // Short Entries
    if enterShort and strategy.position_size == 0
        entryPrice_short := close
        sl_short := close * (1 + SLPercent / 100)
        risk = sl_short - entryPrice_short
        tp2_short := entryPrice_short - (risk_reward_ratio * risk)
        strategy.entry("Short", strategy.short)
        strategy.exit("Exit Short", "Short", limit=tp2_short, stop=sl_short)

// Entry Visual Flags
if strategy.position_size == 0
    plotMarkers_long := false
    plotMarkers_short := false
if strategy.position_size > 0
    plotMarkers_long := true
    plotMarkers_short := false
else if strategy.position_size < 0
    plotMarkers_long := false
    plotMarkers_short := true

// SL and TP Lines
longEntryMarker = plot(plotMarkers_long ? entryPrice_long : na, "Entry Marker L", color=na)
longSLMarker = plot(plotMarkers_long ? sl_long : na, "SL Marker L", color=#ff000050, linewidth=1, style=plot.style_linebr)
longTP2Marker = plot(plotMarkers_long ? tp2_long : na, "TP2 Marker L", color=#1100ff50, linewidth=1, style=plot.style_linebr)

plotshape(enterLong and strategy.position_size == 0, "BUY", shape.triangleup, location.belowbar, color.green, text="BUY", size=size.small, textcolor=color.green)
plotshape(enterShort and strategy.position_size == 0, "SELL", shape.triangledown, location.abovebar, color.red, text="SELL", size=size.small, textcolor=color.red)

shortEntryMarker = plot(plotMarkers_short ? entryPrice_short : na, "Entry Marker S", color=na)
shortSLMarker = plot(plotMarkers_short ? sl_short : na, "SL Marker S", color=#ff000050, linewidth=1, style=plot.style_linebr)
shortTP2Marker = plot(plotMarkers_short ? tp2_short : na, "TP2 Marker S", color=#1100ff50, linewidth=1, style=plot.style_linebr)

// SL and TP Fills
fill(plot1=longEntryMarker, plot2=longSLMarker, title="Long SL BG Fill", color=#b2283320)
fill(plot1=longEntryMarker, plot2=longTP2Marker, title="Long TP BG Fill", color=#08998120)
fill(plot1=shortEntryMarker, plot2=shortSLMarker, title="Short SL BG Fill", color=#b2283320)
fill(plot1=shortEntryMarker, plot2=shortTP2Marker, title="Short TP BG Fill", color=#08998120)

// Supertrend Plots (Only show if using supertrend filter)
upTrend = plot(useSupertrendFilter ? (directionVal < 0 ? supertrendVal : na) : na, "Up Trend", color=color.new(color.green,0), style=plot.style_linebr)
downTrend = plot(useSupertrendFilter ? (directionVal < 0 ? na : supertrendVal) : na, "Down Trend", color=color.new(color.red,0), style=plot.style_linebr)
bodyMiddle = plot(useSupertrendFilter ? (barstate.isfirst ? na : (open + close) / 2) : na, "Body Middle", display=display.none)

fill(bodyMiddle, upTrend,   color.new(color.green, 90), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red,   90), fillgaps=false)