Estratégia de negociação de reversão da ruptura de impulso

Autora:ChaoZhang, Data: 2023-10-27 17:04:48
Tags:

img

Resumo

Esta estratégia utiliza uma média móvel simples para determinar a direção da tendência e ir longo em uma tendência de alta e ir curto em uma tendência de queda para implementar a negociação de reversão.

Estratégia lógica

Esta estratégia utiliza a média móvel ponderada (VWMA) para determinar a direção da tendência do mercado.

Especificamente, ele primeiro calcula o VWMA de um determinado período e, em seguida, julga se o VWMA subiu por mais de 5 dias. Se assim for, abre uma posição longa. Se o VWMA caiu por mais de 5 dias, abre uma posição curta. A condição de fechamento é quando a direção do VWMA se inverte por mais de 5 dias.

Para calcular os retornos mensais e anuais, a estratégia registra o lucro/perda de cada mês e ano.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. O uso da VWMA para determinar tendências pode filtrar o ruído do mercado de forma eficaz e capturar as principais tendências.

  2. A abertura de uma posição apenas após a confirmação da tendência pode evitar os riscos associados à inversão da tendência.

  3. A negociação de reversão pode beneficiar tanto da tendência ascendente como da tendência descendente.

  4. O registo de rendimentos mensais e anuais facilita a avaliação do desempenho da estratégia.

  5. A adição de rendimentos de referência de mercado permite uma comparação direta entre estratégia e mercado.

Análise de riscos

Alguns riscos desta estratégia:

  1. Usar o VWMA para determinar a tendência pode atrasar e perder oportunidades no início da tendência.

  2. Abrir posição só após confirmação pode perder alguns movimentos.

  3. A negociação de reversão deve definir o stop loss, caso contrário, a perda pode aumentar.

  4. As flutuações significativas do mercado podem desencadear o stop loss e não ser possível manter a tendência completa.

  5. O julgamento da inversão da tendência pode ser impreciso, aumentando as perdas.

Orientações de otimização

Alguns aspectos que poderiam optimizar a estratégia:

  1. Otimizar o parâmetro do período VWMA para melhorar a determinação da tendência.

  2. Ajustar o número de dias para confirmar a tendência, melhorando o tempo de entrada e saída.

  3. Adicionar estratégia de stop loss para controlar a perda de uma única negociação.

  4. Incorporar outros indicadores para determinar reversões, melhorando a certeza.

  5. Otimizar o dimensionamento das posições com base nas condições do mercado.

  6. Considere o custo de negociação, defina o objetivo de lucro mínimo.

Resumo

A lógica geral desta estratégia é simples e clara, usando a VWMA para determinar a direção da tendência e a reversão do comércio após a confirmação, o que pode rastrear efetivamente os movimentos do mercado.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// MONTHLY TABLE //

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

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

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

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

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

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

last_computed = false

if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])

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

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if last_computed
    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, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", 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 = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)

Mais.