La estrategia de tendencia de cruce de promedio móvil doble es una estrategia de negociación basada en promedios móviles. Utiliza el cruce de líneas de EMA rápidas y SMA lentas como señales de compra y venta, y combina la divergencia del indicador MACD para filtrar señales. La estrategia considera múltiples factores como precio, tendencia e impulso, formando un sistema de negociación relativamente completo.
La estrategia utiliza dos promedios móviles, EMA con una duración de 200 días y SMA con una duración de 100 días. Cuando el precio rompe ambas líneas hacia arriba, se genera una señal de compra. Cuando el precio rompe ambas líneas hacia abajo, se genera una señal de venta. Esto puede filtrar eficazmente las tendencias oscilantes y los retrocesos a corto plazo.
Para mejorar aún más la confiabilidad de las señales, también se introduce el indicador MACD. Cuando el precio rompe la EMA y SMA para formar una señal, la línea rápida del MACD necesita romper la línea lenta desde abajo, y el histograma del MACD necesita estar por encima del eje 0, para desencadenar una señal de compra real. Por el contrario, cuando la línea rápida del MACD rompe la línea lenta desde arriba, y el histograma del MACD está por debajo del eje 0, desencadenará una señal de venta real.
Además, el punto de stop loss y take profit se establecen en la estrategia. Después de que la estrategia abra una posición, el punto de stop loss y take profit se calcularán y establecerán de acuerdo con el porcentaje establecido por el usuario. Esto puede controlar eficazmente el riesgo de una sola operación.
En resumen, esta estrategia considera ampliamente múltiples indicadores, establece condiciones estrictas de filtrado para las señales de compra y venta y adopta stop loss y take profit para gestionar los riesgos, formando un sistema de negociación relativamente riguroso y completo.
La estrategia de tendencia cruzada de la media móvil doble tiene las siguientes ventajas:
La combinación de múltiples indicadores, la consideración exhaustiva del precio, la tendencia y el impulso y el establecimiento de condiciones estrictas de filtrado de las señales pueden evitar eficazmente las señales falsas y mejorar la fiabilidad de la señal.
El uso de dos promedios móviles con parámetros diferentes puede identificar mejor las tendencias del mercado y filtrar los mercados oscilantes.
El indicador MACD introduce parámetros personalizables que se pueden ajustar de acuerdo con las características de diferentes mercados y tiene una gran flexibilidad.
El establecimiento de puntos de stop loss y take profit puede maximizar el control sobre las pérdidas de una sola operación y evitar pérdidas excesivas.
Los parámetros de esta estrategia se pueden establecer de manera flexible y la estrategia se puede ajustar en función de los resultados de optimización, lo que es muy práctico.
La estrategia de tendencia cruzada de la doble media móvil también presenta algunos riesgos, principalmente en las siguientes áreas:
Cuando el precio de las acciones muestra violentas fluctuaciones, la EMA y la SMA pueden cruzarse falsamente muchas veces, lo que resulta en una apertura y cierre frecuentes de las señales de negociación.
Los indicadores MACD pueden tener falsas rupturas, especialmente en el proceso cuando el impulso aún no está claro.
La posición y la relación de los ajustes de stop loss tienen una gran influencia en los resultados de ganancias y pérdidas. Si el stop loss se establece demasiado pequeño, existe el riesgo de ser atrapado; si el stop loss se establece demasiado grande, la pérdida individual puede ser demasiado pesada. Esto requiere pruebas suficientes para encontrar los parámetros óptimos.
Como indicador de seguimiento de tendencias, la efectividad de la media móvil se descontará cuando los precios se invierten rápidamente.
Las soluciones correspondientes son las siguientes:
Para los mercados volátiles, ajustar adecuadamente los parámetros de las medias móviles, utilizando EMA y SMA de parámetros más bajos para reducir la frecuencia de cruce.
Aumentar las condiciones de filtrado, como la ruptura del MACD por encima y por debajo de la línea cero, lo que puede reducir las fallas hasta cierto punto.
La configuración de la posición y la relación de stop loss requiere pruebas y optimización suficientes para encontrar los parámetros óptimos.
Cuando se detectan inversiones anormales, se pueden tomar medidas de emergencia como reducir posiciones o suspender estrategias de negociación para controlar la exposición al riesgo.
Todavía queda espacio para una mayor optimización de la estrategia de tendencia cruzada de la media móvil doble, principalmente en los siguientes aspectos:
Prueba más indicadores para combinar para encontrar mejores parámetros, como incorporar el canal BOLL y considerar el impacto de la volatilidad.
Optimizar los parámetros de las longitudes promedio móvil para encontrar la mejor combinación de parámetros en diferentes condiciones del mercado.
Establecer estrategias más científicas y razonables de stop loss y obtener ganancias, como la introducción de stop loss de seguimiento o el establecimiento de ratios dinámicos de riesgo-recompensación basados en resultados estadísticos históricos.
Establecer mecanismos para la identificación automática y la respuesta de emergencia de las reversiones anormales de precios.
Expanda las variedades de comercio como divisas, criptomonedas y otras variedades. Prueba la robustez de los parámetros en diferentes variedades para ampliar la aplicabilidad de la estrategia.
Optimizar las estrategias de gestión de capital de la estrategia, como el comercio de valores fijos, la relación de posición fija, etc. Controlar el riesgo de pérdida de una sola operación, haciendo que la curva general de capital sea más estable.
La estrategia de tendencia de cruce de promedio móvil doble considera de manera integral múltiples factores. Al generar señales comerciales, requiere el apoyo de múltiples indicadores como precio, tendencia e impulso para garantizar la confiabilidad de la señal. La estrategia también adopta stop loss móvil y take profit para controlar eficazmente los riesgos de las operaciones individuales.
Sin embargo, ninguna estrategia puede ser perfecta. Esta estrategia también encontrará algunas dificultades en la aplicación, como el comercio frecuente, las fallas falsas, el posicionamiento de stop loss, etc. Para mejorar aún más la robustez y la rentabilidad de la estrategia, es necesario hacer esfuerzos en muchos aspectos, incluida la optimización de las carteras de parámetros, la introducción de nuevos indicadores técnicos, la mejora del mecanismo de stop loss, y así sucesivamente.
En resumen, la estrategia de tendencia de cruce de media móvil doble forma un sistema de negociación relativamente completo y riguroso.
/*backtest start: 2023-11-01 00:00:00 end: 2023-11-30 23:59:59 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Hi, // This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript // The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal // If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal // I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday // If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can // I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy strategy("MACD Crossover Trend Strategy Template", overlay = true ) // Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values") slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values") src = input(title = "Source", type = input.source, defval = close, group = "MACD Values") signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values") sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values") sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values") fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages") smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages") // Input backtest range, you can adjust this here or in the input options fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range") fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range") fromYear = input(defval = 2000, title = "From Year", type = input.integer, minval = 1970, group = "Backtest Date Range") thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range") thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range") thruYear = input(defval = 2099, title = "Thru Year", type = input.integer, minval = 1970, group = "Backtest Date Range") // Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages ema = ema(close, emaLength) sma = sma(close, smaLength) profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01 losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01 profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01 lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01 // Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs // (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed) // If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0)) long = close > ema and close > sma and inDataRange short = close < ema and close < sma and inDataRange // Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code // I want a way to filter out weak signals that are ranging around the zero point of the histogram. // So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000 // I could probably use a cofficiency or something, but that's beyond my grasp at the moment // Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback if (crossover(macd, signal) and macd > 0) strategy.entry("Long", long = strategy.long, comment = "Long Buy", when = long) strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick) if (crossunder(macd, signal) and macd < 0) strategy.entry("Short", long = strategy.short, comment = "Short Buy", when = short) strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick) // To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates if (not inDataRange) strategy.close_all() // plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)