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


Data de criação: 2023-12-06 11:52:10 última modificação: 2023-12-06 11:52:20
cópia: 0 Cliques: 741
1
focar em
1619
Seguidores

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

Visão geral

A estratégia de tendência de cruzamento de duas equações é uma estratégia de negociação baseada em médias móveis. Utiliza o cruzamento de EMAs de linha rápida e SMAs de linha lenta como sinais de compra e venda, e combina o desvio do indicador MACD para filtrar os sinais. A estratégia considera simultaneamente vários fatores, como preço, tendência e dinâmica, formando um sistema de negociação relativamente completo.

Princípio da estratégia

A estratégia usa duas médias móveis, a EMA e a SMA. A EMA tem 200 dias de duração e a SMA tem 100 dias de duração. O aumento dos preços gera um sinal de compra quando os preços atravessam as duas médias; o declínio dos preços gera um sinal de venda quando os preços atravessam as duas médias.

Para aumentar ainda mais a confiabilidade do sinal, a estratégia também introduziu o indicador MACD. Quando o preço quebra a EMA e a SMA formam um sinal, a linha rápida do MACD é necessária para quebrar a linha lenta de baixo e o MACD está acima do eixo 0 para desencadear um verdadeiro sinal de compra.

Além disso, a estratégia também define um stop loss e um stop loss. Após a abertura da estratégia, o stop loss e o stop loss são calculados e definidos de acordo com a proporção definida pelo usuário. Isso permite controlar efetivamente o risco de uma única transação.

Em geral, a estratégia integra vários indicadores, estabelece condições de filtragem rigorosas para os sinais de compra e venda e administra o risco de stop loss para criar um sistema de negociação relativamente rigoroso e completo.

Análise de vantagens

A estratégia de tendência de dupla equilíbrio tem as seguintes vantagens:

  1. A combinação de múltiplos indicadores, considerando o preço, a tendência e a dinâmica, estabelece condições rigorosas de filtragem do sinal, o que pode evitar sinais falsos e aumentar a confiabilidade do sinal.

  2. A utilização de duas médias móveis com diferentes parâmetros permite uma melhor identificação das tendências do mercado e filtra os movimentos de turbulência. As linhas EMA rápidas são usadas para acompanhar as mudanças de preços em tempo real; As linhas SMA lentas são usadas para determinar tendências de longo prazo.

  3. A introdução do MACD permite a configuração de parâmetros, que podem ser ajustados de acordo com as características de diferentes mercados, com alta flexibilidade. A configuração do MACD garante que os sinais de negociação recebam suporte de preços, tendências e dinâmicas ao mesmo tempo, o que tem um forte valor de aplicação.

  4. Configurar um ponto de parada para controlar o máximo de perdas em uma única transação, evitando SIZE_MATHFUNC Risco de perdas individuais excessiva. A configuração de um limite razoável pode bloquear parte dos lucros, reduzindo a exposição ao risco de mercado após o lucro.

  5. Os parâmetros da estratégia podem ser configurados de forma flexível e podem ser ajustados à estratégia de acordo com os resultados da otimização, sendo muito prático. Há muito espaço para a otimização de testes em diferentes mercados e parâmetros.

Análise de Riscos

A estratégia de tendência de dupla equilíbrio também apresenta alguns riscos, principalmente nos seguintes aspectos:

  1. Quando os preços das ações mostram uma forte oscilação, a EMA e a SMA podem ter várias cruzamentos errôneos, resultando em frequentes aberturas e fechamentos de sinais de negociação. Isso aumentará a frequência de negociação e os gastos com taxas.

  2. O indicador MACD pode ter falsas rupturas, especialmente durante o momento em que a oscilação ainda não é clara. Nesse caso, o sinal também não é confiável e pode causar perdas desnecessárias.

  3. A localização e proporção da configuração de stop loss tem um grande impacto no resultado do lucro. Se a configuração de stop loss for muito pequena, há risco de cobertura; e se a configuração de stop loss for muito grande, a perda individual pode ser excessiva. Isso requer testes adequados para encontrar o melhor parâmetro.

  4. A média móvel é um indicador de tendência, e sua utilidade é reduzida quando os preços se revertem rapidamente. A estratégia pode não chegar ao ponto de parada e ser atingida pela reversão de preços, causando grandes perdas.

