Esta estratégia combina os sinais de cruz de ouro e cruz morta do indicador MACD, a relação do preço de fechamento com a linha mediana e as características de volatilidade dos preços para determinar os pontos de entrada e saída.
A estratégia baseia-se principalmente nos seguintes princípios:
Utilize a linha rápida e a linha lenta do MACD, a cruz de ouro e a cruz morta para determinar os mercados de alta e baixa e os pontos de entrada específicos.
Utilize a relação entre o preço de fechamento e a linha mediana para determinar o fim das tendências e os pontos de saída.
Estabelecer um mecanismo de reentrada para reentrar no mercado na mesma direção após o fim da tendência atual do MACD para aumentar os lucros.
Definição do mecanismo de entrada de correcção para adicionar posições durante correcções parciais de preços dentro de uma tendência.
Ajustar dinamicamente as posições com base no acima para maximizar os lucros dentro das tendências, enquanto sair rapidamente quando a tendência termina.
Especificamente, a estratégia primeiro verifica se uma cruz de ouro ou cruz morta ocorre entre as linhas rápidas e lentas do MACD para ir longo ou curto.
Além disso, a estratégia tem um mecanismo de reentrada para reabrir posições na direção original se o MACD continuar a mostrar sinais na mesma direção após o término da tendência inicial.
Através dessas configurações, a estratégia pode ajustar dinamicamente as posições, aumentar as frequências de entrada e saída e maximizar os retornos, controlando os riscos dentro das tendências.
As principais vantagens desta estratégia multiindicador são:
O MACD identifica tendências e pontos de reversão para a entrada.
A relação entre o preço de fechamento e a linha mediana determina com precisão o fim da tendência.
A reentrada aumenta a eficiência da utilização do capital.
A entrada de correcções adiciona posições em tempo útil para capturar tendências.
A alta frequência de negociação com risco controlado produz altos fatores de lucro.
Parâmetros personalizáveis para otimização entre produtos e mercados.
Lógica clara e código conciso para fácil negociação ao vivo.
Os dados de backtest suficientes garantem a fiabilidade.
Os principais riscos são:
A probabilidade de sinais MACD falsos necessita de verificação com outros indicadores.
Paradas muito apertadas podem ser interrompidas por movimentos voláteis.
O aumento da frequência do comércio exige o controlo da utilização do capital.
As entradas de correcção podem causar perdas durante os retrabalhos.
Optimização necessária para diferentes produtos e mercados.
Requer backtesting e otimização contínuos.
Os custos de deslizamento precisam ser considerados para negociação ao vivo.
As medidas de gestão de risco incluem o uso de paradas para limitar perdas, avaliar a utilização do capital, otimizar parâmetros por produto através de backtesting, monitorar a dinâmica do mercado para refinar parâmetros e contabilizar deslizamentos em testes.
Oportunidades de melhoria:
Adicionar outros indicadores para verificar sinais, por exemplo KDJ.
Implementar paradas dinâmicas adaptativas.
Otimizar a lógica de reentrada e correcção.
Optimização de parâmetros por produto.
Otimizar a utilização do capital para as entradas.
Incorporar indicadores de volume para evitar perdas decorrentes de entradas de retração.
Adicionar mecanismos de saída como paradas de movimento.
Construir um robô de negociação automatizado.
Contar com fatores do mundo real como deslizamento.
Estes podem melhorar ainda mais a estabilidade, adaptabilidade, automação e desempenho ao vivo.
Esta estratégia integra sinais MACD, análise de preços de fechamento e múltiplos mecanismos de entrada para maximizar as tendências enquanto controla o risco.
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 00:00:00 period: 2h 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/ // © Puckapao //@version=4 // strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00) // Getting inputs reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2) sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4) fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) ema_period = input(title="EMA Period", type=input.integer, defval=21) // Get date startDate = input(title="Start Date", type=input.integer, defval=19, minval=1, maxval=31) startMonth = input(title="Start Month", type=input.integer, defval=09, minval=1, maxval=12) startYear = input(title="Start Year", type=input.integer, defval=2017, minval=1800, maxval=2100) endDate = input(title="End Date", type=input.integer, defval=31, minval=1, maxval=31) endMonth = input(title="End Month", type=input.integer, defval=3, minval=1, maxval=12) endYear = input(title="End Year", type=input.integer, defval=2021, minval=1800, maxval=2100) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true reenter_cnt = 0 reenter_cnt := nz(reenter_cnt[1]) sculp_cnt = 0 sculp_cnt := nz(sculp_cnt[1]) close_cnt = 0 close_cnt := nz(close_cnt[1]) on_long = false on_long := nz(on_long[1]) on_short = false on_short := nz(on_short[1]) sculp = false reenter = false slowdown = false ema = ema(close, ema_period) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating 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 // plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) cross_up = crossover(macd, signal) cross_down = crossunder(macd, signal) if (inDateRange) over_macd = macd > 0 and signal > 0 ? true : false under_macd = macd < 0 and signal < 0 ? true : false over_water = close > ema ? true : false under_water = close < ema ? true : false slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true) reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false) sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false)) if(reenter == true) if(reenter_cnt < reenter_delay) reenter_cnt := reenter_cnt + 1 else if(reenter_cnt > 0) reenter_cnt := reenter_cnt - 1 if(sculp == true) if(sculp_cnt < sculp_delay) sculp_cnt := sculp_cnt + 1 else if(sculp_cnt > 0) sculp_cnt := sculp_cnt - 1 if(slowdown == false) if(close_cnt < 2) close_cnt := close_cnt + 1 else close_cnt := 0 // plotchar(fork_cnt, "fork count", "") // plotchar(spoon_cnt, "spoon count", "") // Entry if (cross_up == true) strategy.entry("long", strategy.long, comment = "long", alert_message = "long") on_long := true on_short := false if (cross_down == true) strategy.entry("short", strategy.short, comment = "short", alert_message = "short") on_short := true on_long := false // Sculp bottom / top if (sculp == true and sculp_cnt >= sculp_delay) if (hist >= 0) strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short") else strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long") sculp_cnt := 0 sculp := false // Re-Entry if (reenter == true and reenter_cnt >= reenter_delay) if (hist >= 0) strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long") else strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short") reenter_cnt := 0 reenter := false // Close strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long") strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short") strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long") strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short") strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long") strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short") if (slowdown) if (hist >= 0) on_long := false else on_short := false plotchar(slowdown, "close", "") plotchar(reenter, "reenter", "") plotchar(reenter_cnt, "reenter count", "") plotchar(sculp, "sculp", "") plotchar(sculp_cnt, "sculp count", "")