
La estrategia de cruce de la media móvil es una estrategia de análisis técnico muy clásica y comúnmente utilizada. La idea central de la estrategia es utilizar el cruce entre las medias móviles de diferentes períodos como una señal de compra y venta. Se produce una señal de compra cuando la media móvil a corto plazo atraviesa la media móvil a largo plazo desde abajo; se produce una señal de venta cuando la media móvil a corto plazo atraviesa la media móvil a largo plazo desde arriba.
La estrategia se define mediante el tipo de promedio móvil (SMA, EMA, WMA, RMA) y la longitud de los períodos, así como el rango de tiempo de retracción.
Calcular diferentes tipos de promedios móviles en una función variante. Los promedios móviles calculados se conservan en la variable ma.
Cuando el precio de cierre está por encima de ma, genera una señal de compra; cuando el precio de cierre está por debajo de ma, genera una señal de venta.
Para configurar el stop loss, se calcula la amplitud real media de la oscilación en 14 ciclos a través deatr. Se toma el punto de cruce como referencia, y se añade o disminuye 2 vecesatr como el rango de stop loss.
La lógica de entrada y salida es la siguiente:
Entrada múltiple: cerrar con ma y cerrar el punto de parada como entrada en el tiempo de recuperación Salida múltiple: cerrar la salida con pérdida de ma menos 2 vecesatr, o el precio más alto que supera el punto de entrada cerrar y 2 vecesatr para cerrar la salida Entrada sin cabeza: cerrar debajo de ma y en el tiempo de retroalimentación, el punto de parada es el punto de entrada cerrar Salida en blanco: cerrar con ma más 2 vecesatr para detener la salida, o el precio mínimo es inferior al punto de entrada cerrar menos 2 vecesatr para detener la salida
En cuanto a los riesgos, se puede optimizar en los siguientes aspectos:
La estrategia puede ser optimizada en los siguientes aspectos:
La estrategia de cruce de la media móvil es una estrategia de análisis técnico muy típica y comúnmente utilizada. La idea central de la estrategia es simple, fácil de implementar y se aplica a todos los mercados, y es una de las estrategias de entrada para el comercio cuantitativo. Pero la estrategia también tiene algunos problemas, como la generación de señales frecuentes, fácil de detener, etc.
/*backtest
start: 2023-10-03 00:00:00
end: 2023-11-02 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("MA Cross Strategy", overlay=true,commission_value = 0.1)
type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"])
length = input(28)
source = close
// === INPUT BACKTEST RANGE ===
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear = input(defval = 2000, title = "From Year", minval = 2000)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
variant(type, src, len) =>
v1 = sma(src, len) // Simple
v2 = ema(src, len) // Exponential
v5 = wma(src, len) // Weighted
v7 = rma(src, len) // Smoothed
type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1
ma = variant(type,source, length)
atr = security(syminfo.tickerid, "D", atr(14))
range = valuewhen(cross(close,ma), (atr*2), na)
ep = valuewhen(cross(close,ma), close, na)
plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1)
plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999)
strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep )
strategy.exit("Long Exit", "Long Entry", stop = ep-range)
strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] )
strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep )
strategy.exit("Short Exit", "Short Entry", stop = ep+range)
strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )