Estrategia de negociación cruzada de media móvil triangular

El autor:¿ Qué pasa?, Fecha: 2024-01-16 18:18:02
Las etiquetas:

img

Resumen general

La estrategia de intercambio de promedios móviles triangulares (TMA) es una estrategia típica de análisis técnico. Utiliza tres líneas de promedios móviles de diferentes longitudes de tiempo para capturar tendencias e implementar operaciones de bajo riesgo. Cuando el promedio móvil a corto plazo cruza el promedio móvil a mediano plazo hacia arriba y el promedio móvil a mediano plazo está por encima del promedio móvil a largo plazo, se genera una señal de compra. Cuando el promedio móvil a corto plazo cruza por debajo del promedio móvil a mediano plazo hacia abajo y el promedio móvil a mediano plazo está por debajo del promedio móvil a largo plazo, se genera una señal de venta.

Estrategia lógica

La estrategia TMA se basa principalmente en tres líneas de promedio móvil para determinar la dirección de la tendencia. La media móvil a corto plazo responde sensiblemente a los cambios de precios; la media móvil a mediano plazo proporciona un juicio más claro de la tendencia; la media móvil a largo plazo filtra el ruido del mercado y determina la dirección de la tendencia a largo plazo.

Cuando el promedio móvil a corto plazo cruza el promedio móvil a mediano plazo hacia arriba, indica que el precio ha comenzado a romper hacia arriba. En este momento, si el promedio móvil a mediano plazo está por encima del promedio móvil a largo plazo, significa que el mercado actual está en una tendencia alcista. Por lo tanto, se genera una señal de compra aquí.

Por el contrario, cuando el promedio móvil a corto plazo cruza por debajo del promedio móvil a mediano plazo hacia abajo, indica que el precio ha comenzado a romper hacia abajo. En este momento, si el promedio móvil a mediano plazo está por debajo del promedio móvil a largo plazo, significa que el mercado actual está en una tendencia bajista. Como resultado, se genera una señal de venta.

Esta estrategia también establece líneas de stop-loss y take-profit. Después de entrar en una operación, los precios de stop-loss y take-profit se calcularán en función de los ajustes porcentuales. Si el precio toca cualquiera de las líneas, la posición se cerrará.

Análisis de ventajas

  • Utilice tres promedios móviles juntos para mejorar la precisión del juicio
  • Establecer el stop-loss y el take-profit para controlar eficazmente el riesgo por operación
  • Parámetros de media móvil personalizables adecuados para diferentes productos
  • Siete opciones para tipos de medias móviles, tipos de estrategias diversificadas

Análisis de riesgos y soluciones

  • Señales erróneas cuando tres MAs se consolidan

    Solución: ajustar los parámetros de MA adecuadamente para evitar señales erróneas

  • Porcentaje excesivo de pérdidas/beneficios

    Solución: porcentajes ajustados; no pueden ser demasiado grandes ni demasiado pequeños

  • Configuración incorrecta de parámetros que conduce a demasiadas o muy pocas operaciones

    Solución: Prueba diferentes combinaciones de parámetros para encontrar el óptimo

Direcciones de optimización

La estrategia TMA se puede optimizar a partir de los siguientes aspectos:

  • Prueba diferentes combinaciones de tipo y longitud para encontrar el óptimo

    Prueba diferentes combinaciones de longitud o tipo de MA para obtener los mejores resultados

  • Añadir otros indicadores técnicos como filtros de señal

    Añadir indicadores como KDJ, MACD, etc. para la verificación de múltiples factores

  • Seleccionar parámetros basados en las características del producto

    Acortar los períodos de admisión para productos volátiles; alargar los períodos para productos estables

  • Utilice el aprendizaje automático para encontrar parámetros óptimos

    Parámetro automático barrido para localizar rápidamente óptimo

Conclusión

La estrategia TMA Crossover es una estrategia de seguimiento de tendencias fácil de usar en general. Utiliza tres MA juntos para capturar tendencias y establece stop-loss / take-profit para controlar riesgos, lo que permite ganancias estables. Se pueden lograr mejoras adicionales a través de la optimización de parámetros e integración de indicadores técnicos adicionales. En conclusión, esta estrategia es adecuada para los inversores que buscan ganancias constantes.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)

// 
// author: Kozlod
// date: 2018-03-25
// 

////////////
// INPUTS //
////////////

ma_type        = input(title = "MA Type",            defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len   = input(title = "Short MA Length",    defval = 5,     minval = 1)
short_ma_src   = input(title = "Short MA Source",    defval = close)
medium_ma_len  = input(title = "Medium MA Length",   defval = 20,    minval = 2)
medium_ma_src  = input(title = "Medium MA Source",   defval = close)
long_ma_len    = input(title = "Long MA Length",     defval = 100,   minval = 3)
long_ma_src    = input(title = "Long MA Source",     defval = close)

sl_lev_perc    = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc    = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

// Set initial values to 0
short_ma  = 0.0
long_ma   = 0.0
medium_ma = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma  := sma(short_ma_src,  short_ma_len)
    medium_ma := sma(medium_ma_src, medium_ma_len)
    long_ma   := sma(long_ma_src,   long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma  := ema(short_ma_src,  short_ma_len)
    medium_ma := ema(medium_ma_src, medium_ma_len)
    long_ma   := ema(long_ma_src,   long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma  := wma(short_ma_src,  short_ma_len)
    medium_ma := wma(medium_ma_src, medium_ma_len)
    long_ma   := wma(long_ma_src,   long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma  := wma(2*wma(short_ma_src,  short_ma_len  / 2) - wma(short_ma_src,  short_ma_len),  round(sqrt(short_ma_len)))
    medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len)))
    long_ma   := wma(2*wma(long_ma_src,   long_ma_len   / 2) - wma(long_ma_src,   long_ma_len),   round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma  := vwma(short_ma_src,  short_ma_len)
    medium_ma := vwma(medium_ma_src, medium_ma_len)
    long_ma   := vwma(long_ma_src,   long_ma_len)

// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma  := na(short_ma[1])  ? sma(short_ma_src, short_ma_len)   : (short_ma[1]  * (short_ma_len  - 1) + short_ma_src)  / short_ma_len
    medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len
    long_ma   := na(long_ma[1])   ? sma(long_ma_src,  long_ma_len)    : (long_ma[1]   * (long_ma_len   - 1) + long_ma_src)   / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short  = ema(short_ma_src , short_ma_len)
    e1_medium = ema(medium_ma_src, medium_ma_len)
    e1_long   = ema(long_ma_src,   long_ma_len)
    
    short_ma  := 2 * e1_short  - ema(e1_short,  short_ma_len)
    medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
    long_ma   := 2 * e1_long   - ema(e1_long,   long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma,  color = red,    linewidth = 2)
plot(medium_ma, color = green,  linewidth = 2)
plot(long_ma,   color = yellow, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)

Más.