Estratégia de tendência cruzada de média móvel dupla

Autora:ChaoZhang, Data: 2023-12-06 11:52:10
Tags:

img

Resumo

A estratégia de tendência de cruzamento de média móvel dupla é uma estratégia de negociação baseada em médias móveis. Ela usa o cruzamento de linhas EMA rápidas e SMA lentas como sinais de compra e venda, e combina a divergência do indicador MACD para filtrar sinais.

Princípio da estratégia

A estratégia usa duas médias móveis, EMA com duração de 200 dias e SMA com duração de 100 dias. Quando o preço quebra ambas as linhas para cima, um sinal de compra é gerado. Quando o preço quebra ambas as linhas para baixo, um sinal de venda é gerado. Isso pode efetivamente filtrar tendências oscilantes e pullbacks de curto prazo.

Para melhorar ainda mais a confiabilidade dos sinais, o indicador MACD também é introduzido. Quando o preço atravessa a EMA e SMA para formar um sinal, a linha rápida do MACD precisa atravessar a linha lenta de baixo, e o histograma do MACD precisa estar acima do eixo 0, para desencadear um sinal de compra real.

Além disso, o ponto de stop loss e take profit são definidos na estratégia. Após a estratégia abrir uma posição, o ponto de stop loss e take profit serão calculados e definidos de acordo com a porcentagem definida pelo usuário. Isso pode controlar efetivamente o risco de uma única negociação.

Em resumo, esta estratégia considera de forma abrangente múltiplos indicadores, estabelece condições de filtragem rigorosas para os sinais de compra e venda e adota stop loss e take profit para gerir os riscos, formando um sistema de negociação relativamente rigoroso e completo.

Análise das vantagens

A estratégia de tendência cruzada de média móvel dupla tem as seguintes vantagens:

  1. A combinação de múltiplos indicadores, a consideração abrangente do preço, da tendência e do ímpeto e a definição de condições de filtragem rigorosas para os sinais podem efetivamente evitar falsos sinais e melhorar a fiabilidade do sinal.

  2. O uso de duas médias móveis com parâmetros diferentes pode identificar melhor as tendências do mercado e filtrar os mercados oscilantes. A linha EMA rápida é usada para rastrear mudanças de preço em tempo hábil; a linha SMA lenta é usada para determinar tendências de longo prazo. A combinação das duas linhas funciona melhor.

  3. O indicador MACD introduz parâmetros personalizáveis que podem ser ajustados de acordo com as características de diferentes mercados e tem alta flexibilidade.

  4. A configuração de pontos de stop loss e take profit pode maximizar o controle sobre as perdas de negociação única e evitar perdas excessivas.

  5. Os parâmetros desta estratégia podem ser definidos de forma flexível e a estratégia pode ser ajustada com base nos resultados de otimização, o que é muito prático.

Análise de riscos

A estratégia de tendência de cruzamento de médias móveis duplas apresenta também alguns riscos, principalmente nos seguintes domínios:

  1. Quando o preço das ações mostra violentas flutuações, a EMA e a SMA podem cruzar falsamente por muitas vezes, resultando em abertura e fechamento frequentes de sinais de negociação.

  2. Os indicadores MACD podem ter falhas, especialmente no processo quando o impulso ainda não é claro.

  3. A posição e a proporção das configurações de stop loss têm uma grande influência nos resultados de lucro e perda. Se o stop loss for definido muito pequeno, há o risco de ser pego; se o stop loss for definido muito grande, a perda individual pode ser muito pesada. Isso requer testes suficientes para encontrar os parâmetros ideais.

  4. Como indicador de rastreamento de tendências, a eficácia da média móvel será descontada quando os preços revertem rapidamente.

