리소스 로딩... 로딩...

다중 이동 평균 크로스오버와 함께 동적 RSI 양적 거래 전략

저자:차오장, 날짜: 2025-01-17 16:14:38
태그:RSIMASMAEMAWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

전반적인 설명

이 전략은 상대 강도 지수 (RSI) 를 여러 이동 평균과 결합한 양적 거래 전략이다. 전략은 주로 RSI 지표에서 다른 유형의 이동 평균 (SMA, EMA, WMA, SMMA를 포함하여) 사이의 교차 신호를 모니터링하여 시장 트렌드를 식별하며, 추가 결정 기준으로 RSI overbought 및 oversold 구역을 사용합니다.

전략 원칙

이 전략은 몇 가지 주요 계산 단계를 포함합니다. 1. 70에서 과잉 구매 수준과 30에서 과잉 판매 수준과 14 기간 RSI를 계산 2. RSI 곡선에서 세 가지 다른 이동 평균을 계산합니다. - MA1: 20주기, SMA/EMA/WMA/SMMA 선택 - MA2: 50주기, SMA/EMA/WMA/SMMA 선택 - MA3: 100주기, SMA/EMA/WMA/SMMA 선택 거래 신호 생성 규칙: - 구매 신호: MA2가 MA3를 넘을 때 - 판매 신호: MA2가 MA3 아래로 넘어가면 4. 추가 참조를 위해 RSI의 오차를 동시에 탐지

전략적 장점

  1. 여러 기술 지표의 교차 검증은 신호 신뢰성을 향상시킵니다.
  2. 유연한 이동 평균 유형 및 매개 변수
  3. RSI 격차 검출은 시장 전환점을 조기에 파악하는 데 도움이됩니다
  4. 효율적인 위험 통제를 위한 비율 기반의 포지션 관리
  5. 분석 및 백테스팅을 위한 우수한 시각화

전략 위험

  1. 이동 평균 크로스오버는 지연 효과를 가질 수 있습니다.
  2. 다양한 시장에서 잘못된 신호가 발생할 수 있습니다.
  3. 특정 시장 조건에서 RSI 왜곡
  4. 부적절한 매개 변수 선택은 과도한 또는 불충분한 거래 신호로 이어질 수 있습니다. 위험 완화:
  • 시장 추세와 부피와 함께 교차 검증을 권장합니다
  • 이동 평균 매개 변수 조정으로 거래 빈도를 최적화
  • 리스크 통제를 위해 스톱 로스 (stop loss) 및 리프트 (take profit) 수준을 설정합니다.

전략 최적화 방향

  1. 신호 필터링 최적화:
  • 트렌드 확인 지표 추가
  • 부피 분석을 포함
  1. 파라미터 동적 최적화:
  • 시장 변동성에 따라 RSI 및 MA 매개 변수를 자동으로 조정합니다.
  • 적응 기간 계산 방법을 도입
  1. 위험 통제 최적화:
  • 역동적인 스톱 로스 및 수익 취득 메커니즘 개발
  • 동적 위치 관리 시스템 설계

요약

이 전략은 RSI와 여러 이동 평균을 결합하여 적응 가능한 거래 시스템을 구축합니다. 주요 장점은 여러 기술적 지표와 유연한 매개 변수 구성의 교차 검증에 있으며 이동 평균 지연과 시장 조건이 전략 성과에 미치는 영향에주의를 기울여야합니다. 지속적인 최적화 및 위험 통제를 통해이 전략은 실제 거래에서 안정적인 성과를 얻을 수 있습니다.


/*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}]
*/

//@version=6
strategy(title="Relative Strength Index with MA Strategy", shorttitle="RSI-MA Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// RSI Inputs
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
calculateDivergence = input.bool(false, title="Calculate Divergence", group="RSI Settings", tooltip="Calculating divergences is needed in order for divergence alerts to fire.")

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

// RSI Plot
plot(rsi, "RSI", color=#7E57C2)
hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
hline(30, "RSI Lower Band", color=#787B86)
fill(hline(70), hline(30), color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

// RSI-based MA Inputs
grpRSIMovingAverages = "RSI Moving Averages"
ma1Length = input.int(20, title="MA1 Length", group=grpRSIMovingAverages)
ma2Length = input.int(50, title="MA2 Length", group=grpRSIMovingAverages)
ma3Length = input.int(100, title="MA3 Length", group=grpRSIMovingAverages)
ma1Type = input.string("SMA", title="MA1 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma2Type = input.string("EMA", title="MA2 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma3Type = input.string("WMA", title="MA3 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)

// MA Calculation Function
calcMA(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "WMA" => ta.wma(source, length)
        "SMMA" => ta.rma(source, length)

// MA Calculations
ma1 = calcMA(rsi, ma1Length, ma1Type)
ma2 = calcMA(rsi, ma2Length, ma2Type)
ma3 = calcMA(rsi, ma3Length, ma3Type)

// MA Plots
plot(ma1, title="RSI MA1", color=color.blue)
plot(ma2, title="RSI MA2", color=color.green)
plot(ma3, title="RSI MA3", color=color.red)

// Divergence (Retained from original script)
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

_inRange(bool cond) =>
    bars = ta.barssince(cond)
    rangeLower <= bars and bars <= rangeUpper

plFound = false
phFound = false

bullCond = false
bearCond = false

rsiLBR = rsi[lookbackRight]

if calculateDivergence
    // Regular Bullish
    plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight))    
    rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and _inRange(plFound[1])
    lowLBR = low[lookbackRight]
    priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1)
    bullCond := priceLL and rsiHL and plFound

    // Regular Bearish
    phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight))
    rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and _inRange(phFound[1])
    highLBR = high[lookbackRight]
    priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1)
    bearCond := priceHH and rsiLH and phFound

// plot(
//      plFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bullish",
//      linewidth=2,
//      color=(bullCond ? bullColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bullCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bullish Label",
     text=" Bull ",
     style=shape.labelup,
     location=location.absolute,
     color=bullColor,
     textcolor=textColor
     )

// plot(
//      phFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bearish",
//      linewidth=2,
//      color=(bearCond ? bearColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bearCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bearish Label",
     text=" Bear ",
     style=shape.labeldown,
     location=location.absolute,
     color=bearColor,
     textcolor=textColor
     )

alertcondition(bullCond, title='Regular Bullish Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.")
alertcondition(bearCond, title='Regular Bearish Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.')

// ----- MUA/BÁN -----

// Điều kiện Mua: MA2 cắt lên MA3 và MA3 < 55
buyCondition = ta.crossover(ma2, ma3) 

// Điều kiện Bán: MA2 cắt xuống MA3 và MA3 > 40
sellCondition = ta.crossunder(ma2, ma3)

// Thực hiện lệnh Mua/Bán
if (buyCondition)
    strategy.entry("Buy", strategy.long, comment="Buy Signal")

if (sellCondition)
    strategy.close("Buy", comment="Sell Signal")



// ----- KẾT THÚC -----


관련

더 많은