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.
Calcule los promedios móviles rápidos y lentos.
Cuando el MA rápido cruza el MA lento, indica una tendencia alcista y genera una señal de compra.
Cuando el MA rápido cruza por debajo del MA lento, indica una tendencia a la baja y genera una señal de venta.
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.
La estrategia es sencilla y clara, fácil de entender e implementar.
Puede rastrear eficazmente las tendencias del mercado con un gran potencial de ganancias.
El ajuste dinámico de los parámetros se adapta a los cambios de las condiciones del mercado.
Los algoritmos MA personalizables aumentan la flexibilidad de la estrategia.
Configuración lógica de compra y venta flexible.
El comercio frecuente conduce a mayores costos de transacción.
Los retrasos de MA pueden perderse los mejores puntos de entrada y salida durante los mercados volátiles.
El parámetro MA inadecuado y la optimización de la frecuencia de ajuste causan el fracaso de la estrategia.
Se requiere un stop loss estricto para limitar las pérdidas.
La reversión de la tendencia puede conducir a enormes pérdidas flotantes.
Optimizar los parámetros de MA para una mejor detección de cambios de tendencia.
Añadir una lógica de stop loss para controlar la pérdida de una sola operación.
Añadir indicadores de evaluación de tendencia para evitar pérdidas por inversión de tendencia.
Mejorar la estrategia de ajuste de la MA para que sea más inteligente y automatizada.
Añadir módulo de optimización de parámetros utilizando el aprendizaje automático.
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)