La estrategia utiliza el indicador de medias móviles (MACD) para construir señales de pluralidad, invertir en condiciones de buena tendencia y obtener ganancias mediante la configuración dinámica de las posiciones fuera de campo.
La estrategia se basa principalmente en el indicador MACD para generar una señal de forcado de oro y una señal de forcado de vacío. Concretamente, la línea MACD genera una señal de forcado de oro cuando la línea MACD cruza la línea de señal de abajo hacia arriba y una señal de forcado de vacío cuando la línea MACD cruza la línea de señal de arriba hacia abajo.
Cuando la señal de la horca de oro viene, si el precio de cierre es superior a la línea media de la EMA, haga más; cuando la señal de la horca muerta viene, si el precio de cierre es inferior a la línea media de la EMA, haga un vacío. Esto puede garantizar la inversión de operaciones bajo la gran tendencia.
Después de la entrada, la estrategia utiliza el stop loss y el stop loss para detener el stop loss dinámicamente. En concreto, el precio de entrada se configura como un solo stop loss.(1- la mayor caída); el stop se establece como el precio de entrada(1+TARGET_STOP_RATIO*El valor máximo de la caída es el inverso del valor de la opción en blanco. El valor máximo de la caída se calcula de forma dinámica y representa el porcentaje de caída del precio de la caída desde el swing low hasta el cierre. El valor por defecto de la opción en blanco es 2, y el valor de la caída es 2.
La ventaja de esta configuración es que se puede ajustar dinámicamente la tasa de pérdidas y los puntos de parada en función de las fluctuaciones del mercado. Se puede detener rápidamente la salida en grandes fluctuaciones y rastrear los paros en pequeñas fluctuaciones.
El indicador MACD se utiliza para construir señales de pluralidad de huecos, lo que permite determinar con eficacia el momento de la reversión de los precios.
En combinación con la línea media de la EMA como filtro, elegir el estado de tendencia al alza al entrar en juego, evitar el comercio en contra.
Sistema de control de salida dinámico, que permite ajustar en tiempo real la tasa de ganancias y pérdidas, los puntos de parada, y controlar el riesgo al mismo tiempo para lograr una alta ganancia.
Debido a las fluctuaciones del mercado, la salida es rápida, lo que reduce el tiempo de salida a bolsa y es más adecuado para los inversores ocupados.
Los indicadores MACD generan frecuentemente falsas señales en mercados con un orden horizontal. La solución es agregar la línea de equilibrio como filtro para evitar el comercio inverso.
En un mercado con extrema volatilidad, el DYNAMIC STOP puede causar un alto demasiado suave, pero en la mayoría de los casos funciona mejor. Si se encuentra con situaciones extremas, se puede considerar un índice de pérdidas fijas.
El espacio para obtener ganancias es limitado, y se requiere un comercio frecuente para obtener ganancias. Esto requiere que los inversores tengan cierta capacidad de resistencia psicológica y tiempo de inversión. Si no tienen tiempo libre para operar, se puede considerar adaptarse a un ciclo alto.
Ajuste los parámetros MACD de acuerdo con las características específicas de la variedad, para optimizar el efecto de las operaciones de forcados dorados y forcados muertos.
Prueba diferentes promedios móviles como indicadores de tendencias y busca mejores filtros.
Prueba de la TARGET_STOP_RATIO, método de cálculo de la máxima caída y optimización de la estrategia de stop loss.
Aumentar la calidad de las señales mediante la adición de otros criterios, como cambios en el volumen de transacciones y la volatilidad.
Intentar refinar más características con algoritmos de aprendizaje automático, construir modelos dinámicos multifactoriales y lograr un stop-loss más inteligente.
La estrategia en su conjunto tiene una gran utilidad. Con el MACD como la señal de negociación central, el aumento de la tendencia de juicio y el control de salida dinámica de dos módulos auxiliares, puede mejorar significativamente la eficacia de la negociación MACD sí mismo. La estrategia de stop loss es el foco de la optimización de la estrategia, la estrategia en este sentido ha realizado una gran cantidad de innovaciones, que vale la pena más investigación y aplicación.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 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/
// © maxencetajet
//@version=5
strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25)
src = input(title="Source", defval=close)
target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100)
risk = input.float(2, title="Risk per Trade %")
riskt = risk / 100 + 1
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
inTradeWindow = true
emaV = input.int(200, title="Length", group="EMA")
swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")
ema = ta.ema(src, emaV)
fast_length = input(title="Fast Length", defval=12, group="MACD")
slow_length = input(title="Slow Length", defval=26, group="MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
longcondition = close > ema and ta.crossover(macd, signal) and macd < 0
shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0
float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na
risk_long := risk_long[1]
risk_short := risk_short[1]
swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)
lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow)
lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close)
if strategy.position_size == 0 and longcondition and inTradeWindow
risk_long := (close - swingLow) / close
strategy.entry("long", strategy.long, qty=lotB)
if strategy.position_size == 0 and shortcondition and inTradeWindow
risk_short := (swingHigh - close) / close
strategy.entry("short", strategy.short, qty=lotS)
if strategy.position_size > 0
stopLoss := strategy.position_avg_price * (1 - risk_long)
takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
entry_price := strategy.position_avg_price
strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
if strategy.position_size < 0
stopLoss := strategy.position_avg_price * (1 + risk_short)
takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
entry_price := strategy.position_avg_price
strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
plot(ema, color=color.white, linewidth=2, title="EMA")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))