Trata-se de uma estratégia quantitativa de negociação que combina indicadores de supertrend triplo, EMA e ADX. Gerar sinais de negociação usando um sistema de supertrend triplo e aplicar EMA e ADX como filtros para controlar a frequência de negociação e melhorar a qualidade do sinal.
Usar três sistemas de supertendências com parâmetros diferentes e gerar sinais de negociação quando todas as três supertendências concordarem com a direção.
Aplicar a EMA como um filtro de tendência, só ir longo quando fechar está acima da EMA e ir curto quando fechar está abaixo da EMA.
Aplicar o ADX como um filtro de força da tendência, apenas negociar quando o ADX estiver acima de um limiar.
Permitir a opção de reentrada para ajustar a rentabilidade e o controlo do risco.
Especificamente, a condição de entrada longa é quando todas as três supertendências ficam em alta, o fechamento está acima da EMA e o ADX está acima do limiar. A condição de entrada curta é quando todas as três supertendências ficam em baixa, o fechamento está abaixo da EMA e o ADX está acima do limiar. Sair quando qualquer uma das supertendências inverter a direção.
A estratégia também traça linhas de suporte e resistência de supertendência para auxiliar na determinação visual da tendência.
O sistema de supertendência tripla filtra falsos breakouts e melhora a precisão de entrada.
Os filtros duplos EMA e ADX reduzem as perdas e melhoram a gestão de riscos.
A opção de reentrada permite ajustar a rentabilidade com base na preferência de risco.
As linhas de supertrend visuais ajudam a determinar a direção da tendência.
Supertrend e outros indicadores têm atraso e podem causar entrada tardia ou saída antecipada.
Filtros demasiado rigorosos podem perder oportunidades.
Os Whipsaws podem causar perdas nos mercados de gama.
Permitir a reentrada aumenta a frequência do comércio e os custos de deslizamento.
Estes riscos podem ser reduzidos através da otimização de parâmetros, filtros e da utilização de paradas dinâmicas.
Esta estratégia pode ser otimizada em vários aspectos:
Teste diferentes combinações de parâmetros para encontrar configurações ótimas de supertrend e EMA.
Otimizar o limiar ADX para reduzir os falsos sinais.
Adicione outros filtros como volatilidade, volume, etc.
Otimizar os parâmetros separadamente para diferentes produtos.
Construir mecanismos dinâmicos de stop loss para um melhor controlo dos riscos.
Explore o aprendizado de máquina para encontrar melhores regras de entrada e saída.
Esta estratégia utiliza os pontos fortes dos sistemas de supertendência tripla e o aumenta com filtros duplos EMA e ADX para melhorar efetivamente a qualidade do sinal e controlar riscos.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 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/ // ©kunjandetroja //@version=5 strategy('Triple Supertrend with EMA and ADX', overlay=true) m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1') m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2') m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3') p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1') p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2') p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3') len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1) len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1) len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1) adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5) var bool long_position = false adx_filter = input.bool(false, "Add Adx & EMA filter") renetry = input.bool(true, "Allow Reentry") f_getColor_Resistance(_dir, _color) => _dir == 1 and _dir == _dir[1] ? _color : na f_getColor_Support(_dir, _color) => _dir == -1 and _dir == _dir[1] ? _color : na [superTrend1, dir1] = ta.supertrend(m1, p1) [superTrend2, dir2] = ta.supertrend(m2, p2) [superTrend3, dir3] = ta.supertrend(m3, p3) EMA = ta.ema(close, len_EMA) [diplus,diminus,adx] = ta.dmi(len_Di,len_ADX) // ADX Filter adxup = adx > adx_above and close > EMA adxdown = adx > adx_above and close < EMA sum_dir = dir1 + dir2 + dir3 dir_long = if(adx_filter == false) sum_dir == -3 else sum_dir == -3 and adxup dir_short = if(adx_filter == false) sum_dir == 3 else sum_dir == 3 and adxdown Exit_long = dir1 == 1 and dir1 != dir1[1] Exit_short = dir1 == -1 and dir1 != dir1[1] // BuySignal = dir_long and dir_long != dir_long[1] // SellSignal = dir_short and dir_short != dir_short[1] // if BuySignal // label.new(bar_index, low, 'Long', style=label.style_label_up) // if SellSignal // label.new(bar_index, high, 'Short', style=label.style_label_down) longenter = if(renetry == false) dir_long and long_position == false else dir_long shortenter = if(renetry == false) dir_short and long_position == true else dir_short if longenter long_position := true if shortenter long_position := false strategy.entry('BUY', strategy.long, when=longenter) strategy.entry('SELL', strategy.short, when=shortenter) strategy.close('BUY', Exit_long) strategy.close('SELL', Exit_short) buy1 = ta.barssince(dir_long) sell1 = ta.barssince(dir_short) colR1 = f_getColor_Resistance(dir1, color.red) colS1 = f_getColor_Support(dir1, color.green) colR2 = f_getColor_Resistance(dir2, color.orange) colS2 = f_getColor_Support(dir2, color.yellow) colR3 = f_getColor_Resistance(dir3, color.blue) colS3 = f_getColor_Support(dir3, color.maroon) plot(superTrend1, 'R1', colR1, linewidth=2) plot(superTrend1, 'S1', colS1, linewidth=2) plot(superTrend2, 'R1', colR2, linewidth=2) plot(superTrend2, 'S1', colS2, linewidth=2) plot(superTrend3, 'R1', colR3, linewidth=2) plot(superTrend3, 'S1', colS3, linewidth=2) // // Intraday only // var int new_day = na // var int new_month = na // var int new_year = na // var int close_trades_after_time_of_day = na // if dayofmonth != dayofmonth[1] // new_day := dayofmonth // if month != month[1] // new_month := month // if year != year[1] // new_year := year // close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15) // strategy.close_all(time > close_trades_after_time_of_day)