Estratégia de julgamento de tendência dinâmica MACD com base na média móvel


Data de criação: 2024-02-19 10:48:11 última modificação: 2024-02-19 10:48:11
cópia: 0 Cliques: 601
1
focar em
1621
Seguidores

Estratégia de julgamento de tendência dinâmica MACD com base na média móvel

Visão geral

A estratégia baseia-se em uma combinação de linhas médias dos indicadores MACD para determinar a tendência dinâmica ao longo de períodos de tempo. É uma estratégia de acompanhamento de tendências mais clássica.

Princípio da estratégia

  1. A direção da tendência atual é determinada pela diferença de linha média rápida e lenta do indicador MACD e sua relação com a linha de sinal
  2. MACD diferencial de cima atravessa a linha de sinal para fazer sinal de mais, abaixo atravessa para fazer sinal de vazio
  3. Introdução de MACD diferencial e MACD coluna para reforçar o sinal de estratégia
  4. Adição de módulos de julgamento inter-período, com base em indicadores MACD de períodos de tempo mais elevados como filtro de sinal e regulação de posição
  5. Ajuste dinâmico de posição, diminuição do tamanho da posição quando o sinal é fraco e aumento da posição quando o sinal é forte

Análise de vantagens

  1. Os indicadores MACD são mais eficazes para determinar a direção da tendência
  2. Combinação de diferença MACD e verificação dupla de linhas colunares para melhorar a precisão do sinal
  3. O julgamento inter-ciclo aumenta a estabilidade da estratégia e evita o engano dos sinais de alta frequência
  4. A correção dinâmica de posições permite que a estratégia aproveite melhor as oportunidades e melhore os excedentes

Análise de riscos e soluções

  1. O sinal MACD está atrasado, o que pode causar um pouco de falha no sinal
  • Solução: adicionar a mediana rápida e a mediana lenta para determinar a diferença entre os valores de mediana rápida e mediana lenta para capturar o sinal antecipadamente
  1. Os sinais inter-ciclos não são necessariamente precisos e podem induzir a estratégias erradas
  • Solução: Introdução de mecanismos de ajuste dinâmico de posições para que as estratégias de ciclo principal dominem
  1. Estratégias de combinação de múltiplos fatores podem ser insuficientemente estáveis em geral
  • Solução: ajustar cuidadosamente a proporção de parâmetros estratégicos para garantir a robustez global

Direção de otimização

  1. Testar a eficácia de diferentes combinações de parâmetros de ciclo
  2. Teste dos efeitos de diferentes combinações transcíclicas sobre a eficácia da estratégia
  3. Ajustar os parâmetros do indicador MACD, como o ciclo de linha média rápida e lenta, o ciclo de linha de sinal, etc.
  4. Teste dos efeitos de diferentes fatores de regulação de posições
  5. Teste de resposta em outras variedades

Resumir

O MACD combina estratégias de tendências dinâmicas entre períodos, integrando os benefícios do julgamento de indicadores clássicos e de referências de múltiplos quadros temporais. Através da otimização de parâmetros e testes de combinação, é possível construir uma estratégia de acompanhamento de tendências mais estável e lucrativa.

Código-fonte da estratégia
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')