Triple exponencial promedio móvil de convergencia Divergencia e índice de fortaleza relativa Combinado Gráfico de 1 minuto Estrategia de negociación cuantitativa de criptomonedas

El autor:¿ Qué pasa?, Fecha: 2024-03-29 11:16:10
Las etiquetas:

img

Resumen general

Esta estrategia combina los métodos Triple Exponential Moving Average Convergence Divergence (Triple MACD) y Relative Strength Index (RSI), diseñados específicamente para el comercio cuantitativo en el mercado de criptomonedas en un marco de tiempo de 1 minuto. La idea principal detrás de la estrategia es capturar los cambios en el impulso alcista y bajista utilizando indicadores MACD con diferentes parámetros de período, mientras emplea el indicador RSI para confirmar la fuerza de la tendencia. Mediando las tres señales MACD, el ruido puede ser suavizado de manera efectiva, mejorando la confiabilidad de las señales comerciales. Además, la estrategia utiliza técnicas de regresión lineal para identificar fases de consolidación en el mercado, evitando operaciones frecuentes durante la acción de precios.

Principios de estrategia

La estrategia emplea tres indicadores MACD con diferentes parámetros: períodos de línea rápida de 5/13/34 y períodos de línea lenta de 8/21/144. Cálcula la diferencia entre ellos para obtener los valores MACD. Estos tres valores MACD se promedian, y el histograma MACD final se deriva restando el valor de la señal (EMA de período N de MACD) del MACD promedio. Simultáneamente, se calcula un indicador RSI de 14 períodos para ayudar a determinar la fuerza de la tendencia. Se genera una señal larga cuando el histograma MACD promedio cambia de negativo a positivo, el RSI está por debajo de 55, y hay una alineación alcista. Por el contrario, se activa una señal cercana cuando el histograma MACD promedio cambia de positivo a negativo, el RSI está por encima de 45, y hay una estrategia de alineación bajista. Además, se aplica una línea de regresión de 11 períodos para identificar las sombras del candelero, que se ajusta a la longitud de los cuerpos de los mercados, analizando la relación entre la longitud y la sombra del candelero

Análisis de ventajas

  1. La combinación de indicadores MACD de varios períodos refleja objetivamente los cambios de tendencia en el mercado en diferentes escalas de tiempo, lo que mejora la precisión de la identificación de tendencias.
  2. La integración del MACD con el indicador RSI forma condiciones estrictas de entrada y salida, lo que contribuye a mejorar la rentabilidad de la estrategia y el control de la extracción.
  3. El promedio de las señales MACD elimina efectivamente las señales falsas causadas por frecuentes oscilaciones del indicador, lo que hace que las señales comerciales sean más confiables.
  4. Utilizando la regresión lineal para determinar los mercados variados ayuda a evitar entrar en operaciones durante los mercados oscilantes cuando la tendencia no es clara, reduciendo las operaciones perdedoras.
  5. En el mercado de las criptomonedas que cambia rápidamente, una estrategia de negociación cuantitativa de un minuto está mejor posicionada para captar oportunamente las oportunidades de negociación derivadas de las fluctuaciones del mercado.

Análisis de riesgos

  1. Si el mercado permanece en un estado de oscilación de amplio alcance durante un período prolongado, las señales comerciales a menudo pueden volverse inválidas.
  2. Debido a la alta volatilidad del mercado de las criptomonedas, las fluctuaciones anormales extremas a corto plazo pueden dar lugar a reducciones significativas.
  3. La selección de los parámetros de la estrategia tiene un claro impacto en la rentabilidad general. La configuración incorrecta de los parámetros puede causar el fracaso de la estrategia. Por lo tanto, es necesaria una optimización suficiente de los parámetros y una verificación de backtesting para diferentes instrumentos de negociación antes de la negociación en vivo.

