Estratégia de Trailing Stop Seguindo Tendência do RSI


Data de criação: 2023-12-08 11:41:31 última modificação: 2023-12-08 11:41:31
cópia: 3 Cliques: 722
1
focar em
1621
Seguidores

Estratégia de Trailing Stop Seguindo Tendência do RSI

Visão geral

A estratégia é uma estratégia de negociação automática que usa o indicador RSI para identificar tendências e, em combinação com a média móvel, para confirmar tendências, para definir um stop loss. Faça mais quando o RSI é maior que 68 e o moving average antes de passar acima da média móvel atual; faça zero quando o RSI é menor que 28 e o moving average antes de passar abaixo da média móvel atual.

Princípio da estratégia

A estratégia usa principalmente o indicador RSI para determinar a identificação de tendências de sobrevenda e sobrevenda. Quando o RSI é maior que 70, é uma zona de sobrevenda e quando é menor que 30, é uma zona de sobrevenda. A combinação de cruz de ouro e cruz de morte com a média móvel é usada para confirmar a tendência.

Sinais de múltiplas cabeças: RSI maior que 68 e a média móvel anterior a atravessar a média móvel atual, fazendo mais. Sinal de cabeça vazia: RSI menor que 28 e abaixo da média móvel atual antes de atravessar a média móvel e fechar.

A configuração do stop loss para cada ponto define uma proporção de stop loss diferente, de mais relaxada a mais rigorosa, especificamente:

Multi-Head Stop: 1,4% no ponto mais alto para parar metade da posição, 0,8% no ponto mais alto para parar toda a posição. Múltiplos Stop Losses: 2% do preço de entrada.

Stop em branco: 0,4% no ponto mais baixo para parar metade da posição, 0,8% no ponto mais baixo para parar toda a posição.
Stop loss: 2% do preço de entrada.

Ao mesmo tempo, quando a tendência se inverte, por exemplo, quando o RSI supera 30, o preço do mercado é totalmente equilibrado; quando o RSI supera 60 o preço do mercado é totalmente equilibrado.

Vantagens estratégicas

  1. O indicador RSI é usado para avaliar os excessos de compra e venda, evitando os excessos de alta e baixa.
  2. As médias móveis filtram tendências e reduzem as operações de direção não convencional.
  3. A partir daí, a empresa criou um novo sistema de controle de vendas, que permite que os clientes aumentem seus lucros.
  4. O ponto de parada mais alto é definido, dando espaço apropriado para a tendência.
  5. A estratégia de liquidação reversa, combinada com a estratégia de mudança de tendência do indicador, é uma resposta rápida a eventos inesperados.

Risco estratégico

  1. Problemas com a configuração dos parâmetros do RSI, resultando em um mau desempenho da identificação.
  2. Problemas com a configuração dos parâmetros da média móvel, causando um mau efeito de filtragem.
  3. O ponto de paragem é muito relaxado, o risco de expansão dos prejuízos.
  4. O ponto de equilíbrio é muito apertado e não permite maximizar o lucro.
  5. A estratégia de liquidação reversa é um erro de julgamento que causa prejuízos desnecessários.

Para os riscos acima, os parâmetros devem ser testados e otimizados várias vezes. A configuração do stop loss deve ser apropriada, com flexibilidade em um determinado intervalo, e os parâmetros devem ser ajustados de acordo com a volatilidade do mercado. A estratégia de liquidação deve ser prudente para evitar perdas por erro de avaliação do indicador.

Direção de otimização

Otimizar ainda mais as coisas pode ser feito em vários aspectos:

  1. Adicionar mais indicadores de filtragem para melhorar a precisão do sinal. Por exemplo, adicionar filtros de volume de transação.
  2. Ajustar a estratégia de stop loss, rastrear os preços mais altos e mais baixos, e implementar stop loss móvel.
  3. A corrigir parte do stop para acompanhar o stop para maximizar o lucro.
  4. Aumentar a combinação de parâmetros como a troca de fontes de dados, diferentes variedades usam diferentes períodos.
  5. Aumentar a consideração de custo de posse de estoques vazios de futuros, ajustando dinamicamente o stop loss.

Resumir

A estratégia em geral é uma estratégia de acompanhamento de tendências mais confiável. Usando o RSI para determinar o fenômeno de sobrecompra e sobrevenda, a direção da negociação é determinada. Usando a média móvel para a confirmação de surtos.

Código-fonte da estratégia
// © CRabbit
//@version=5

// Starting with $100 and using 10% of the account per trade
strategy("RSI Template", shorttitle="RSI", overlay=false, initial_capital=100, default_qty_value=10, default_qty_type=strategy.percent_of_equity)

// RSI Indicator
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(4, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(23, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.green)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")


// Configure backtest start date with inputs
startDate = input.int(title="Start Date", defval=1, minval=1, maxval=31)
startMonth = input.int(title="Start Month", defval=6, minval=1, maxval=12)
startYear = input.int(title="Start Year", defval=2022, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate = (time >= timestamp(syminfo.timezone,
     startYear, startMonth, startDate, 0, 0))


// Long and Short buy strategy
// Submit a market open/ close Long order, but only on/after start date
if (afterStartDate)
    if rsi > 68 and (rsiMA > rsiMA[1])
        strategy.entry("Long Order", strategy.long, comment="ENTER-LONG")
    if rsi < 30
        strategy.close("Long Order", alert_message="L-CL")

strategy.exit("L-TP1", from_entry="Long Order", limit=high * 1.004, qty_percent=50, alert_message="L-TP1" + str.tostring(high * 1.004))
strategy.exit("L-TP2", from_entry="Long Order", limit=high * 1.008, qty_percent=100, alert_message="L-TP2" + str.tostring(high * 1.008))
strategy.exit("Exit Long", from_entry="Long Order", stop=low * 0.98, alert_message="L-SL" + str.tostring(low * 0.98))        


// Submit a market Open/ Close Short order, but only on/after start date
if (afterStartDate)
    if rsi < 28 and (rsiMA < rsiMA[1])
        strategy.entry("Short Order", strategy.short, comment="ENTER-SHORT")
    if rsi > 60
        strategy.close("Short Order", alert_message="S-CL")    

strategy.exit("S-TP1", from_entry="Short Order", limit=low * 0.996, qty_percent=50, alert_message="S-TP1" + str.tostring(low * 0.996))
strategy.exit("S-TP2", from_entry="Short Order", limit=low * 0.992, qty_percent=100, alert_message="S-TP2" + str.tostring(low * 0.992))
strategy.exit("Exit Short", from_entry="Short Order", stop=high * 1.02, alert_message="S-SL" + str.tostring(high * 1.02))

// MONTHLY TABLE //

prec      = input(2, title = "Return Precision")

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1

cur_month_pnl = 0.0
cur_year_pnl  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)

if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])

if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])

// Monthly P&L Table    
var monthly_table = table(na)

if (barstate.islast)
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = array.get(year_pnl, yi) > 0 ? color.new(color.green, transp = 50) : color.new(color.red, transp = 50)
        table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = array.get(month_pnl, mi) > 0 ? color.new(color.green, transp = 70) : color.new(color.red, transp = 70)
        
        table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)