Estratégia de negociação de criptomoedas baseada em MACD


Data de criação: 2023-09-19 11:21:42 última modificação: 2023-09-19 11:21:42
cópia: 0 Cliques: 759
1
focar em
1617
Seguidores

Visão geral

Esta estratégia é baseada em uma média móvel agregada de diferença de preço (MACD) e um índice de força relativa (RSI) para julgar os pontos de venda e venda de criptomoedas. Ela fornece sinais para decisões de negociação, calculando o diferencial entre as médias móveis de curto e longo prazo, combinadas com o RSI para julgar a tendência do mercado e os casos de sobrevenda e sobrecompra.

Princípio da estratégia

  1. Calculação da EMA de 12 dias e da EMA de 26 dias como médias móveis de curto e longo prazo, respectivamente

  2. Calculação da diferença entre EMAs de curto e longo prazo, como um gráfico MACD

  3. Calculando a EMA de 9 dias do MACD como linha de sinal

  4. Calcule o RSI de 14 dias para determinar a tendência de sobrecompra e sobrevenda

  5. Quando o MACD atravessa a linha de sinal e o RSI é maior que 81, mostra um sinal de compra

  6. Quando o MACD atravessa a linha de sinal e o RSI é menor que 27, mostra um sinal de venda

  7. Entradas e saídas com o módulo de estratégia embutido

Análise de vantagens

  1. O indicador MACD pode identificar tendências e mudanças de tendência, o indicador RSI pode mostrar sobrecompra e sobrevenda, e a combinação pode melhorar a precisão do sinal de negociação

  2. Os movimentos acima e abaixo do eixo zero do MACD representam a direção e a intensidade das mudanças nas tendências de curto e longo prazo, fornecendo uma base para determinar a direção do mercado

  3. A região alta do RSI representa a possibilidade de superaquecimento e sobrecompra, enquanto a baixa representa a possibilidade de sobrevenda, fornecendo uma base para a busca de pontos de venda e compra

  4. Os sinais de negociação são simples e claros, facilitando a execução de operações de acordo com as regras.

  5. Parâmetros configuráveis para otimização e adaptação a diferentes cenários de mercado

Análise de Riscos

  1. Os dados baseados no MACD e no RSI são vulneráveis a falhas e anomalias, podendo emitir sinais errados

  2. Parâmetros fixos podem não se adaptar às mudanças do mercado e precisam ser otimizados

  3. Os sinais de compra e venda podem estar atrasados e não permitir a compra e venda no ponto de viragem.

  4. A posição com apenas dois vagos não pode ser aproveitada para lucrar com a crise.

Direção de otimização

  1. Teste diferentes combinações de parâmetros para encontrar o melhor

  2. Adição de condições de filtragem para evitar falsas brechas

  3. Aumentar as estratégias de suspensão de perdas e reduzir os prejuízos das negociações unilaterais

  4. Aumentar a gestão de posições, aumentar as posições durante a tendência e diminuir as posições durante a turbulência

  5. Em combinação com outros indicadores, procura por pontos de venda mais precisos

  6. Testes em diferentes variedades e períodos de tempo

Resumir

A estratégia utiliza as vantagens complementares dos dois indicadores MACD e RSI para identificar a direção da tendência e os pontos de venda e venda. A estabilidade e o fator de lucro da estratégia podem ser melhorados através da otimização dos parâmetros e do aumento das condições de filtragem. O ajuste apropriado do stop loss e da gestão de posições também ajuda a aumentar os níveis de lucro e reduzir o risco.

Código-fonte da estratégia
/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 04:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Revision:        5
// Author:          @Hugo_Moriceau
//study("Thesis_EMLYON_Withdate-strategies-Daily_Crypto_Moriceau_indicator",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Daily_Crypto_Moriceau_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)



tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
aboveBelow = fastMA >= slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === Plot Setting ===

//plot(fastMA,color=red)
//plot(slowMA,color=blue)
//barcolor(color=iff(fastMA > slowMA, yellow, na))
//barcolor(color=iff(fastMA < slowMA, black, na))
barcolor(color=iff(macd > 0.12*close , fuchsia, na))
barcolor(color=iff(macd < -0.1*close , lime, na))
dataS= macd > 0.125 and rsi>81 and fastMA > slowMA
dataB= macd < -0.1  and rsi<27 and fastMA< slowMA


plotchar(dataB, char='B',color=black,size = size.tiny,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.tiny,location = location.abovebar,transp= 0)


// === BACKTEST RANGE ===
FromMonth = input(defval = 01, title = "From Month", minval = 1)
FromDay   = input(defval = 01, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year", minval = 2014)
ToMonth   = input(defval = 2, title = "To Month", minval = 1)
ToDay     = input(defval = 10, title = "To Day", minval = 1)
ToYear    = input(defval = 2019, title = "To Year", minval = 2018)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 20000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 1500, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 100, 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


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
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)