Direcciones de optimización

  1. Considere la posibilidad de introducir indicadores relacionados con la volatilidad de los precios, como el ATR, para filtrar las señales de entrada y reducir las posibles pérdidas causadas por fluctuaciones anormales del mercado.
  2. Además de la regresión lineal, se pueden explorar otros métodos, como los niveles de soporte y resistencia, los canales de bandas de Bollinger, etc., para mejorar aún más la precisión de la identificación de mercados de rango.
  3. En los mercados de tendencia, introduzca el stop-loss para optimizar los puntos de salida, maximizando la ganancia de cada operación.
  4. Teniendo en cuenta las diferencias características entre los distintos instrumentos de negociación, establecer diferentes parámetros de estrategia para los distintos instrumentos para mejorar la adaptabilidad y la estabilidad de la estrategia general.

Resumen de las actividades

Esta estrategia combina hábilmente el Triple MACD con el indicador RSI y utiliza técnicas de regresión lineal para identificar mercados de rango, formando un conjunto completo de estrategias de negociación cuantitativas de alta frecuencia. Las estrictas condiciones de entrada y salida y la aplicación de señales MACD promediadas contribuyen a mejorar la precisión de negociación y el control de caída. Aunque la estrategia tiene un mejor rendimiento en mercados de tendencia unidireccionales, medidas como la introducción de filtros de volatilidad, la optimización de métodos de identificación de mercado de rango, el establecimiento de parámetros de stop-loss y el establecimiento de parámetros independientes para diferentes instrumentos pueden mejorar aún más la adaptabilidad y robustez de la estrategia. En general, esta es una estrategia de negociación cuantitativa de criptomonedas muy prometedora que merece una mayor optimización y aplicación de negociación en vivo.


