Estratégia de tempo de média móvel diferencial do oscilador


Data de criação: 2023-12-26 14:40:12 última modificação: 2023-12-26 14:40:12
cópia: 0 Cliques: 656
1
focar em
1621
Seguidores

Estratégia de tempo de média móvel diferencial do oscilador

Visão geral

Esta estratégia cria um oscilador MACD através do cálculo do diferencial entre o EMA de linha rápida e o EMA de linha lenta, e, em seguida, cria uma linha de sinal através do cálculo da linha média do MACD, construindo assim um sistema de filtro duplo. Quando a linha MACD atravessa a linha de sinal de cima para baixo, gera um sinal de compra, e quando a linha MACD atravessa a linha de sinal de cima para baixo, gera um sinal de venda, aproveitando as flutuações de curto e médio prazo do preço.

Princípio da estratégia

O indicador central desta estratégia é o MACD oscilante, que é calculado pela linha rápida EMA (geralmente definida como a EMA de 12 dias) menos a linha lenta EMA (geralmente definida como a EMA de 26 dias). A linha rápida EMA é mais sensível e consegue capturar os movimentos de preços de curto prazo; a linha lenta EMA responde mais lentamente às mudanças de preços.

Esta estratégia define os parâmetros de entrada como comprimento de linha rápida, comprimento de linha lenta, fonte de preço e comprimento de linha de sinal. O ciclo de suavização pode ser ajustado de acordo com diferentes mercados para encontrar a melhor combinação de parâmetros. O bloco de cores de fundo mostra o intervalo de tempo de retorno.

Análise de vantagens

  1. Os indicadores MACD são clássicos e fáceis de entender, e podem ser usados para capturar oportunidades de inversão de curto e médio prazo.

  2. Um sistema MACD construído com duas EMAs tem melhor suavidade do que um sistema MA único.

  3. Os parâmetros podem ser ajustados e otimizados para diferentes mercados.

  4. Indicadores de massa combinados identificam sinais de alta qualidade.

Análise de Riscos

  1. Em situações de choque, o MACD produz mais sinais de erro.

  2. A falta de conhecimento sobre as tendências pode resultar em prejuízos.

  3. O limite de tempo de detecção pode ignorar situações extremas.

  4. A configuração dos parâmetros requer que a combinação de mais dados de mercado seja otimizada, ou pode ser um overfit de um segmento de mercado.

O risco pode ser controlado através da combinação de indicadores de avaliação de tendências e configuração de mecanismos de parada de perdas. Ao mesmo tempo, a ampliação do escopo de ressonância e o espaço de amostragem do mercado são otimizados para os parâmetros.

Direção de otimização

  1. Teste diferentes fontes de preços, como preço de fechamento, preço médio, preço de reposição, etc.

  2. Buscar a melhor combinação de parâmetros com base em mais dados históricos.

  3. Integrar outros indicadores para determinar a qualidade do sinal. Por exemplo, sinal de volume de tráfego.

  4. Combinação de tendências e julgamentos de bandas para evitar conflitos significativos com as tendências.

Resumir

Esta estratégia é uma estratégia clássica e prática de escolha do momento, através da construção de filtros duplos de EMA, capturando o fenômeno de inversão do ciclo de curta linha no preço. O risco pode ser controlado por meio de otimização de parâmetros, filtragem de sinal e paralisia. Ao mesmo tempo, combinando indicadores de julgamento de tendência, evitando o topo e o fundo, pode obter ganhos estáveis.

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

//@version=4
strategy(title="MACD Histogram Backtest", shorttitle="MACD")

// Getting inputs
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=false)

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

grow = (hist[1] < hist)
fall = (hist[1] > hist) and hist >= 0
stop = (hist[1] > hist)

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)

//Strategy Testing

// Component Code Start
// Example usage:
// if testPeriod()
//   strategy.entry("LE", strategy.long)
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(2, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

//Entry and Close settings
if testPeriod() 
    strategy.entry("grow", true, 10, when = grow, limit = close)
    strategy.close("grow", when = fall)
    strategy.close("grow", when = stop)
    
//if testPeriod() 
//   strategy.entry("fall", false, 1000, when = fall, limit = close)
//    strategy.close("fall", when = grow)