Estrategia de negociación de criptomonedas basada en el MACD

El autor:¿ Qué pasa?, Fecha: 2023-09-19 11:21:42
Las etiquetas:

Resumen general

Esta estrategia utiliza los indicadores de Divergencia de Convergencia de la Media Móvil (MACD) e Índice de Fuerza Relativa (RSI) para identificar las señales de negociación de las criptomonedas.

Estrategia lógica

  1. Calcular la EMA de 12 días y la EMA de 26 días como promedios móviles a corto y a largo plazo.

  2. Calcular la diferencia entre las EMA cortas y largas como el histograma MACD.

  3. Calcular la EMA de 9 días del MACD como la línea de señal.

  4. Calcule el RSI de 14 días para juzgar los niveles de sobrecompra / sobreventa.

  5. Muestra la señal de compra cuando el MACD cruza por encima de la línea de señal y el RSI es mayor que 81.

  6. Muestra la señal de venta cuando el MACD cruza por debajo de la línea de señal y el RSI es inferior a 27.

  7. Utilice el módulo de estrategia incorporado para las entradas y salidas.

Análisis de ventajas

  1. El MACD puede identificar tendencias y cambios, el RSI muestra niveles de sobrecompra/sobreventa.

  2. El MACD por encima/por debajo de la línea cero indica la dirección/fortaleza de la tendencia a corto y largo plazo.

  3. RSI en niveles altos/bajos indica posible sobrecalentamiento/sobreventa. Ayuda a encontrar señales comerciales.

  4. Se trata de señales comerciales claras y sencillas, fáciles de ejecutar sistemáticamente.

  5. Parámetros personalizables para su optimización y adaptación a las diferentes condiciones del mercado.

Análisis de riesgos

  1. Los datos del MACD y del RSI, propensos a fallas y anomalías, pueden generar señales incorrectas.

  2. Los parámetros fijos pueden no adaptarse a la evolución de los mercados, necesita optimización.

  3. Las señales pueden retrasarse, incapaces de operar en los puntos de inflexión.

  4. Solo largo/cortes, sin poder sacar provecho de mercados variados.

Direcciones de optimización

  1. Prueba diferentes combinaciones de parámetros para encontrar los ajustes óptimos.

  2. Añadir filtros para evitar operaciones falsas de ruptura.

  3. Añadir stop loss para limitar las pérdidas en los mercados unilaterales.

  4. Gestionar el tamaño de las posiciones, el aumento de las tendencias y la disminución de los rangos.

  5. Combine con otros indicadores para obtener señales más precisas.

  6. Prueba con diferentes instrumentos y plazos.

Resumen de las actividades

Esta estrategia utiliza las fortalezas complementarias de MACD y RSI para identificar tendencias y señales comerciales. Los parámetros de ajuste fino y la adición de filtros pueden mejorar la robustez y la rentabilidad. Ajustar las paradas y el tamaño de la posición también ayuda a maximizar las ganancias y minimizar el riesgo.


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

Más.