MACD fechamento da estratégia híbrida de tartaruga

Autora:ChaoZhang, Data: 2023-10-30 12:16:20
Tags:

img

Resumo

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.

Princípios de estratégia

A estratégia baseia-se principalmente nos seguintes princípios:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Vantagens

As principais vantagens desta estratégia multiindicador são:

  1. O MACD identifica tendências e pontos de reversão para a entrada.

  2. A relação entre o preço de fechamento e a linha mediana determina com precisão o fim da tendência.

  3. A reentrada aumenta a eficiência da utilização do capital.

  4. A entrada de correcções adiciona posições em tempo útil para capturar tendências.

  5. A alta frequência de negociação com risco controlado produz altos fatores de lucro.

  6. Parâmetros personalizáveis para otimização entre produtos e mercados.

  7. Lógica clara e código conciso para fácil negociação ao vivo.

  8. Os dados de backtest suficientes garantem a fiabilidade.

Riscos

Os principais riscos são:

  1. A probabilidade de sinais MACD falsos necessita de verificação com outros indicadores.

  2. Paradas muito apertadas podem ser interrompidas por movimentos voláteis.

  3. O aumento da frequência do comércio exige o controlo da utilização do capital.

  4. As entradas de correcção podem causar perdas durante os retrabalhos.

  5. Optimização necessária para diferentes produtos e mercados.

  6. Requer backtesting e otimização contínuos.

  7. 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

Oportunidades de melhoria:

  1. Adicionar outros indicadores para verificar sinais, por exemplo KDJ.

  2. Implementar paradas dinâmicas adaptativas.

  3. Otimizar a lógica de reentrada e correcção.

  4. Optimização de parâmetros por produto.

  5. Otimizar a utilização do capital para as entradas.

  6. Incorporar indicadores de volume para evitar perdas decorrentes de entradas de retração.

  7. Adicionar mecanismos de saída como paradas de movimento.

  8. Construir um robô de negociação automatizado.

  9. Contar com fatores do mundo real como deslizamento.

Estes podem melhorar ainda mais a estabilidade, adaptabilidade, automação e desempenho ao vivo.

Conclusão

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", "")

Mais.