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

Autora:ChaoZhang, Data: 2023-09-19 11:21:42
Tags:

Resumo

Esta estratégia usa os indicadores Moving Average Convergence Divergence (MACD) e Relative Strength Index (RSI) para identificar sinais de negociação para criptomoedas.

Estratégia lógica

  1. Calcular a EMA de 12 dias e a EMA de 26 dias como médias móveis de curto e longo prazo.

  2. Calcular a diferença entre as EMAs curtas e longas como histograma MACD.

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

  4. Calcule o RSI de 14 dias para julgar os níveis de sobrecompra/supervenda.

  5. Display buy signal quando o MACD cruza acima da linha de sinal e o RSI é superior a 81.

  6. Apresenta sinal de venda quando o MACD cruza abaixo da linha de sinal e o RSI é inferior a 27.

  7. Utilize o módulo de estratégia incorporado para entradas e saídas.

Análise das vantagens

  1. O MACD pode identificar tendências e mudanças, o RSI mostra níveis de sobrecompra/supervenda.

  2. O MACD acima/abaixo da linha zero indica a direção/força da tendência a curto prazo versus a longo prazo.

  3. RSI em níveis altos/baixos indica possível superaquecimento/supervenda.

  4. Sinais de negociação claros e simples, fáceis de executar sistematicamente.

  5. Parâmetros personalizáveis para otimização e adaptação às diferentes condições do mercado.

Análise de riscos

  1. Os dados MACD e RSI propensos a falhas e anomalias podem gerar sinais incorretos.

  2. Os parâmetros fixos podem não se adaptar à evolução dos mercados e necessitam de otimização.

  3. Os sinais podem demorar, incapazes de negociar em pontos de virada.

  4. Apenas longo/curto, incapaz de lucrar com mercados variados.

Orientações de otimização

  1. Teste diferentes combinações de parâmetros para encontrar configurações ótimas.

  2. Adicione filtros para evitar falsos negócios de fuga.

  3. Adicionar stop loss para limitar as perdas em mercados unilaterais.

  4. Gerenciar o tamanho das posições, o aumento das tendências e a diminuição dos intervalos.

  5. Combinar com outros indicadores para sinais mais precisos.

  6. Teste em diferentes instrumentos e prazos.

Resumo

Esta estratégia utiliza as forças complementares do MACD e RSI para identificar tendências e sinais de negociação. Parâmetros de ajuste fino e adição de filtros podem melhorar a robustez e lucratividade. Ajustar paradas e dimensionamento de posição também ajuda a maximizar lucros e minimizar riscos. Os prós e contras do MACD e do RSI tornam esta estratégia mais adequada para capturar tendências de médio a longo prazo em vez de negociações de curto prazo.


/*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)

Mais.