Esta estratégia utiliza o indicador Moving Average Convergence Divergence (MACD) para gerar sinais longos e curtos e realiza operações de reversão em boas condições de tendência, definindo dinamicamente pontos de saída para captar lucros.
O núcleo desta estratégia é baseado na cruz de ouro do MACD para sinais longos e cruz de morte para sinais curtos. Especificamente, quando a linha MACD cruza acima da linha de sinal de baixo, uma cruz de ouro é gerada como um sinal longo; quando a linha MACD cruza abaixo da linha de sinal de cima, uma cruz de morte é gerada como um sinal curto.
Em sinais de cruz de ouro, vá longo se o preço de fechamento estiver acima da EMA; em sinais de cruz de morte, vá curto se o preço de fechamento estiver abaixo da EMA. Isso garante a reversão das negociações sob uma tendência de alta.
Após a entrada de posições, a estratégia utiliza stop loss e take profit para controlar dinamicamente as saídas. Especificamente, o stop loss para posições longas é definido no preço de entrada * (1 - max drawdown); o take profit é definido no preço de entrada * (1 + TARGET_STOP_RATIO * max drawdown).
A vantagem desta estratégia de parada dinâmica é que pode ajustar a perda de parada e a relação risco / recompensa com base na volatilidade do mercado.
O MACD é um indicador eficaz para identificar oportunidades de reversão.
O filtro EMA garante que as negociações longas aconteçam apenas em um mercado de tendência ascendente.
O sistema de controlo de saída dinâmico maximiza o lucro e gerencia eficazmente os riscos.
A velocidade de existência rápida reduz o tempo de monitorização necessário, tornando-o adequado para investidores ocupados.
O MACD oscila com frequência durante os mercados laterais, gerando sinais falsos.
A volatilidade extrema pode fazer com que o DYNAMIC STOP seja muito frouxo.
Os investidores precisam de certa resistência psicológica e compromisso de tempo. podem mudar para prazos mais altos se estiverem muito ocupados.
Ajustar os parâmetros MACD com base nas características do símbolo para otimizar a qualidade do sinal.
Teste diferentes médias móveis como filtro de tendência para encontrar a ideal.
Testar o cálculo do TARGET_STOP_RATIO e a definição do drawdown máximo para otimizar a estratégia de saída.
Adicione outros fatores como volume, volatilidade, etc. para melhorar a qualidade do sinal.
Explorar modelos de aprendizagem de máquina para extrair mais recursos e construir modelos multifatores adaptativos para saídas mais inteligentes.
Esta estratégia tem um forte valor prático em geral. Com o MACD como principal sinal de negociação, os módulos adicionais de filtro de tendência e controle de saída dinâmico podem melhorar significativamente o desempenho do próprio MACD. O controle de saída é essencial para a otimização da estratégia e esta estratégia inova substancialmente nesta área. Vale a pena mais pesquisa e aplicação.
/*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))