/*backtest
start: 2023-03-23 00:00:00
end: 2024-03-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="TrippleMACD", shorttitle="TrippleMACD + RSI strategy", format=format.price, precision=4, overlay=true)

// RSI 
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
showDivergence = input.bool(false, title="Show Divergence", group="RSI Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)

// Divergence
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

plFound = na(ta.pivotlow(rsi, lookbackLeft, lookbackRight)) ? false : true
phFound = na(ta.pivothigh(rsi, lookbackLeft, lookbackRight)) ? false : true
_inRange(cond) =>
	bars = ta.barssince(cond == true)
	rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish
// rsi: Higher Low

rsiHL = rsi[lookbackRight] > ta.valuewhen(plFound, rsi[lookbackRight], 1) and _inRange(plFound[1])

// Price: Lower Low

priceLL = low[lookbackRight] < ta.valuewhen(plFound, low[lookbackRight], 1)
bullCondAlert = priceLL and rsiHL and plFound
bullCond = showDivergence and bullCondAlert

// rsi: Lower High

rsiLH = rsi[lookbackRight] < ta.valuewhen(phFound, rsi[lookbackRight], 1) and _inRange(phFound[1])

// Price: Higher High

priceHH = high[lookbackRight] > ta.valuewhen(phFound, high[lookbackRight], 1)

bearCondAlert = priceHH and rsiLH and phFound
bearCond = showDivergence and bearCondAlert

// Getting inputs
stopLuse          = input(1.040)
fast_length = input(title = "Fast Length", defval = 5)
slow_length = input(title = "Slow Length", defval = 8)
fast_length2 = input(title = "Fast Length2", defval = 13)
slow_length2 = input(title = "Slow Length2", defval = 21)
fast_length3 = input(title = "Fast Length3", defval = 34)
slow_length3 = input(title = "Slow Length3", defval = 144)
fast_length4 = input(title = "Fast Length3", defval = 68)
slow_length4 = input(title = "Slow Length3", defval = 288)
src = input(title = "Source", defval = close)
signal_length2 = input.int(title="Signal Smoothing", minval = 1, maxval = 200, defval = 11)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

fast_ma2 = sma_source == "SMA2" ? ta.sma(src, fast_length2) : ta.ema(src, fast_length2)
slow_ma2 = sma_source == "SMA2" ? ta.sma(src, slow_length2) : ta.ema(src, slow_length2)

fast_ma3 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma3 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)

fast_ma4 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma4 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)

macd = fast_ma - slow_ma
macd2 = fast_ma2 - slow_ma2
macd3 = fast_ma3 - slow_ma3
macd4 = fast_ma4 - slow_ma4

signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
signal2 = sma_signal == "SMA" ? ta.sma(macd2, signal_length) : ta.ema(macd2, signal_length)
signal3 = sma_signal == "SMA" ? ta.sma(macd3, signal_length) : ta.ema(macd3, signal_length)
signal4 = sma_signal == "SMA" ? ta.sma(macd4, signal_length) : ta.ema(macd4, signal_length)
//hist = (macd + macd2 + macd3)/1 - (signal + signal2 + signal3)/1
hist = (macd + macd2 + macd3 + macd4)/4 - (signal + signal2 + signal3 + signal4)/4
signal5 = (signal + signal2 + signal3)/3

sma_signal2 = input.bool(title="Simple MA (Signal Line)", defval=true)

lin_reg = input.bool(title="Lin Reg", defval=true)
linreg_length = input.int(title="Linear Regression Length", minval = 1, maxval = 200, defval = 11)

bopen = lin_reg ? ta.linreg(open, linreg_length, 0) : open
bhigh = lin_reg ? ta.linreg(high, linreg_length, 0) : high
blow = lin_reg ? ta.linreg(low, linreg_length, 0) : low
bclose = lin_reg ? ta.linreg(close, linreg_length, 0) : close

shadow = (bhigh - bclose) + (bopen - blow)
body = bclose - bopen
perc = (shadow/body)
cond2 = perc >=2 and bclose+bclose[1]/2 > bopen+bopen[1]/2

r = bopen < bclose

//signal5 = sma_signal2 ? ta.sma(bclose, signal_length) : ta.ema(bclose, signal_length)
plotcandle(r ? bopen : na, r ? bhigh : na, r ? blow: na, r ? bclose : na, title="LinReg Candles", color= color.green, wickcolor=color.green, bordercolor=color.green, editable= true)
plotcandle(r ? na : bopen, r ? na : bhigh, r ? na : blow, r ? na : bclose, title="LinReg Candles", color=color.red, wickcolor=color.red, bordercolor=color.red, editable= true)
//alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
//alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

green = hist >= 0 ? (hist[1] < hist ? "G" : "GL") : (hist[1] < hist ? "RL" : "R")
Buy = green == "G" and green[1] != "G" and green[1] != "GL" and bopen < bclose and rsi < 55.0 //and not cond2
//StopBuy = (green == "R" or green == "RL" or green == "RL") and bopen > bclose and bopen[1] < bclose[1]
StopBuy = bopen > bclose and bopen[1] < bclose[1] and (green == "G" or green == "GL" or green == "R") and bopen[2] < bclose[2] and bopen[3] < bclose[3]
hists = close[3] < close[2] and close[2] < close[1]
//Buy = green == "RL" and hist[0] > -0.07 and hist[0] < 0.00 and rsi < 55.0 and hists
//StopBuy = green == "GL" or green == "R"
alertcondition(Buy, "Long","Покупка в лонг")
alertcondition(StopBuy, "StopLong","Закрытие сделки")

//hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist + (close - (close * 0.03)), title = "Histogram", style = plot.style_line, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plotshape(Buy ? low : na, 'Buy', shape.labelup, location.belowbar , color=color.new(#0abe40, 50), size=size.small, offset=0)
plotshape(StopBuy ? low : na, 'Buy', shape.cross, location.abovebar , color=color.new(#be0a0a, 50), size=size.small, offset=0)
plot(macd4  + (close - (close * 0.01)),   title = "MACD",   color = #2962FF)
plot(signal5 + (close - (close * 0.01)), title = "Signal", color = #FF6D00)

plotchar(cond2 , char='↓', color = color.rgb(0, 230, 119), text = "-")

if (Buy)
    strategy.entry("long", strategy.long)

// if (startShortTrade)
//     strategy.entry("short", strategy.short)

profitTarget = strategy.position_avg_price * stopLuse
strategy.exit("Take Profit", "long", limit=profitTarget)
// strategy.exit("Take Profit", "short", limit=profitTarget)

Más.