
La estrategia de cruce de doble media móvil realiza el seguimiento de la tendencia mediante el cálculo de la media móvil de diferentes períodos, para determinar la dirección de la tendencia de los precios. Se trata de una estrategia típica de seguimiento de la tendencia.
La estrategia se basa en las medias móviles de índices de 9 períodos, 21 períodos y 50 períodos (EMA). Donde 9 períodos EMA representan la tendencia a corto plazo, 21 períodos EMA representan la tendencia a mediano plazo y 50 períodos EMA representan la tendencia a largo plazo.
Cuando el EMA de 9 períodos atraviesa el EMA de 21 períodos, la tendencia a corto plazo se transforma en alza, haciendo más; cuando el EMA de 9 períodos atraviesa el EMA de 21 períodos, la tendencia a corto plazo se transforma en caída, haciendo vacío. Aquí se usa la función de cruce (crossover) para determinar el cruce de la línea media.
El código establece la lógica de apertura, parada y parada de pérdidas de las posiciones largas y las posiciones vacías. Las condiciones de apertura de las posiciones son uniformes en la línea de entrada o de la entrada.
Además, el código añade algunos requisitos de filtración, como el filtro de tendencia, que requiere que la línea K no se tambalee antes de que la línea media suba y descienda, y el filtro de utilización de capital, que requiere que la estrategia de utilidad no esté por debajo de la línea media de N días, para evitar pérdidas excesivas y seguir operando. Estos requisitos de filtración pueden evitar, hasta cierto punto, señales falsas.
En general, la estrategia utiliza el cruce de dos EMAs para determinar la dirección de la tendencia de los precios, y una lógica de stop-stop razonable para capturar la tendencia de la línea media y larga. Sin embargo, como una estrategia de un solo factor, su señal puede no ser lo suficientemente estable como para optimizar aún más.
Cómo hacer frente a esto:
La estrategia puede ser optimizada en los siguientes aspectos:
Optimización de los parámetros de ciclo de la media móvil para encontrar la combinación óptima de ciclos. Se puede introducir una técnica de optimización adaptativa, el ciclo de selección dinámica.
Añadir otros indicadores técnicos para filtrar señales, como MACD, KD, etc., para mejorar la calidad de la señal. O introducir aprendizaje automático para calificar la señal y filtrar automáticamente las falsas señales.
En combinación con el análisis de volumen de transacciones, no recibe señales cuando se rompe la línea media pero el volumen de transacciones es insuficiente.
Cuando se produce una ruptura, se analizan las fluctuaciones previas, como una ruptura en la zona de temblor, que puede ser falsa.
Establecer mecanismos dinámicos de detención de pérdidas, como la detención de tipo de seguimiento, la salida de Chandelier, etc., para reducir la distancia de detención de pérdidas, pero asegurarse de que la detención sea efectiva.
Optimización de la gestión de posiciones, como posiciones fijas, posiciones dinámicas, posiciones de apalancamiento, etc., para que el porcentaje de ganancias y pérdidas sea más razonable.
Tener en cuenta los costos de transacción y el impacto de los puntos de deslizamiento. Optimizar el Stop Loss Ratio para garantizar que la estrategia siga siendo rentable en el mercado real.
La estructura general de esta estrategia es razonable, el principio es simple, se determina la dirección de la tendencia a través de la cruz de dos EMA, y se establece una lógica de stop-stop para capturar la tendencia. Pero como una estrategia de un solo factor, se puede optimizar aún más la configuración de los parámetros, la filtración de señales, etc., para que la estrategia sea más estable.
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist
//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")
//turn on/off / adjust trade filters (average range/average equity)
sidein2 = input(200, step=10, title='lookback for average range (bars)')
sidein = input(1, title='filter trades if range is less than (%)')/100
equityIn = input(40, title='filter trades if equity is below ema()')
sidewayssw = input(true, title='sideways filter?')
equitysw = input(true, title='equity filter?')
longtpin = input(1,step=0.1, title='long TP %')/100
longslin = input(0.4,step=0.1, title='long SL %')/100
shorttpin = input(1,step=0.1, title='short TP %')/100
shortslin = input(0.4,step=0.1, title='short SL %')/100
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1 = (close[1] + close[sidein2]) / 2
side2 = close[1] - close[sidein2]
side3 = side2 / side1
notsideways = side3 > sidein
equityMa = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon = strategy.equity >= equityMa
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)
plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1 = crossover(ma2,ma3)
longCondition2 = close[5] > close[10]
longCondition3 = close[1] > close[2]
shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]
closelong = shortCondition1
closeshort = longCondition1
//-------------------------------------------
//(leave as is)
longCondition1in = longCondition1
longCondition2in = lConSw2 ? longCondition2 : true
longCondition3in = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions = longCondition1in and longCondition2in and longCondition3in
shortConditions = shortCondition1in and shortCondition2in and shortCondition3in
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel = strategy.position_avg_price * (1 + longtpin)
longsllevel = strategy.position_avg_price * (1 - longslin)
shorttplevel = strategy.position_avg_price * (1 - shorttpin)
shortsllevel = strategy.position_avg_price * (1 + shortslin)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear = 2000
startmonth = 1
startday = 1
stopyear = 9999
stopmonth = 12
stopday = 31
//-------------------------------------------
//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe() =>
time >= startperiod and time <= periodstop ? true : false
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
if longinc
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry(id="long", long=true, when=long, comment=" ")
strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
strategy.close(id="long", when=closelong, comment = " ")
if shotinc
if strategy.position_size == 0 or strategy.position_size < 0
strategy.entry(id="short", long=false, when=short, comment = " ")
strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
strategy.close(id="short", when=closeshort, comment = " ")