Esta é uma estratégia quantitativa de negociação que combina o Índice de Força Relativa (RSI) com múltiplas médias móveis. A estratégia identifica principalmente as tendências do mercado monitorando sinais cruzados entre diferentes tipos de médias móveis (incluindo SMA, EMA, WMA e SMMA) no indicador RSI, usando as zonas de sobrecompra e sobrevenda do RSI como critérios de decisão suplementares.
A estratégia inclui várias etapas-chave de cálculo: 1. Calcule o RSI de 14 períodos com nível de sobrecompra em 70 e nível de sobrevenda em 30 Calcule três médias móveis diferentes na curva RSI: - MA1: período de 20 anos, escolha de SMA/EMA/WMA/SMMA - MA2: período de 50 anos, escolha de SMA/EMA/WMA/SMMA - MA3: período de 100 anos, escolha de SMA/EMA/WMA/SMMA Regras de geração de sinais comerciais: - sinal de compra: quando o MA2 cruza acima do MA3 - sinal de venda: quando o MA2 cruza abaixo do MA3 4. Detectar simultaneamente as divergências do RSI para referência adicional
A estratégia constrói um sistema de negociação adaptável, combinando RSI e múltiplas médias móveis. Suas principais vantagens estão na validação cruzada de múltiplos indicadores técnicos e configuração de parâmetros flexíveis, enquanto a atenção deve ser dada ao atraso da média móvel e aos impactos das condições do mercado no desempenho da estratégia. Através da otimização contínua e controle de riscos, essa estratégia mostra promessa de desempenho estável na negociação real.
/*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 -----