Estrategia de negociación de reversión de la ruptura de impulso

El autor:¿ Qué pasa?, Fecha: 2023-10-27 17:04:48
Las etiquetas:

img

Resumen general

Esta estrategia utiliza una media móvil simple para determinar la dirección de la tendencia y ir largo en una tendencia alcista y ir corto en una tendencia bajista para implementar el comercio de inversión.

Estrategia lógica

Esta estrategia utiliza el promedio móvil ponderado (VWMA) para determinar la dirección de la tendencia del mercado.

Específicamente, primero calcula VWMA de un cierto período, y luego juzga si VWMA ha subido durante más de 5 días. Si es así, abre una posición larga. Si VWMA ha caído durante más de 5 días, abre una posición corta. La condición de cierre es cuando la dirección de VWMA se invierte durante más de 5 días.

Para calcular los rendimientos mensuales y anuales, la estrategia registra la ganancia/pérdida de cada mes y año.

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. El uso de VWMA para determinar la tendencia puede filtrar el ruido del mercado de manera efectiva y capturar las principales tendencias.

  2. La apertura de una posición solo después de que se confirme la tendencia puede evitar los riesgos asociados con la inversión de la tendencia.

  3. El comercio de inversión puede beneficiarse tanto de la tendencia alcista como de la descendente.

  4. El registro de los rendimientos mensuales y anuales facilita la evaluación del rendimiento de la estrategia.

  5. La adición de los rendimientos de referencia de mercado permite una comparación directa entre la estrategia y el mercado.

Análisis de riesgos

Algunos riesgos de esta estrategia:

  1. El uso de VWMA para determinar la tendencia puede retrasarse y perder oportunidades al comienzo de la tendencia.

  2. La posición de apertura sólo después de la confirmación puede perder algunos movimientos.

  3. La negociación de reversión debe establecer un stop loss, de lo contrario la pérdida podría aumentar.

  4. Las fluctuaciones significativas del mercado pueden desencadenar un stop loss y no poder mantener toda la tendencia.

  5. El juicio de la inversión de tendencia puede ser inexacto, aumentando las pérdidas.

Direcciones de optimización

Algunos aspectos que podrían optimizar la estrategia:

  1. Optimizar el parámetro de período VWMA para mejorar la determinación de tendencias.

  2. Ajustar el número de días para confirmar la tendencia, mejorando los tiempos de entrada y salida.

  3. Añadir una estrategia de stop loss para controlar la pérdida de una sola operación.

  4. Incorporar otros indicadores para determinar las inversiones, mejorando la certeza.

  5. Optimizar el tamaño de las posiciones en función de las condiciones del mercado.

  6. Considere el costo de la negociación, fije el objetivo de ganancia mínima.

Resumen de las actividades

La lógica general de esta estrategia es simple y clara, utilizando VWMA para determinar la dirección de la tendencia y el comercio de reversión después de la confirmación, lo que puede rastrear efectivamente los movimientos del 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)

Más.