Método de avaliação de risco

Autora:ChaoZhang, Data: 2024-02-19 10:48:11
Tags:

img

Resumo

Esta estratégia baseia-se na combinação de médias móveis do indicador MACD para realizar o julgamento de tendências dinâmicas em períodos de tempo. Pertence a uma estratégia de rastreamento de tendências mais clássica. Ele julga principalmente a direção e a força da tendência atual através da diferença entre as médias móveis rápidas e lentas do MACD e a relação entre sua linha de sinal. Ao mesmo tempo, o julgamento interperíodo é introduzido para melhorar a precisão e ajustar dinamicamente as posições.

Princípio da estratégia

  1. Julgar a direção da tendência atual com base na diferença entre as médias móveis rápidas e lentas do indicador MACD e sua relação de linha de sinal.
  2. A diferença MACD que cruza acima da linha de sinal é um sinal longo e a que cruza abaixo é um sinal curto.
  3. Introduza a diferença MACD e o histograma MACD na mesma direção para melhorar os sinais de estratégia.
  4. Adicionar um módulo de julgamento do ciclo cruzado, utilizar o indicador MACD de um período de tempo mais longo como filtro de sinal e base de ajuste de posição.
  5. Ajuste dinâmico da posição, redução do tamanho da posição quando o sinal do ciclo cruzado é mais fraco e aumento da posição quando o sinal é reforçado.

Análise das vantagens

  1. A própria eficácia do MACD na determinação da direcção da tendência é relativamente elevada.
  2. A combinação da diferença MACD e da verificação dupla do histograma pode melhorar a precisão do sinal.
  3. O julgamento transversal aumenta a estabilidade da estratégia e evita ser enganado por sinais de alta frequência.
  4. O ajustamento dinâmico da posição permite que a estratégia aproveite melhor as oportunidades e aumente os rendimentos excedentários.

Análise de riscos e soluções

  1. Os sinais MACD apresentam um atraso, o que pode levar a efeitos de sinal ligeiramente inferiores.
  • Solução: Aumentar a diferença entre as médias móveis rápidas e lentas para capturar os sinais com antecedência.
  1. Os sinais de ciclo cruzado não são necessariamente precisos e podem induzir em erro as estratégias.
  • Solução: introduzir um mecanismo de ajustamento da posição dinâmica para garantir que a estratégia do ciclo principal domine.
  1. A estabilidade global das estratégias combinadas multifatores pode ser insuficiente.
  • Solução: ajustar cuidadosamente a proporção de peso de cada parâmetro de estratégia para garantir a robustez global.

Orientações de otimização

  1. Teste os efeitos de diferentes combinações de parâmetros do ciclo.
  2. Testar o impacto de diferentes combinações transversais de ciclos na eficácia da estratégia.
  3. Ajustar os parâmetros do indicador MACD, tais como ciclos de média móvel rápida e lenta, ciclos de linha de sinal, etc.
  4. Teste os efeitos de diferentes fatores de ajuste de posição.
  5. Teste os efeitos dos backtests noutras variedades.

Resumo

Esta estratégia de tendência dinâmica de combinação de média móvel MACD integra as vantagens dos indicadores clássicos e referências de quadros de tempo múltiplos. Através da otimização de parâmetros e testes de combinação, uma estratégia de rastreamento de tendência relativamente estável e lucrativa pode ser construída. Vale a pena testar e aplicar dinheiro real.


/*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')



Mais.