Estrategia de trading cuantitativo de criptomonedas basada en un gráfico de 1 minuto que combina el promedio móvil exponencial triple y el índice de fuerza relativa


Fecha de creación: 2024-03-29 11:16:10 Última modificación: 2024-03-29 11:16:10
Copiar: 3 Número de Visitas: 670
1
Seguir
1617
Seguidores

Estrategia de trading cuantitativo de criptomonedas basada en un gráfico de 1 minuto que combina el promedio móvil exponencial triple y el índice de fuerza relativa

Descripción general

La estrategia utiliza una combinación de la línea de movimiento de tres veces el promedio del índice (Triple MACD) y el índice de relative strength (RSI) para realizar operaciones cuantitativas en el mercado de criptomonedas en un período de tiempo de 1 minuto. La idea principal de la estrategia es capturar los cambios de la dinámica del mercado utilizando el indicador MACD con diferentes parámetros de ciclo, mientras que el indicador RSI se utiliza para confirmar la intensidad de la tendencia. Mediante la media de las tres señales MACD, se puede aplanar eficazmente el ruido de deslizamiento y mejorar la fiabilidad de la señal de negociación.

Principio de estrategia

La estrategia utiliza tres indicadores MACD de diferentes parámetros, con un período de línea rápida de 5/13/34 y un período de línea lenta de 8/21/144, y calcula el diferencial entre ellos para obtener el valor de MACD. Luego, se promedia estos tres MACD, se resta el valor de MACD posterior al promedio y se resta el valor de su señal (es decir, el NEMA de MACD) y se obtiene el gráfico de la columna MACD final. Al mismo tiempo, se calcula el indicador RSI de 14 ciclos, que ayuda a determinar la fuerza de la tendencia.

Análisis de las ventajas

  1. La combinación de indicadores MACD con parámetros de varios períodos permite reflejar objetivamente los cambios de tendencia en el mercado en diferentes escalas de tiempo, lo que mejora la precisión de los juicios de tendencia.
  2. La combinación de la MACD con el RSI crea condiciones estrictas de apertura de posiciones que ayudan a mejorar los beneficios de la estrategia y controlar los retrocesos.
  3. La señal MACD promedio puede eliminar eficazmente las falsas señales producidas por las frecuentes oscilaciones del indicador, lo que hace que la señal de negociación sea más confiable.
  4. El uso de la regresión lineal para evaluar el balance puede evitar entrar en el mercado cuando la tendencia del mercado de la oscilación no es clara, lo que reduce el comercio de pérdidas.
  5. En un mercado de criptomonedas que cambia rápidamente, una estrategia de comercio cuantitativa a nivel de 1 minuto es más capaz de capturar oportunamente las oportunidades de comercio generadas por las fluctuaciones del mercado.

Análisis de riesgos

  1. La estrategia funciona mejor en situaciones de tendencia unilateral, donde las señales de negociación pueden fallar con frecuencia si el mercado está en un estado de gran oscilación durante mucho tiempo.
  2. Debido a la gran volatilidad del mercado de criptomonedas, si se produce una fluctuación extrema y anormal en el mercado por un corto período de tiempo, puede provocar una retirada más significativa.
  3. La selección de los parámetros de la estrategia tiene un impacto evidente en el rendimiento general, y la configuración incorrecta de los parámetros puede causar el fracaso de la estrategia. Por lo tanto, se requiere una adecuada optimización de los parámetros y la verificación de la retroalimentación de las diferentes variedades antes del lanzamiento en vivo.

Dirección de optimización

  1. Se puede considerar la introducción de indicadores relacionados con la volatilidad de los precios, como el ATR, para filtrar las señales de apertura de posición y reducir los posibles daños causados por las fluctuaciones anormales del mercado.
  2. Para el juicio de la consolidación de la situación, además de la regresión lineal, también se puede intentar usar otros métodos como el punto de resistencia de soporte, el canal de la banda de Brin, etc., para mejorar aún más la precisión de la identificación.
  3. En una situación de tendencia, se puede optimizar el punto de paridad mediante la introducción de paradas móviles para maximizar los beneficios de una sola operación.
  4. Teniendo en cuenta las diferencias en las características de las diferentes variedades de comercio, se pueden configurar diferentes parámetros de estrategia para las diferentes variedades, lo que mejora la adaptabilidad y la estabilidad de la estrategia general.

Resumir

La estrategia combina hábilmente el triple MACD con el indicador RSI y utiliza la técnica de regresión lineal para identificar la tendencia de la consolidación, formando un conjunto completo de estrategias de comercio de alta frecuencia. La estrategia de estrictas condiciones de apertura de posición y la aplicación de la señal promedio de MACD ayudan a mejorar la precisión de las transacciones y controlar el retroceso. Si bien la estrategia funciona mejor en una tendencia unilateral, la adaptabilidad y la solidez de la estrategia se pueden mejorar aún más mediante la introducción de filtros de fluctuación, la optimización de métodos de identificación de la tendencia de la consolidación de la consolidación, la configuración de paradas móviles y la configuración de parámetros independientes para diferentes tipos.

Código Fuente de la Estrategia
/*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)