Estrategia cuantitativa de ajuste dinámico de posición de cuadrícula de seguimiento de tendencias

TTM EMA GRID DCA ATR SMA
Fecha de creación: 2024-12-12 11:19:17 Última modificación: 2024-12-12 11:19:17
Copiar: 0 Número de Visitas: 641
1
Seguir
1617
Seguidores

Estrategia cuantitativa de ajuste dinámico de posición de cuadrícula de seguimiento de tendencias

Descripción general

La estrategia es un sistema de trading de grilla dinámica basado en indicadores TTM, que determina la dirección de la tendencia del mercado mediante el cálculo de las medias móviles indexadas de los puntos altos y bajos (EMA) y la implementación de un sistema de trading de grilla en torno a los precios de referencia que se actualizan dinámicamente. La dirección de la grilla y los niveles de precios se ajustan dinámicamente según la tendencia y se ejecutan las operaciones cuando el precio cruza un nivel de grilla predefinido, con un porcentaje fijo de riesgo por transacción en beneficio de la cuenta.

Principio de estrategia

La lógica central de la estrategia reside en el cálculo del estado TTM, que se realiza a través de los siguientes pasos:

  1. Se calculan dos EMAs basadas en el parámetro ttmPeriod: el EMA bajo (lowMA) y el EMA alto (highMA)
  2. Se definen dos niveles de umbral entre el MA alto y el MA bajo:
    • lowThird: la tercera parte inferior
    • highThird: la parte inferior de los 23 de la posición
  3. Determine el estado de TTM según la posición de los precios de cierre con respecto a estos umbrales:
    • Cuando el precio de cierre está por encima de HighThird, regresa 1 (trend ascendente)
    • Cuando el precio de cierre está por debajo de lowThird, regresa a 0 (en la tendencia a la baja)
    • Cuando el precio de cierre se encuentra entre los niveles de LowThird y HighThird, regresa a -1 (estado neutro)

El sistema de transacciones de la red se ajusta dinámicamente según el estado de la TTM:

  1. Actualizar el precio y la dirección de referencia de la grilla cuando el estado de TTM cambie
  2. El nivel de precios de compra y venta se calcula en función de la dirección y el intervalo de la grilla
  3. Ejecutar la operación de compra o venta correspondiente cuando el precio se rompa el nivel de la red

Ventajas estratégicas

  1. Adaptabilidad dinámica: la estrategia puede ajustar dinámicamente la dirección de la red y el nivel de precios en función de las tendencias del mercado, lo que mejora la adaptabilidad y la rentabilidad de la estrategia
  2. Control de riesgos: gestión de posiciones con porcentajes fijos, control eficaz de la apertura de riesgo de cada operación
  3. Parámetros ajustables: los parámetros clave, como el ciclo TTM, el nivel de la red y el intervalo, se pueden optimizar en función de las diferentes condiciones del mercado
  4. Mecanismo de ejecución claro: señales de transacción claras, lógica de ejecución simple e intuitiva, fácil de detectar y operar en el disco

Riesgo estratégico

  1. Retardo en la determinación de tendencias: el indicador TTM basado en EMA presenta cierto retraso, lo que puede causar un retraso en la señal de los puntos de inflexión de tendencias
  2. Riesgo de mercado en turbulencia: en mercados en turbulencia horizontal, los frecuentes cambios de dirección de la grilla pueden causar pérdidas de transacciones excesivas y comisiones
  3. La presión de la administración de fondos: la necesidad de una mayor cantidad de fondos para operar varias redes al mismo tiempo puede afectar la viabilidad de la estrategia
  4. Efectos del punto de deslizamiento: las operaciones de la red de alta frecuencia pueden enfrentar puntos de deslizamiento más grandes cuando la liquidez es insuficiente, lo que afecta el rendimiento de la estrategia