A solução é a seguinte:

  1. Para situações de forte oscilação, os parâmetros da média móvel podem ser ajustados de forma apropriada, usando EMA e SMA de baixos parâmetros, reduzindo o número de cruzamentos.

  2. A adição de condições de filtragem de rupturas acima e abaixo do eixo zero do MACD pode reduzir as falsas rupturas em certa medida. Também pode ser considerado a inclusão de outros indicadores para a combinação, como KDJ, BOLL, etc.

  3. As configurações de posições e proporções de stop loss precisam de ser bem testadas e otimizadas para encontrar os parâmetros ótimos. Com base nisso, o monitoramento contínuo e o ajuste dinâmico também devem ser considerados.

  4. Pode-se configurar um mecanismo de identificação de reversões rápidas de preços. Quando uma reversão anormal é detectada, tomar medidas de emergência para reduzir a posição ou suspender a estratégia de negociação para controlar a abertura de risco.

Direção de otimização

A estratégia de duplo equilíbrio de tendências cruzadas tem espaço para uma maior otimização, concentrando-se nas seguintes áreas:

  1. Teste mais indicadores para combiná-los, procurando parâmetros mais apropriados. Por exemplo, introduza o canal BOLL, considere os efeitos da taxa de flutuação, etc.

  2. Optimizar os parâmetros de comprimento das médias móveis para encontrar a melhor combinação de parâmetros em diferentes condições de mercado. Optimizar os parâmetros de rolagem também é uma opção.

  3. Estabelecer estratégias de stop loss de forma mais científica e racional, como a introdução de stop loss de rastreamento ou a definição de proporções de risco-retorno dinâmicas com base em resultados estatísticos históricos, pode aumentar ainda mais a estabilidade da estratégia.

  4. Estabelecer mecanismos de identificação automática e de emergência para a inversão anormal dos preços. Em situações extremas, reduzir ativamente as posições ou suspender a estratégia para evitar grandes perdas.

  5. Extensão de variedades de negociação, como divisas, moedas digitais e outras variedades. Teste a robustez dos parâmetros de diferentes variedades, ampliando o alcance da aplicação da estratégia.

  6. Estratégias de gerenciamento de fundos para otimizar a estratégia, como negociação de quantidade, proporção de posição fixa, etc. Controlar o risco de perda individual, para que a curva de fundos geral seja mais plana.

Resumir

A estratégia de tendência de cruzamento de dupla linha integral considera múltiplos fatores, requer o suporte de vários indicadores de preço, tendência e dinâmica ao emitir um sinal de negociação, garantindo assim a confiabilidade do sinal. A estratégia também usa um stop loss stop, que pode controlar efetivamente o risco de negociação individual. A configuração dos parâmetros da estratégia é flexível, prática e adequada para negociação automatizada.

No entanto, nenhuma estratégia pode ser perfeita. Esta estratégia também pode ter algumas dificuldades na aplicação, como negociações frequentes, falsas brechas e configuração de posições de parada. Isso requer que trabalhemos em vários aspectos, desde a otimização do conjunto de parâmetros, a introdução de um novo conjunto de indicadores técnicos e a melhoria do mecanismo de parada, para aumentar ainda mais a robustez e a lucratividade da estratégia.

Em geral, a estratégia de tendência de cruzamento de duas eqüilíbrias forma um sistema de negociação relativamente completo e rigoroso. Em estudos e aplicações posteriores, a estratégia pode ter maior valor de batalha real com otimização e melhoria contínuas.

Código-fonte da estratégia
/*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)