이 전략은 상대 강도 지수 (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의 오차를 동시에 탐지
이 전략은 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 -----