Estrategia de negociación corta larga basada en el MACD y el RSI

El autor:¿ Qué pasa?, Fecha: 2023-10-09 15:33:17
Las etiquetas:

Resumen general

Esta estrategia combina los indicadores MACD y RSI para realizar operaciones largas y cortas simultáneamente, con el fin de obtener rendimientos excedentes en situaciones de tendencia poco claras.

Estrategia lógica

  1. Calcular la EMA rápida (12 días) y la EMA lenta (26 días)
  2. Calcular la divergencia de convergencia MACD (EMA rápida menos EMA lenta)
  3. Calcular la media móvil de 9 días del MACD como línea de señal
  4. Calcular el RSI de 14 días
  5. Venga largo cuando el MACD<-0,1, el RSI<27 y la EMA rápida estén por debajo de la EMA lenta
  6. Se realizará una operación corta cuando el MACD>0,125, el RSI>81 y la EMA rápida estén por encima de la EMA lenta
  7. Utilizar tomar ganancias, stop loss, trailing stop loss para gestionar las posiciones

Análisis de ventajas

  1. Ir tanto a largo como a corto puede generar rendimientos excesivos en mercados no de tendencia
  2. La combinación del indicador de tendencia EMA y el indicador de inversión RSI mejora la calidad de la señal
  3. El uso del stop loss para bloquear las ganancias controla eficazmente el riesgo de pérdida

Análisis de riesgos

  1. El comercio en ambos sentidos requiere más capital para respaldar los requisitos de margen
  2. Los precios pueden alcanzar el stop loss tanto en posiciones largas como en posiciones cortas cuando se invierten bruscamente
  3. La configuración incorrecta de los parámetros puede causar una sobrecomercialización

Soluciones de riesgos:

  1. Capital suficiente para apoyar el tamaño de las posiciones
  2. Distancia razonable de pérdida de parada para evitar paradas atestadas
  3. Optimizar los parámetros para reducir la frecuencia de las operaciones

Direcciones de optimización

  1. Considerar la combinación de indicadores de volatilidad para mejorar el calendario de entrada
  2. Prueba diferentes combinaciones de parámetros para encontrar el óptimo
  3. Optimizar la estrategia de stop loss en función de las condiciones del mercado, como el trailing stop loss
  4. Utilice algoritmos de aprendizaje automático para optimizar los parámetros

Resumen de las actividades

Esta estrategia implementa el comercio bidireccional con la combinación de MACD y RSI. El uso de stop loss para bloquear las ganancias puede generar rendimientos excedentes en mercados no de tendencia. La estrategia puede optimizarse aún más en parámetros, estrategias de stop loss, etc. para obtener rendimientos excedentes más consistentes.


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

//@version=3
// Revision:        290
// Author:          @Hugo_Moriceau
//study("Moriceau_Crypto_strategies_Long_short_indicator_thesis",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Moriceau_Crypto_strategies_Long_short_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)

dataB = macd < -0.1  and rsi<27 and fastMA < slowMA
// data1 = macd > 0.125  and rsi>81 and fastMA> slowMA
dataS = macd > 0.125 and rsi > 81 and fastMA > slowMA

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

// === LOGIC ===

// is fast ma above slow ma?
Achat = macd < -0.1  and rsi < 27 and fastMA < slowMA ? true : false
vente = macd > 0.125 and rsi > 81 and fastMA > slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = vente ? Achat ? false : true : Achat ? 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))
plotchar(dataB, char='B',color=black,size = size.auto,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.auto,location = location.abovebar,transp= 0)

//fast = plot(maFast, title = "FastMA", color = yellow, linewidth = 2, style = line, transp = 50)
//slow = plot(maSlow, title = "SlowMA", color = black, linewidth = 2, style = line, transp = 50)

// === BACKTEST RANGE ===
FromMonth = input(defval = 05, title = "From Month", minval = 1)
FromDay   = input(defval = 23, title = "From Day", minval = 1)
FromYear  = input(defval = 2021, title = "From Year", minval = 2017)
ToMonth   = input(defval = 5, title = "To Month", minval = 1)
ToDay     = input(defval = 25, title = "To Day", minval = 1)
ToYear    = input(defval = 2021, title = "To Year", minval = 2017)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 2500, title = "Take Profit", minval = 28)
inpStopLoss     = input(defval = 600, title = "Stop Loss", minval = 15)
inpTrailStop    = input(defval = 300, title = "Trailing Stop Loss", minval = 5)
inpTrailOffset  = input(defval = 50, title = "Trailing Stop Loss Offset", minval = 1)

// === 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 = "Achat", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "TP 50% Sell", 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 = "Vente", long = false, when = enterShort())
strategy.close(id = "Vente", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Vente", from_entry = "Vente", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Short", from_entry = "Achat", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Más.