As soluções correspondentes são as seguintes:

  1. Para mercados voláteis, ajustar adequadamente os parâmetros das médias móveis, utilizando EMAs e SMAs de parâmetros mais baixos para reduzir a frequência de cruzamento.

  2. Aumentar as condições de filtragem, tais como a ruptura do MACD acima e abaixo da linha zero, o que pode reduzir as falhas de ruptura até certo ponto.

  3. A definição da posição e da proporção de stop loss requer um backtesting e uma otimização suficientes para encontrar os parâmetros ideais.

  4. Os mecanismos podem ser criados para identificar reversões rápidas de preços.Quando reversões anormais são detectadas, podem ser tomadas medidas de emergência, como a redução de posições ou a suspensão de estratégias de negociação para controlar a exposição ao risco.

Orientações de otimização

A estratégia da dupla média móvel de tendência cruzada ainda pode ser melhorada, principalmente nos seguintes aspectos:

  1. Testar mais indicadores para combinação para encontrar melhores parâmetros, como a incorporação do canal BOLL e a consideração do impacto da volatilidade.

  2. Otimizar parâmetros de comprimentos médios móveis para encontrar a melhor combinação de parâmetros sob diferentes condições de mercado.

  3. Estabelecer estratégias de stop loss e lucro mais científicas e razoáveis, como a introdução de stop loss de trailing ou a definição de rácios dinâmicos de risco-recompensa com base em resultados estatísticos históricos.

  4. Estabelecer mecanismos para a identificação automática e resposta de emergência de reversões anormais de preços.

  5. Expandir variedades de negociação, como câmbio, criptomoedas e outras variedades. Teste a robustez dos parâmetros em diferentes variedades para expandir a aplicabilidade da estratégia.

  6. Otimizar as estratégias de gestão de capitais da estratégia, tais como negociação de valores fixos, relação de posição fixa, etc. Controlar o risco de perda de transações individuais, tornando a curva global de capital mais estável.

Conclusão

A estratégia de tendência de cruzamento de média móvel dupla considera de forma abrangente vários fatores. Ao gerar sinais de negociação, requer o apoio de vários indicadores, como preço, tendência e impulso, para garantir a confiabilidade do sinal. A estratégia também adota stop loss móvel e take profit para controlar efetivamente os riscos de negociações individuais. As configurações de parâmetros flexíveis da estratégia tornam-na altamente prática para negociação automatizada.

No entanto, nenhuma estratégia pode ser perfeita. Esta estratégia também encontrará algumas dificuldades na aplicação, como negociação freqüente, falhas, posicionamento de stop loss, etc. Para melhorar ainda mais a robustez e rentabilidade da estratégia, é necessário fazer esforços em muitos aspectos, incluindo a otimização de portfólios de parâmetros, a introdução de novos indicadores técnicos, a melhoria do mecanismo de stop loss, e assim por diante.

Em resumo, a Estratégia de Tendência de Crossover de Média Móvel Dupla forma um sistema de negociação relativamente completo e rigoroso. Através da otimização e melhoria contínua em futuras pesquisas e aplicações, a estratégia tem o potencial de alcançar maior valor prático.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Hi,
// This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript
// The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal
// If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal
// I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday

// If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can

// I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy
strategy("MACD Crossover Trend Strategy Template", overlay = true )

// Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs
fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values")
slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values")
src = input(title = "Source", type = input.source, defval = close, group = "MACD Values")
signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values")
sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values")
sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values")
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
emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages")
smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages")

// Input backtest range, you can adjust this here or in the input options
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear  = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear  = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")

// Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages
ema = ema(close, emaLength)
sma = sma(close, smaLength)
profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01

// Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs
// (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed)
// If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
long = close > ema and close > sma and inDataRange
short = close < ema and close < sma and inDataRange

// Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code
// I want a way to filter out weak signals that are ranging around the zero point of the histogram. 
// So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000
// I could probably use a cofficiency or something, but that's beyond my grasp at the moment
// Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback
if (crossover(macd, signal) and macd > 0)
    strategy.entry("Long", long = strategy.long,
     comment = "Long Buy",
     when = long)

strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick)


if (crossunder(macd, signal) and macd < 0)
    strategy.entry("Short", long = strategy.short,
     comment = "Short Buy",
     when = short)

strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick)

// To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates
if (not inDataRange)
    strategy.close_all()

// plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Mais.