Estratégia de cruzamento de média móvel dupla

Autora:ChaoZhang, Data: 2023-12-11 15:21:58
Tags:

img

Resumo

A estratégia de cruzamento de média móvel dupla é uma estratégia de seguimento de tendência que usa o cruzamento de duas médias móveis de períodos diferentes como sinais de negociação.

Estratégia lógica

A estratégia emprega duas médias móveis: uma MA rápida com um período mais curto (por exemplo, 15 períodos) para capturar movimentos de preços de curto prazo e uma MA lenta com um período mais longo (por exemplo, 21 períodos) para identificar a direção da tendência principal.

Ao ajustar as combinações de períodos de MA, a estratégia pode ajustar o período de tempo das tendências para capturá-las.

A estratégia também incorpora módulos de gestão de risco, incluindo take profit, stop loss e trailing stop loss. Estes ajudam a limitar o lucro/perda máximo de negócios individuais e contêm o risco geral.

Vantagens

A estratégia de dupla MA tem as seguintes vantagens:

  1. Lógica simples e fácil de compreender/implementar;
  2. Flexibilidade para se adaptar às condições do mercado através da adaptação dos períodos de MA;
  3. Estabilidade decorrente de um menor número de sinais comerciais;
  4. Controle eficaz do risco através de stop losses;
  5. Facilidade de otimização em matéria de MA, parâmetros de risco, etc.

Riscos

Há também alguns riscos a considerar:

  1. Crossovers excessivos e frequência de negociação durante os mercados limitados a intervalos;
  2. Os MAs com atraso podem não atingir os pontos de inversão dos preços e não conseguirem deter as perdas a tempo;
  3. Vulnerabilidade a falhas que resultem em perdas desnecessárias;
  4. Inexatidão geral do acompanhamento dos preços devido ao atraso dos MAs.

Essas fraquezas podem ser aliviadas através de otimizações como sinais de filtragem, stop loss de trail, etc.

Oportunidades de melhoria

A estratégia pode ser reforçada em aspectos como:

  1. Adição de filtros de volume ou volatilidade para evitar batidas;
  2. Testar mais tipos de autorizações e períodos/fórmulas de ajuste para se adequarem a diferentes produtos e prazos;
  3. Examinar os tipos de MA como a EMA, a LWMA para o mais rápido acompanhamento dos preços;
  4. Automatização do ajuste MA e do dimensionamento das perdas de parada com aprendizagem de máquina;
  5. Técnicas alternativas de stop loss, por exemplo, gap, preço médio, lustre.

Espera-se um aumento significativo da taxa de ganhos e de rendimentos ajustados ao risco a partir destes aumentos.

Conclusão

Em geral, a estratégia de cruzamento de média móvel dupla oferece simplicidade, flexibilidade e riscos controláveis. Sua facilidade de implementação e otimização a torna uma estratégia de quantidade inicial ideal. Com testes e ajustes recorrentes, ela tem as credenciais para evoluir para um sistema robusto ao longo do tempo.


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Mais.