Dirección de optimización de la estrategia

  1. Optimización de las tendencias:
    • Introducción de análisis de múltiples períodos de tiempo para mejorar la precisión de las tendencias
    • Confirmación de tendencias en combinación con otros indicadores técnicos como el RSI, el MACD, etc.
  2. Optimización de parámetros de la red:
    • Ajuste de la distancia entre las rejillas en función de la fluctuación de la tasa
    • Introducción de un mecanismo de ajuste a nivel de la red adaptativa
  3. Mejoras en la gestión de fondos:
    • Realizar una asignación de posiciones dinámica
    • Aumentar el mecanismo de compensación de riesgos
  4. Mecanismos de ejecución mejorados:
    • Mecanismos de detención de pérdidas y de frenado
    • Optimizar el tiempo de ejecución de órdenes

Resumir

La estrategia combina el juicio de tendencias de TTM con el comercio de la grilla dinámica, lo que permite un sistema de negociación que es altamente adaptable y controla el riesgo. Al ajustar dinámicamente la dirección de la grilla y el nivel de precios, la estrategia se adapta mejor a diferentes entornos de mercado. Si bien existen algunos riesgos inherentes, la estrategia tiene un buen valor práctico y potencial de desarrollo a través de la configuración de parámetros razonables y medidas de optimización.

Código Fuente de la Estrategia
/*backtest
start: 2024-12-04 00:00:00
end: 2024-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("TTM Grid Strategy", overlay=true)

// Input parameters
int ttmPeriod = input.int(6, minval=1, title="TTM Period")
int gridLevels = input.int(5, minval=2, title="Grid Levels")
float gridSpacing = input.float(0.01, minval=0.0001, title="Grid Spacing (%)")

// Calculate TTM State
ttmState() =>
    lowMA = ta.ema(low, ttmPeriod)
    highMA = ta.ema(high, ttmPeriod)
    lowThird = (highMA - lowMA) / 3 + lowMA
    highThird = 2 * (highMA - lowMA) / 3 + lowMA

    if close > highThird
        1
    else if close < lowThird
        0
    else
        -1

// State tracking variables
var float gridBasePrice = 0.0
var int gridDirection = -1

// Determine grid state
updateGridState(float currentClose, int currentState) =>
    float newBasePrice = gridBasePrice
    int newDirection = gridDirection

    if currentState != -1 and currentState != gridDirection
        newBasePrice := currentClose
        newDirection := currentState
    
    [newBasePrice, newDirection]

// Calculate grid levels
calcGridLevels(float basePrice, int direction, int levels) =>
    float[] buyLevels = array.new_float(levels)
    float[] sellLevels = array.new_float(levels)

    for i = 1 to levels
        multiplier = i * gridSpacing
        if direction == 1  // Buy grid
            array.set(buyLevels, i-1, basePrice * (1 - multiplier))
            array.set(sellLevels, i-1, basePrice * (1 + multiplier))
        else  // Sell grid
            array.set(buyLevels, i-1, basePrice * (1 + multiplier))
            array.set(sellLevels, i-1, basePrice * (1 - multiplier))
    
    [buyLevels, sellLevels]

// Execute grid trades
executeGridTrades(float basePrice, int direction, int levels) =>
    [buyLevels, sellLevels] = calcGridLevels(basePrice, direction, levels)

    for i = 0 to levels - 1
        float buyLevel = array.get(buyLevels, i)
        float sellLevel = array.get(sellLevels, i)

        if direction == 1  // Buy grid
            if low <= buyLevel
                strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i))
            if high >= sellLevel
                strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i))
        else  // Sell grid
            if high >= buyLevel
                strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i))
            if low <= sellLevel
                strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i))

// Main strategy logic
currentState = ttmState()
[newGridBasePrice, newGridDirection] = updateGridState(close, currentState)

// Update global variables
if newGridBasePrice != gridBasePrice
    gridBasePrice := newGridBasePrice
if newGridDirection != gridDirection
    gridDirection := newGridDirection

// Execute grid trades
executeGridTrades(newGridBasePrice, newGridDirection, gridLevels)

// Visualization
plotColor = newGridDirection == 1 ? color.green : color.red
plot(newGridBasePrice, color=plotColor, style=plot.style_cross)