VWMA-ADX Momentum y estrategia larga de Bitcoin basada en tendencias

El autor:¿ Qué pasa?, Fecha: 2024-04-03 17:47:49
Las etiquetas:VWMAADXDMILa SMAEl EMAEl RMALa WMAHMAEl número de personas afectadas

img

Resumen general

Esta estrategia utiliza múltiples promedios móviles (VWMA), el índice direccional promedio (ADX) y el indicador de movimiento direccional (DMI) para capturar oportunidades largas en el mercado de Bitcoin. Al combinar el impulso del precio, la dirección de la tendencia y el volumen de operaciones, la estrategia tiene como objetivo encontrar puntos de entrada con fuertes tendencias alcistas y suficiente impulso mientras controla estrictamente el riesgo.

Principios de estrategia

  1. Utilice el VWMA de 9 días y 14 días para determinar la tendencia larga.
  2. Introduzca un promedio móvil adaptativo construido a partir del VWMA de precios más alto y más bajo de 89 días como filtro de tendencia.
  3. Confirmar la fuerza de la tendencia utilizando los indicadores ADX y DMI. La tendencia se considera suficientemente fuerte solo cuando el ADX es mayor que 18 y la diferencia entre +DI y -DI es mayor que 15.
  4. Filtrar las barras con volumen de operaciones entre el 60% y el 95% de los percentiles utilizando la función de percentiles de volumen para evitar períodos con bajo volumen de operaciones.
  5. Establezca el nivel de stop-loss en 0,96 a 0,99 veces el máximo de la vela anterior, disminuyendo a medida que aumenta el marco de tiempo para controlar el riesgo.
  6. Cierre la posición cuando se alcance el tiempo de retención predefinido o el precio caiga por debajo de la media móvil adaptativa.

Análisis de ventajas

  1. Al combinar múltiples indicadores técnicos, la estrategia evalúa las condiciones del mercado desde diversas dimensiones como la tendencia, el impulso y el volumen de operaciones, lo que hace que las señales sean más confiables.
  2. El mecanismo de filtrado de la media móvil adaptativa y el volumen de operaciones filtra eficazmente las señales falsas y reduce las operaciones no válidas.
  3. Los ajustes estrictos de stop-loss y los límites de tiempo de retención reducen en gran medida la exposición al riesgo de la estrategia.
  4. El diseño modular del código mejora la legibilidad y la facilidad de mantenimiento, facilitando una mayor optimización y expansión.

Análisis de riesgos

  1. Cuando el mercado fluctúa o la tendencia no es clara, la estrategia puede generar más señales falsas.
  2. El nivel de suspensión de pérdidas es relativamente limitado, lo que puede provocar suspensiones prematuras y aumentar las pérdidas durante las grandes fluctuaciones del mercado.
  3. La estrategia carece de consideración de las condiciones macroeconómicas y los acontecimientos significativos, y puede fracasar frente a los acontecimientos del cisne negro.
  4. Los parámetros son relativamente fijos y carecen de adaptabilidad, lo que puede dar lugar a un rendimiento inestable en diferentes entornos de mercado.

Direcciones de optimización

  1. Introducir más indicadores que puedan capturar las condiciones del mercado, como el índice de fuerza relativa (RSI) y las bandas de Bollinger, para mejorar la fiabilidad de la señal.
  2. El nivel de stop-loss se optimizará dinámicamente, por ejemplo, utilizando el intervalo medio verdadero (ATR) o el stop-loss basado en el porcentaje, para adaptarse a las diferentes condiciones de volatilidad del mercado.
  3. Mejorar el módulo de control de riesgos de la estrategia mediante la incorporación de datos macroeconómicos y análisis del sentimiento.
  4. Utilice algoritmos de aprendizaje automático para optimizar automáticamente los parámetros, mejorando la adaptabilidad y la estabilidad de la estrategia.

Resumen de las actividades

La Estrategia de VWMA-ADX para Bitcoin Long captura de manera efectiva las oportunidades al alza en el mercado de Bitcoin considerando de manera integral las tendencias de precios, el impulso, el volumen de negociación y otros indicadores técnicos. Al mismo tiempo, las medidas estrictas de control de riesgos y las condiciones de salida claras aseguran que el riesgo de la estrategia esté bien controlado. Sin embargo, la estrategia también tiene algunas limitaciones, como la insuficiente adaptabilidad a los entornos cambiantes del mercado y la necesidad de estrategias de stop-loss optimizadas. En el futuro, se pueden hacer mejoras en términos de fiabilidad de la señal, control de riesgos y optimización de parámetros para mejorar aún más la robustez y la rentabilidad de la estrategia.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Q_D_Nam_N_96

//@version=5
strategy("Long BTC Strategy", overlay=true, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, initial_capital = 1000, currency = currency.USD)

Volume_Quartile(vol) =>
    qvol1 = ta.percentile_linear_interpolation(vol, 60,15)
    qvol2 = ta.percentile_linear_interpolation(vol, 60,95)
    vol > qvol1 and vol < qvol2

smma(src, length) =>
	smma =  0.0
	smma := na(smma[1]) ? ta.sma(src, length) : (smma[1] * (length - 1) + src) / length
	smma

ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
        "HMA" => ta.hma(source, length)
        "SMMA" => smma(source, length)

DMI(len, lensig) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / trur)+11
    minus = fixnan(100 * ta.rma(minusDM, len) / trur)-11
    sum = plus + minus
    adx = 100 * ta.vwma(math.abs(plus - minus-11) / (sum == 0 ? 1 : sum), lensig)

    [adx, plus, minus]

cond1 = Volume_Quartile(volume*hlcc4)

ma1 = ma(close,9, "VWMA")
// plot(ma1, color = color.blue)
ma2 = ma(close,14, "VWMA")
// plot(ma2, color = color.orange)

n = switch timeframe.period
    "240" => 0.997
    => 0.995

ma3 = (0.1*ma(ta.highest(close,89),89, "VWMA") + 
     0.9*ma(ta.lowest(close,89),89, "VWMA"))*n

plot(ma3, color = color.white)

[adx, plus, minus] = DMI(7, 10)


cond2 = adx > 18 and plus - math.abs(minus) > 15

var int count = 0

if barstate.isconfirmed and strategy.position_size != 0
    count += 1
else
    count := 0

p_roc = 0
if timeframe.period == '240'
    p_roc := 14
else
    p_roc := 10

longCondition = ta.crossover(ma1, ma2) and (close > open ? close > ma3 : open > ma3) and ((ma3 - ma3[1])*100/ma3[1] >= -0.2) and ((close-close[p_roc])*100/close[p_roc] > -2.0)
float alpha = 0.0
float sl_src = high[1]
if (longCondition and cond1 and cond2 and strategy.position_size == 0)
    strategy.entry("buy", strategy.long)
    if timeframe.period == '240'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+5, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '30'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '45'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '60'
        alpha := 0.98
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '120'
        alpha := 0.97
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '180'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == 'D'
        alpha := 0.95
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else 
        alpha := 0.93
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)

period = switch timeframe.period
    "240" => 90
    "180" => 59
    "120" => 35
    "30" => 64
    "45" => 40
    "60" => 66
    "D" => 22
    => 64

if (count > period or close < ma3)
    strategy.close('buy', immediately = true) 

Relacionados

Más.

- ¿ Qué pasa?¿Por qué no añadir un parálisis móvil?