Tendencia de la estrategia de media móvil adaptativa

El autor:¿ Qué pasa?, Fecha: 2023-10-10 15:21:45
Las etiquetas:

Resumen general

Esta estrategia genera señales comerciales basadas en el cruce entre las medias móviles rápidas y lentas, pertenecientes a las estrategias de tendencia siguiente.

Estrategia lógica

  1. Calcule los promedios móviles rápidos y lentos.

  2. Cuando el MA rápido cruza el MA lento, indica una tendencia alcista y genera una señal de compra.

  3. Cuando el MA rápido cruza por debajo del MA lento, indica una tendencia a la baja y genera una señal de venta.

  4. Al ajustar automáticamente la longitud de las medias móviles, la estrategia se adapta dinámicamente a la tendencia del mercado para rastrear las ganancias.

Análisis de ventajas

  1. La estrategia es sencilla y clara, fácil de entender e implementar.

  2. Puede rastrear eficazmente las tendencias del mercado con un gran potencial de ganancias.

  3. El ajuste dinámico de los parámetros se adapta a los cambios de las condiciones del mercado.

  4. Los algoritmos MA personalizables aumentan la flexibilidad de la estrategia.

  5. Configuración lógica de compra y venta flexible.

Análisis de riesgos

  1. El comercio frecuente conduce a mayores costos de transacción.

  2. Los retrasos de MA pueden perderse los mejores puntos de entrada y salida durante los mercados volátiles.

  3. El parámetro MA inadecuado y la optimización de la frecuencia de ajuste causan el fracaso de la estrategia.

  4. Se requiere un stop loss estricto para limitar las pérdidas.

  5. La reversión de la tendencia puede conducir a enormes pérdidas flotantes.

Direcciones de optimización

  1. Optimizar los parámetros de MA para una mejor detección de cambios de tendencia.

  2. Añadir una lógica de stop loss para controlar la pérdida de una sola operación.

  3. Añadir indicadores de evaluación de tendencia para evitar pérdidas por inversión de tendencia.

  4. Mejorar la estrategia de ajuste de la MA para que sea más inteligente y automatizada.

  5. Añadir módulo de optimización de parámetros utilizando el aprendizaje automático.

Resumen de las actividades

La lógica de la estrategia es simple y clara, generando operaciones basadas en el cruce de MAs rápido y lento. Captura efectivamente las tendencias pero tiene riesgos. Se requiere una optimización continua de los parámetros, una lógica de stop loss para hacer que la estrategia sea más robusta. En general, la estrategia tiene un gran potencial de mejoras y vale la pena investigar y aplicar.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

Más.