Este artigo apresenta uma estratégia de negociação de criptomoedas de alta frequência que combina o cruzamento TrippleMACD com o Índice de Força Relativa (RSI). A estratégia emprega três conjuntos de indicadores MACD com diferentes parâmetros e média suas linhas de sinal, ao mesmo tempo em que incorpora o indicador RSI para determinar os horários ideais de compra e venda. A estratégia é projetada para negociação automatizada em um período de tempo de 1 minuto, considerando apenas negociações longas. Além disso, a estratégia utiliza regressão linear para identificar fases de consolidação no mercado, evitando negociações durante condições de mercado agitadas.
O núcleo desta estratégia é utilizar três conjuntos de indicadores MACD com diferentes parâmetros para capturar sinais de tendência em várias escalas de tempo. Ao fazer a média das linhas de sinal desses três indicadores MACD, o ruído pode ser efetivamente suavizado, fornecendo sinais de negociação mais confiáveis. Ao mesmo tempo, o indicador RSI é usado para confirmar a força das tendências de alta. A estratégia gera um sinal de compra apenas quando todos os três indicadores MACD mostram sinais de alta e o indicador RSI também confirma a força da tendência de alta.
Além disso, a estratégia emprega regressão linear para identificar fases de consolidação no mercado. Calculando a proporção dos comprimentos de sombra superior e inferior ao comprimento do corpo das velas, pode-se determinar se o mercado atual está em um estado de consolidação. Se o comprimento das sombras superior e inferior for mais do dobro do comprimento do corpo, o mercado é considerado em uma fase de consolidação e a estratégia evitará negociações durante esse tempo.
Análise de vários prazos: Ao usar três conjuntos de indicadores MACD com parâmetros diferentes, a estratégia pode capturar sinais de tendência em várias escalas de tempo, melhorando a precisão e a confiabilidade dos negócios.
Suavização do sinal: A média das linhas de sinal dos três indicadores MACD suaviza eficazmente o ruído, evitando sinais enganosos que podem ser gerados por um único indicador.
Confirmação da tendência: a incorporação do indicador RSI para confirmar a força das tendências de alta aumenta ainda mais a confiabilidade dos sinais de negociação.
Identificação da consolidação: a utilização da regressão linear para identificar as fases de consolidação no mercado permite que a estratégia evite negociações durante condições de mercado agitadas, reduzindo o risco da estratégia.
Negociação automatizada: A estratégia é concebida para negociação automatizada num período de tempo de 1 minuto, permitindo respostas rápidas às alterações do mercado e uma execução eficiente das negociações.
Optimização de parâmetros: A estratégia envolve vários parâmetros, como os períodos de linha rápida e lenta dos três indicadores MACD e o período do indicador RSI. A seleção desses parâmetros tem um impacto significativo no desempenho da estratégia.
Risco de sobreajuste: a estratégia pode ter um bom desempenho com base em dados históricos específicos, mas pode não se adaptar às mudanças do mercado na aplicação real, o que leva ao fracasso da estratégia.
Eventos de cisne negro: a estratégia baseia-se principalmente em indicadores técnicos e pode não responder adequadamente a eventos fundamentais significativos, o que pode conduzir a um desempenho fraco em condições de mercado extremas.
Ajuste dinâmico dos parâmetros: ajuste dinâmico dos parâmetros da estratégia, tais como os períodos de linha rápida e lenta dos indicadores MACD e o período do indicador RSI, com base nas alterações das condições de mercado para se adaptarem aos diferentes ambientes de mercado.
Incorporar indicadores adicionais: para além dos indicadores MACD e RSI existentes, considerar a incorporação de outros indicadores técnicos, tais como bandas de Bollinger e médias móveis, para melhorar ainda mais a precisão e a fiabilidade dos sinais de negociação.
Optimização da gestão do risco: implementar medidas de gestão do risco mais abrangentes na estratégia, como o stop-loss dinâmico e a gestão de posições, para reduzir o risco global da estratégia.
Optimização do aprendizado de máquina: Utilize algoritmos de aprendizado de máquina, como redes neurais e máquinas vetoriais de suporte, para otimizar os parâmetros e regras de negociação da estratégia, aumentando a adaptabilidade e robustez da estratégia.
Este artigo apresenta uma estratégia de negociação de criptomoedas de alta frequência que combina o cruzamento TrippleMACD com o indicador RSI. A estratégia emprega três conjuntos de indicadores MACD com diferentes parâmetros e o indicador RSI para gerar sinais de negociação confiáveis, utilizando a regressão linear para identificar fases de consolidação no mercado, evitando negociações durante condições de mercado agitadas. As vantagens da estratégia estão na análise de vários prazos, suavização de sinal, confirmação de tendência de consolidação e identificação de negociação automatizada. No entanto, também enfrenta riscos como otimização de parâmetros, sobreajuste e eventos de cisne negro. No futuro, a estratégia pode ser melhorada através do ajuste dinâmico de parâmetros, incorporando indicadores adicionais, otimização de gerenciamento de riscos e otimização de aprendizado de máquina para melhorar a adaptabilidade e robustez, melhor lidando com as mudanças no mercado de criptomoedas.
/*backtest start: 2024-02-01 00:00:00 end: 2024-02-29 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //indicator("Triplle",shorttitle="Triplle MACD", overlay=true, scale = scale.none) //indicator("Triplle","TrippleMACD",true) 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" //rsiPlot = plot(rsi, "RSI", color=#7E57C2) //plot(rsiMA, "RSI-based MA", color=color.yellow) //rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86) //midline = hline(50, "RSI Middle Band", color=color.new(#787B86, 50)) //rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86) //fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill") 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) //fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill") //midLinePlot = plot(50, color = na, editable = false, display = display.none) //fill(rsiPlot, midLinePlot, 100, 70, top_color = color.new(color.green, 0), bottom_color = color.new(color.green, 100), title = "Overbought Gradient Fill") //fill(rsiPlot, midLinePlot, 30, 0, top_color = color.new(color.red, 100), bottom_color = color.new(color.red, 0), title = "Oversold Gradient Fill") // 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 // plot( // plFound ? rsi[lookbackRight] : na, // offset=-lookbackRight, // title="Regular Bullish", // linewidth=2, // color=(bullCond ? bullColor : noneColor) // ) // plotshape( // bullCond ? rsi[lookbackRight] : na, // offset=-lookbackRight, // title="Regular Bullish Label", // text=" Bull ", // style=shape.labelup, // location=location.absolute, // color=bullColor, // textcolor=textColor // ) //------------------------------------------------------------------------------ // Regular Bearish // 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 // plot( // phFound ? rsi[lookbackRight] : na, // offset=-lookbackRight, // title="Regular Bearish", // linewidth=2, // color=(bearCond ? bearColor : noneColor) // ) // plotshape( // bearCond ? rsi[lookbackRight] : na, // offset=-lookbackRight, // title="Regular Bearish Label", // text=" Bear ", // style=shape.labeldown, // location=location.absolute, // color=bearColor, // textcolor=textColor // ) // END RSI // 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)