Esta estratégia combina múltiplos indicadores técnicos para tomar decisões de negociação longas e curtas.
A estratégia usa principalmente Bandas de Bollinger para julgar a volatilidade dos preços. As bandas de estreitamento representam a diminuição da volatilidade que pode levar a um rompimento. O RSI é usado para identificar condições de sobrecompra e sobrevenda.
Além disso, o ADX é usado para avaliar a força da tendência. O ADX alto representa uma tendência forte, favorecendo a negociação de tendência. O ADX baixo não representa uma tendência clara, considerando a reversão média. Finalmente, as médias móveis definem a direção da tendência de longo prazo. A tendência ascendente favorece a longa, enquanto a tendência descendente favorece a curta.
Especificamente, quando as bandas se comprimem, o RSI se aproxima de seus limites, e os preços quebram abaixo da faixa inferior, espera-se um salto, vá longo. Quando as bandas se comprimem, o RSI se aproxima de seus limites, e os preços quebram acima da faixa superior, espera-se um declínio, vá curto. Além disso, com alto ADX, adicione longs em uptrend. Com baixo ADX, adicione shorts em downtrend. Combinar indicadores melhora a robustez do sistema.
A estratégia multiindicador tem as seguintes vantagens:
A combinação de indicadores melhora a precisão e a robustez.
Considera a negociação de tendência e de intervalo, adaptável a diferentes condições de mercado.
Longs e shorts reduzem os riscos direcionais e evitam movimentos extremos.
Parar perdas e tomar lucro bloquear os lucros e limitar as perdas quando as negociações dão errado.
A otimização de parâmetros melhora continuamente a estratégia adaptando-a aos mercados em mudança.
A estratégia apresenta também alguns riscos:
Mais indicadores aumentam a complexidade. Configurações inadequadas podem degradar o desempenho. Extensivos testes e otimização são necessários.
A dependência excessiva dos indicadores técnicos, ignorando os fundamentais, pode causar sinais imprecisos.
Os mercados podem já ter se movido quando surgem sinais, representando um risco de perseguir.
A negociação bidirecional aumenta a frequência, aumentando os custos e a pressão.
A robustez deve ser testada em diversos mercados.
Os riscos podem ser geridos através de um rigoroso stop loss, de um dimensionamento prudente das posições, de uma alavancagem razoável, etc. No geral, a estratégia tem um forte valor prático.
Algumas maneiras de otimizar a estratégia:
Teste diferentes conjuntos de parâmetros para encontrar valores ótimos utilizando algoritmos graduais, aleatórios ou genéticos.
Adicione mais indicadores como KDJ, Williams para construir um conjunto de indicadores robusto.
Otimizar os modelos de dimensionamento de posições para gerir o risco de forma dinâmica.
Incorporar modelos de aprendizagem de máquina para prever tendências e movimentos de preços.
Teste em diferentes produtos, prazos e mercados para melhorar a adaptabilidade.
Refinar o tempo de entrada e saída para capturar tendências cedo e sair antes das reversões.
Empregar a tomada de lucro, trailing paradas para bloquear os lucros e limitar as perdas.
Adicionar fatores fundamentais e análise da estrutura do mercado para filtrar os sinais técnicos.
Esta estratégia automatiza a negociação interpretando múltiplos indicadores. Ela se beneficia da validação cruzada de indicadores, negociação de direção dupla, stop loss / take profit, etc. O excesso de ajuste e os falsos sinais exigem cautela. A otimização e testes contínuos podem transformá-lo em um sistema robusto e prático, representando o futuro das estratégias de negociação quant.
/*backtest start: 2023-09-24 00:00:00 end: 2023-10-24 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © The_Bigger_Bull //@version=5 strategy("Best TradingView Strategy", overlay=true, margin_long=0, margin_short=0) //Bollinger Bands source1 = close length1 = input.int(15, minval=1) mult1 = input.float(2.0, minval=0.001, maxval=50) basis1 = ta.sma(source1, length1) dev1 = mult1 * ta.stdev(source1, length1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 //buyEntry = ta.crossover(source1, lower1) //sellEntry = ta.crossunder(source1, upper1) //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") 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" //plot(rsi, "RSI", color=#7E57C2) //plot(rsiMA, "RSI-based MA", color=color.yellow) rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86) 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") //ADX adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") dirmov(len) => up1 = ta.change(high) down1 = -ta.change(low) plusDM = na(up1) ? na : (up1 > down1 and up1 > 0 ? up1 : 0) minusDM = na(down1) ? na : (down1 > up1 and down1 > 0 ? down1 : 0) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(plusDM, len) / truerange) minus = fixnan(100 * ta.rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) out = ta.sma(close, 14) sma1=ta.sma(close,55) ema200=ta.ema(close,200) longCondition = (out>sma1) and ta.crossover(source1, lower1) if (longCondition ) strategy.entry("long", strategy.long) shortCondition = (out<sma1) and ta.crossunder(source1, lower1) if (shortCondition ) strategy.entry("short", strategy.short) stopl=strategy.position_avg_price-50 tptgt=strategy.position_avg_price+100 stopshort=strategy.position_avg_price+50 tptgtshort=strategy.position_avg_price-100 strategy.exit("longclose","long",trail_offset=5,trail_points=45,when=ta.crossover(sma1,out)) strategy.exit("shortclose","short",trail_offset=5,trail_points=45,when=ta.crossover(out,sma1)) //if strategy.position_avg_price<0 plot(sma1 , color=color.blue) plot(out, color=color.green) //plot(ema200,color=color.red)