Estratégia de negociação de swing crossover RSI MA com sistema Trailing Stop

RSI MA CROSSOVER TRAILING SL Swing Trading risk management
Data de criação: 2025-04-24 16:51:14 última modificação: 2025-04-24 16:51:14
cópia: 4 Cliques: 349
2
focar em
319
Seguidores

Estratégia de negociação de swing crossover RSI MA com sistema Trailing Stop Estratégia de negociação de swing crossover RSI MA com sistema Trailing Stop

Visão geral

A estratégia é uma estratégia de negociação de balanço baseada no RSI (indice relativamente forte) cruzado com sua média móvel (MA) e projetada para gráficos de 4 horas. A estratégia gera sinais de negociação por meio de forcas de ouro e forcas mortas do RSI e MA, e combina várias ferramentas de gerenciamento de risco, incluindo stop loss / stop loss fixo, stop loss de rastreamento e reversão de saída. A estratégia também define um limite de perda contínua, que suspende a negociação até a próxima reinicialização quando a perda contínua é superior a duas vezes.

Princípio da estratégia

  1. Limitação de tempoA estratégia funciona apenas em gráficos de 4 horas, garantindo que os sinais de negociação estejam de acordo com o ciclo de tempo projetado.
  2. Cálculo do indicador: Use o RSI (longitude padrão 14) e sua média móvel (SMA ou EMA, longitude padrão 14) para gerar um sinal.
    • O Gold Fork (MA sobre o RSI) desencadeia um sinal de compra (MA sobre o RSI)
    • O Dead Fork (MA abaixo do RSI) desencadeia um sinal de venda (MA abaixo do RSI) [2].
  3. Gestão de posições: O tamanho da posição é calculado de acordo com a distribuição de capital por transação e o preço atual.
  4. Mecanismo de saída
    • Paragem fixaBaseado em percentual, o Stop Loss (default 1.5%) e o Stop Stop (default 2.5%)
    • Perda de seguimento: Retirada é acionada quando o preço retira um determinado número de pontos do seu ponto mais alto (default 10).
    • Reversão de saída“O que você está fazendo aqui é um sinal de que você está perdendo tempo.
  5. Controle de Risco
    • Suspender a negociação após duas perdas consecutivas e reiniciar a conta de perdas às 9:15 todos os dias.

Análise de vantagens

  1. Verificação de sinal multidimensionalA correlação entre o RSI e o MA é um filtro duplo, reduzindo os falsos sinais.
  2. Gestão de Riscos DinâmicosO que é um “stop loss” (paragem de perda) fixo?
  3. Uma gestão rigorosa dos fundosA partir da distribuição de posições de capital, evitar o uso excessivo de alavancagem.
  4. Controle disciplinarO sistema de suspensão de perdas contínuas impede a negociação emocional.
  5. Marcações visuaisA marcação gráfica clara ajuda a identificar rapidamente os sinais e pontos de saída.

Análise de Riscos

  1. Sensibilidade do parâmetroO comprimento do RSI e do MA tem um grande impacto na qualidade do sinal, sendo necessário otimizá-lo para adaptar-se às flutuações do mercado.
  2. Performance do mercado de tendênciasEm uma tendência forte, o RSI pode estar sobrecomprando/soldando por um longo período, causando atraso no sinal.
  3. Limitação de tempo: Aplica-se apenas para gráficos de 4 horas, outros períodos precisam de reverificação.
  4. Risco de perdas contínuasO que você pode perder é uma oportunidade de lucro potencial antes de reiniciar o contador de perdas.
    Solução
  • Parâmetros de otimização através de retrocesso histórico.
  • Combinação de indicadores de tendência (como o ADX) para filtrar sinais.
  • Configure o limite do contador de perdas dinâmico.

Direção de otimização

  1. Integração de múltiplos indicadoresIntrodução de MACD ou confirmação de sinal de amplificação de banda Brin.
  2. Ajuste de parâmetros dinâmicosA duração do RSI e a proporção de stop loss são ajustadas de acordo com a volatilidade do mercado.
  3. Extensão do prazo: estratégia de teste de desempenho em um ciclo mais ou menos (como a luz do sol / 1 hora).
  4. Otimização de aprendizagem de máquina: Otimizar as condições de entrada e saída usando modelos de treinamento com dados históricos.
  5. Melhoria da gestão de fundos: Ajustar a proporção de capital por transação de acordo com a dinâmica do valor líquido da conta.

Resumir

A estratégia permite a negociação de oscilação através de sinais cruzados de RSI e MA, combinando ferramentas de gerenciamento de risco em vários níveis, equilibrando o potencial de lucro e o controle de risco. Sua vantagem reside na lógica clara e na rigorosa disciplina, mas precisa ser otimizada ainda mais para se adaptar a diferentes ambientes de mercado.

