Estratégia híbrida de tartaruga mediana de fechamento do MACD


Data de criação: 2023-10-30 12:16:20 última modificação: 2023-10-30 12:16:20
cópia: 1 Cliques: 630
1
focar em
1617
Seguidores

Estratégia híbrida de tartaruga mediana de fechamento do MACD

Visão geral

A estratégia combina o uso do sinal de forca de ouro do MACD, a relação entre o preço de fechamento da linha K e a linha média, e os traços de oscilação de preços para determinar o momento de entrada e saída, além de definir mecanismos de reentrada e correção de entrada, com o objetivo de obter mais oportunidades de negociação e controlar o risco para obter ganhos estáveis.

Princípio da estratégia

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

  1. A análise do MACD de linhas rápidas e lentas para determinar os mercados de ativos e passivos, bem como os pontos de entrada específicos.

  2. Use a relação entre o preço de fechamento da linha K e a linha média para determinar se a tendência de alta vaga terminou e onde começou.

  3. Estabelecer mecanismos de reentrada para aumentar as oportunidades de lucro após a conclusão da atual rodada do MACD, se a tendência continuar.

  4. Estabelecer um mecanismo de entrada de correção, se o preço tiver uma correção parcial, mas não tiver sido revertido, adicione uma posição, que é um ajuste dentro da tendência.

  5. Combinando os pontos acima, ajuste sua posição dinamicamente para obter o máximo de lucro possível durante a tendência e saia rapidamente quando a tendência terminar.

Concretamente, a estratégia julga primeiro se a linha rápida e a linha lenta do MACD ocorrem em um forco dourado ou em um forco morto, se o forco dourado for mais, se o forco morto for vazio; e então julga se a linha K fechará e tocará a linha média, e se tocará, será julgado como o fim da tendência e será eliminado.

Além disso, a estratégia também estabelece um mecanismo de reentrada, ou seja, após o fim da tendência da direção original, se o MACD continuar a mostrar o mesmo sinal de direção, a estratégia abrirá novamente a posição de acompanhamento da tendência. Ao mesmo tempo, também estabelece um mecanismo de entrada de correção, se o preço tiver um pequeno ajuste, mas ainda não tiver uma reversão completa, a estratégia aumentará a posição apropriadamente, o que é um comportamento normal de reajuste na tendência.

Através dessas configurações, a estratégia pode ajustar dinamicamente a posição na tendência, entrar e sair mais vezes, obtendo maiores ganhos com o risco controlado.

Vantagens estratégicas

Esta estratégia utiliza vários indicadores, com as seguintes vantagens principais:

  1. O MACD pode identificar tendências e pontos de reversão, determinando pontos de entrada específicos.

  2. A correlação entre o preço de fechamento e a linha média permite determinar com precisão o final da tendência.

  3. O mecanismo de reentrada aumentou o número de aberturas e a eficiência na utilização dos fundos.

  4. A correção do mecanismo de admissão permite que os investidores recuperem o capital em tempo hábil para capturar as tendências.

  5. A frequência de operações estratégicas é alta, mas os riscos são controláveis e os fatores de lucro mais elevados são facilmente obtidos.

  6. Os parâmetros são ajustáveis e podem ser otimizados para diferentes variedades e situações.

  7. A estratégia é clara e fácil de entender, o código é escrito de forma concisa, e o disco rígido é fácil de operar.

  8. Os dados de detecção são abundantes, de alta confiabilidade, e os resultados são fáceis de verificar no disco rígido.

Risco estratégico

A estratégia também apresenta os seguintes principais riscos:

  1. A probabilidade de que o MACD emita um sinal falso, que precisa ser verificado em combinação com outros indicadores.

  2. A configuração de stop loss de grande escala é pequena demais e pode ser afetada por uma onda de choque de grande escala.

  3. A reentrada e a entrada de correção aumentam a frequência das operações, e é necessário controlar a utilização dos fundos.

  4. A correção de entrada em uma tendência de retorno pode levar a maiores perdas.

  5. A variedade de transação e a configuração dos parâmetros necessitam de otimização e não se aplicam a todas as variedades.

  6. É necessário um feedback e uma otimização contínuos, ajustando os parâmetros de acordo com o mercado.

  7. O impacto do custo de um ponto de deslizamento no disco rígido deve ser considerado.

As medidas de gerenciamento de risco correspondentes incluem: definir um stop loss para garantir que os perdas individuais sejam limitadas; avaliar a utilização dos fundos e manter uma reserva de dinheiro razoável; fazer um retorno com base no conjunto de parâmetros apropriados para a seleção da variedade; manter o foco nas mudanças nas características do mercado para otimizar os parâmetros; considerar o impacto do custo de deslizamento no retorno e na simulação.

Direção de otimização da estratégia

A estratégia pode ser melhorada em alguns aspectos:

  1. Combinação de outros indicadores para verificação de sinal, aumentando a precisão do sinal. Como o indicador KDJ.

  2. Configure um padrão de parada de dano dinâmico adaptativo.

  3. Optimizar a lógica de admissão condicional de reentrada e de correção de entrada.

  4. Parâmetros de sub-variedades são otimizados, definindo o melhor conjunto de parâmetros.

  5. Otimizar a taxa de utilização dos fundos, estabelecer restrições de fundos para a reentrada e para a correção da entrada.

  6. Indicadores de capacidade combinada para evitar perdas de retomada de posição em uma situação de recuperação.

  7. Adicionar mecanismos de saída, como a configuração de stop loss móvel, etc.

  8. Considere o encapsulamento da estratégia como um robô de negociação para automatizar a negociação.

  9. Aumentar considerações de disco rígido, como o custo do ponto de deslizamento.

Através dessas otimizações, é possível melhorar ainda mais a estabilidade, a adaptabilidade, o grau de automação e a eficácia da estratégia no mercado.

Resumir

Esta estratégia integra o uso de sinais de negociação do indicador MACD, análise de preços de fechamento de linha K e mecanismo de entrada múltipla, enquanto controla o risco ao capturar a tendência, é uma estratégia de estratégia de negociação quantitativa de alta eficiência. A estratégia possui vantagens como alta frequência de operação, boa utilização de capital e baixa dificuldade de realização, mas também requer atenção ao controle de risco e otimização da estratégia, com um forte valor prático e espaço para expansão.

Código-fonte da estratégia
/*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", "")