Estrategia de cruce de precios de cierre mensuales y promedio móvil

El autor:¿ Qué pasa?, Fecha: 2023-11-23 17:09:01
Las etiquetas:

img

Resumen general

Esta estrategia genera señales comerciales basadas en el cruce entre el precio de cierre mensual y las líneas de media móvil.

Estrategia lógica

La lógica central de esta estrategia es la siguiente:

  1. Tome el parámetro de la media móvil del período como entrada. Elija entre SMA y EMA.
  2. Opción para mostrar la línea media móvil.
  3. Opción para utilizar el precio de cierre de otro ticker como fuente de señal.
  4. Determinar las señales de negociación basadas en la relación entre el precio de cierre mensual y la media móvil:
    • El valor de las pérdidas de valor se calcula de acuerdo con el método de cálculo de las pérdidas de valor.
    • Posiciones largas cerradas

Esta estrategia utiliza la capacidad de suavización de los promedios móviles para filtrar los ruidos de precios y capturar las reversiones de tendencia a mediano plazo.

Ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. Utiliza datos mensuales para filtrar eficazmente los ruidos intradiarios y capturar las tendencias a medio y largo plazo
  2. Período MA personalizable para la optimización en diferentes marcadores
  3. La opción de utilizar otro ticker como fuente de señal mejora la estabilidad
  4. Implementa técnicas avanzadas contra la repintura
  5. Cuadro de tiempo flexible para las pruebas previas para facilitar las pruebas

En resumen, se trata de un marco de estrategia simple pero práctico que puede adaptarse a la mayoría de las acciones mediante ajuste de parámetros, especialmente adecuado para los inversores a medio y largo plazo.

Los riesgos

También hay algunos riesgos a tener en cuenta:

  1. Las actualizaciones mensuales de los datos son lentas y no pueden reflejar los cambios de precios en tiempo real
  2. Se queda atrás y podría perder oportunidades a corto plazo
  3. Los MAs tienen retrasos inherentes, el tiempo de la señal es impredecible.
  4. La selección de parámetros subóptimos conduce a un exceso de conservadurismo o oportunidades perdidas

Sugerencias para mitigar los riesgos:

  1. Incorporar indicadores técnicos de plazo más rápido para el juicio auxiliar
  2. Optimizar el período de MA para encontrar los mejores parámetros
  3. Utilizar un punto de referencia más estable como fuente de señal
  4. Ajustar el tamaño de la posición para limitar las pérdidas

Oportunidades de mejora

Esta estrategia tiene un gran potencial de mejora:

  1. Incorporar el stop loss para fijar las ganancias y controlar los riesgos
  2. Añadir indicadores complementarios como KD, MACD para mejorar la precisión de la señal
  3. Emplear técnicas de aprendizaje automático para optimizar dinámicamente los parámetros de MA
  4. Introduzca el tamaño de la posición que se alinea con las tendencias
  5. Construir capacidades de conmutación larga/corta basadas en las condiciones del mercado
  6. Fusión con precios de marcos de tiempo más rápidos para reacciones más rápidas

Conclusión

La estrategia de cierre mensual y cruce de MA tiene una lógica simple y directa y se puede adaptar a varios tickers a través del ajuste de parámetros. Es especialmente adecuado para inversores a medio y largo plazo.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Más.