Código-fonte da estratégia
/*backtest
start: 2024-04-23 00:00:00
end: 2024-09-06 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("📈 RX Swing ", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


// === INPUTS ===
rsiLength     = input.int(14, title="RSI Length")
maLength      = input.int(14, title="RSI MA Length")
maType        = input.string("SMA", options=["SMA", "EMA"], title="MA Type for RSI")
sl_pct        = input.float(1.5, title="Stop Loss %", minval=0.0)
tp_pct        = input.float(2.5, title="Take Profit %", minval=0.0)
capitalPerTrade = input.float(15000, title="Capital Per Trade (INR)", minval=1)
lotSize       = input.int(50, title="Lot Size (Nifty Options Lot)", minval=1)
trail_points  = input.float(10, title="Trailing SL Points", minval=0.1)

// === CALCULATIONS ===
rsi    = ta.rsi(close, rsiLength)
rsiMA  = maType == "SMA" ? ta.sma(rsi, maLength) : ta.ema(rsi, maLength)

longSignal  = ta.crossover(rsi, rsiMA)
shortSignal = ta.crossunder(rsi, rsiMA)

// === TRADING WINDOW ===
canTrade = true
exitTime = false

// === STATE VARIABLES ===
var float entryPrice = na
var bool inTrade = false
var string tradeDir = ""
var int lossCount = 0
var float trailHigh = na
var float trailLow = na

// === EXIT TRIGGER ===
exitNow = false
exitReason = ""

// === POSITION SIZE BASED ON CAPITAL ===
positionSize = (capitalPerTrade / close) * lotSize

// === ENTRY LOGIC (AFTER CLOSE OF CANDLE) ===
if (canTrade and lossCount < 2)
    if (longSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Call", strategy.long, qty=positionSize)
        entryPrice := close
        trailHigh := close
        inTrade := true
        tradeDir := "CALL"

    else if (shortSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Put", strategy.short, qty=positionSize)
        entryPrice := close
        trailLow := close
        inTrade := true
        tradeDir := "PUT"

// === TRAILING STOP-LOSS LOGIC ===
if (inTrade)
    if (tradeDir == "CALL")
        trailHigh := math.max(trailHigh, close)
        if (close <= trailHigh - trail_points)
            strategy.close("Buy Call", comment="CALL Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

    if (tradeDir == "PUT")
        trailLow := math.min(trailLow, close)
        if (close >= trailLow + trail_points)
            strategy.close("Buy Put", comment="PUT Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

// === REVERSAL EXIT LOGIC ===
if (inTrade)
    if (tradeDir == "CALL" and shortSignal)
        strategy.close("Buy Call", comment="CALL Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size < 0)
            lossCount := lossCount + 1

    if (tradeDir == "PUT" and longSignal)
        strategy.close("Buy Put", comment="PUT Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size > 0)
            lossCount := lossCount + 1

// === TP/SL EXIT LOGIC ===
if (inTrade)
    tpLevel = entryPrice * (1 + tp_pct / 100)
    slLevel = entryPrice * (1 - sl_pct / 100)

    if (strategy.position_size > 0)
        if (close >= tpLevel)
            strategy.close("Buy Call", comment="CALL TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close <= slLevel)
            strategy.close("Buy Call", comment="CALL SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

    if (strategy.position_size < 0)
        tpLevel = entryPrice * (1 - tp_pct / 100)
        slLevel = entryPrice * (1 + sl_pct / 100)

        if (close <= tpLevel)
            strategy.close("Buy Put", comment="PUT TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close >= slLevel)
            strategy.close("Buy Put", comment="PUT SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

// === RESET LOSS COUNT ON NEW DAY ===
if (hour == 9 and minute == 15)
    lossCount := 0

// === MARKUPS ===
plotshape(longSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📗 CALL Entry", location=location.belowbar, style=shape.triangleup, color=color.green, size=size.small, text="CALL")
plotshape(shortSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📕 PUT Entry", location=location.abovebar, style=shape.triangledown, color=color.red, size=size.small, text="PUT")
plotshape(exitNow and exitReason == "TP", location=location.belowbar, style=shape.xcross, color=color.green, size=size.tiny, title="✅ TP Exit", text="TP")
plotshape(exitNow and exitReason == "SL", location=location.abovebar, style=shape.xcross, color=color.red, size=size.tiny, title="❌ SL Exit", text="SL")
plotshape(exitNow and exitReason == "Reversal", location=location.abovebar, style=shape.circle, color=color.fuchsia, size=size.tiny, title="🔁 Reversal Exit", text="REV")
plotshape(exitNow and exitReason == "Trail SL", location=location.abovebar, style=shape.square, color=color.yellow, size=size.tiny, title="🔂 Trailing SL Exit", text="Trail")