Canal de média móvel dupla com estratégia de acompanhamento da tendência

Autora:ChaoZhang, Data: 2023-11-06 15:41:23
Tags:

img

Resumo

Esta estratégia usa médias móveis rápidas e lentas para construir um sistema de trilhos duplos, combinado com o índice de tendência ADX para julgamento da tendência e o índice direcional DMI para determinar a direção da tendência, para rastrear a tendência depois que ela é estabelecida e sair a tempo quando a tendência se inverte, evitando perseguir tops e vender fundos.

Lógica de negociação

  1. As médias móveis rápidas e lentas constroem um sistema de canal de trilho duplo. Quando o MA rápido atravessa o MA lento, é um sinal de entrada de cruz de ouro por muito tempo. Quando o MA rápido atravessa abaixo do MA lento, é um sinal de saída de cruz de morte.

  2. O ADX avalia a existência e força de uma tendência. Quando o ADX está acima do nível chave, ele indica que uma tendência existe e é forte. Os sinais de negociação são gerados apenas quando a tendência é forte.

  3. O DI+ do DMI determina a direção da tendência. Quando o DI+ é positivo, indica uma tendência ascendente. Quando o DI+ é negativo, indica uma tendência descendente. Os sinais de negociação são gerados apenas quando a direção da tendência coincide.

  4. Os testes de intervalo de tempo testam a eficácia da estratégia em diferentes períodos de tempo para verificação.

Análise das vantagens

  1. O sistema de trilhos duplos filtra as fugas para evitar falsos sinais.

  2. O ADX evita negociações excessivas durante a consolidação, exigindo uma tendência.

  3. O DMI assegura que as transacções correspondem à direcção da tendência, evitando transacções contrárias à tendência.

  4. O teste de intervalo de tempo verifica os parâmetros e otimiza as configurações.

Análise de riscos

  1. Os canais podem formar armadilhas, que exigem paradas para evitar que as frangues sejam atacadas.

  2. Os atrasos do ADX podem perder oportunidades iniciais, exigindo um nível de chave mais baixo.

  3. Os atrasos de direção do DMI também podem perder as tendências iniciais, necessitando de períodos mais curtos.

  4. Os parâmetros poderão precisar de ajustamento em intervalos de tempo.

Optimização

  1. Teste combinações de parâmetros para encontrar as definições ideais.

  2. Adicionar filtros como Bandas de Bollinger para a qualidade do sinal.

  3. Incorporar stop loss para limitar as perdas.

  4. Optimize automaticamente os parâmetros com aprendizagem de máquina.

  5. Incorpore mais fatores como sentimentos e notícias.

Conclusão

Esta estratégia combina os pontos fortes das médias móveis, índices de tendência e índices direcionais para identificar e rastrear tendências. Ao verificar a validade dos parâmetros, é necessária uma otimização contínua para se adaptar a mais condições de mercado, ajustando parâmetros, adicionando paradas, sintetizando mais fatores, e assim por diante, para melhorar a robustez e a lucratividade.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 23:59:59
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author: codachang0726
strategy(title = "(S)MA+ADX+DI+time", shorttitle = "(S)MA+ADX+DI+time", overlay = true)

// === INPUT MA LENGTHS ===
fastMA    = input(defval = 7,   title = "FastMA",          minval = 1, step = 1)
slowMA    = input(defval = 14,   title = "SlowMA",          minval = 1, step = 1)

// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 9,    title = "From Month",      minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        minval = 1, maxval = 31)
thruYear  = input(defval = 2022, title = "Thru Year",       minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

// === MA LOGIC ===
crossOv   =  sma(close, fastMA) > sma(close, slowMA)     // true when fastMA over slowMA
crossUn   =  sma(close, fastMA) < sma(close, slowMA)     // true when fastMA under slowMA

// DI+ADX
adxlen      = input(14, title="ADX Smoothing")
dilen       = input(14, title="DI Period")
keyLevel    = input(20, title="Keylevel for ADX")
[diplus, diminus, adx] = dmi(dilen, adxlen)
di = (diplus - diminus)

buy = di > 0 and crossOv and adx > keyLevel
sell = di < 0 and crossUn and adx > keyLevel

buy_time = buy and not buy[1]
sell_time = sell and not sell[1]

// === EXECUTION ===
strategy.entry("L", strategy.long, when = window() and buy_time)    // enter long when "within window of time" AND crossover
strategy.close("L", when = window() and sell_time)                   // exit long when "within window of time" AND crossunder         

// === PLOTTING ===
bgcolor(color = showDate and window() ? color.gray : na, transp = 90)                                     // plot "within window of time"
plot(sma(close, fastMA), title = 'FastMA', color = color.yellow, linewidth = 2, style = plot.style_line)  // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.aqua,   linewidth = 2, style = plot.style_line)  // plot SlowMA


Mais.