Estratégia de acompanhamento da tendência de dupla MA

Autora:ChaoZhang, Data: 2023-12-21 16:10:22
Tags:

img

Resumo

Esta estratégia adota o método típico de acompanhamento da tendência de cruzamento de médias móveis duplas, combinado com mecanismos de gestão de risco, tais como stop loss, take profit e trailing stop loss, visando captar grandes lucros dos mercados em tendência.

Estratégia lógica

  1. Calcular a EMA de n dias como linha rápida a curto prazo;
  2. Calcular a EMA de m dias como a linha lenta a longo prazo;
  3. Vai longo quando a linha rápida atravessa a linha lenta para cima, e vai curto quando quebra para baixo;
  4. sinal de saída: cruzamento reverso (por exemplo, saída longa quando ocorre cruzamento longo).
  5. Use stop loss, take profit, trailing stop loss para gerir os riscos.

Análise das vantagens

  1. A adopção de linhas EMA duplas pode determinar melhor os pontos de inversão da tendência de preços e captar os movimentos da tendência.
  2. A combinação de stop loss, take profit e trailing stop ajuda a limitar a perda de uma única transação, bloquear os lucros e reduzir o drawdown.
  3. Existem muitos parâmetros personalizáveis para ajustar e otimizar para diferentes produtos e ambientes de mercado.
  4. A lógica estratégica é simples e clara, fácil de compreender e modificar.
  5. Apoiar operações de curta e longa duração, adaptáveis às diferentes condições de mercado.

Análise de riscos

  1. As estratégias de dupla MA são muito sensíveis a falsas fugas e propensas a ficarem presas.
  2. A configuração inadequada dos parâmetros pode conduzir a negociações frequentes, aumento dos custos de negociação e perdas por deslizamento.
  3. A estratégia em si não pode determinar pontos de inversão da tendência, deve ser combinada com outros indicadores.
  4. É fácil gerar sinais de negociação em mercados variados, mas a rentabilidade real tende a ser baixa.
  5. Os parâmetros devem ser otimizados para diferentes produtos e ambientes de mercado.

Os riscos podem ser reduzidos:

  1. Filtrar sinais falsos com outros indicadores.
  2. Otimizar os parâmetros para reduzir a frequência de negociação.
  3. Adição de indicadores de tendência para evitar transações de mercado de intervalo.
  4. Ajustar o tamanho das posições para reduzir os riscos do comércio único.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Otimizar os períodos de MA rápidos e lentos para diferentes produtos e mercados.
  2. Adicionar outros indicadores para determinar tendências e filtrar sinais falsos, por exemplo MACD, KDJ, etc.
  3. Considerar a substituição da EMA por SMA ou WMA.
  4. Ajustar dinamicamente a perda de parada com base no ATR.
  5. Ajustar de forma flexível os tamanhos de posições individuais com base na metodologia de dimensionamento das posições.
  6. Optimização auto-adaptativa de parâmetros baseada em métricas de correlação e volatilidade.

Resumo

Em resumo, esta é uma estratégia típica de rastreamento de tendências de crossover dual EMA. Ela tem a vantagem de capturar movimentos de tendências, integrados com mecanismos de gerenciamento de risco como stop loss, take profit e trailing stop loss. Mas também tem algumas fraquezas típicas, como alta sensibilidade ao ruído e mercados de faixa, propensos a serem presos. Mais melhorias podem ser feitas introduzindo indicadores adicionais, otimização de parâmetros, ajustes dinâmicos e uso do portfólio para melhorar o desempenho da estratégia.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY RISK MANAGEMENT CODE IMPLEMENTATION ***

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => not tradeDirection[1] and tradeDirection // functions can be used to wrap up and work out complex conditions
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out
// === STRATEGY - SHORT POSITION EXECUTION ===
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 RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Mais.