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.
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á.
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
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
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)