Esta estratégia é uma estratégia de canal de preços adaptativa baseada no indicador Average True Range (ATR) e no Average Directional Index (ADX).
Calcular o máximo máximo (HH) e o mínimo mínimo (LL) num determinado comprimento.
Calcule +DI e -DI com base nos movimentos de preços para cima e para baixo.
Se o ADX < 25, o mercado é considerado lateral. Se fechar > canal superior (HH - ATR multiplicador * ATR), vá longo. Se fechar < canal inferior (LL + ATR multiplicador * ATR), vá curto.
Se o ADX >= 25 e o +DI > -DI, o mercado está em alta.
Se o ADX >= 25 e o +DI < -DI, o mercado é de baixa.
Posição de saída após barras de extensão de saída desde a entrada.
A estratégia adapta-se automaticamente com base nas condições do mercado, utilizando a estratégia de canal no mercado lateral e a tendência seguindo no mercado de tendência.
O uso de ATR e ADX garante a adaptabilidade.
A saída forçada acrescenta estabilidade.
O ADX pode gerar sinais falsos com frequência.
Os parâmetros ATR e ADX pobres levam a um mau desempenho.
Incapaz de proteger eficazmente contra eventos do cisne negro.
Otimizar os parâmetros do ATR e do ADX para melhorar a adaptabilidade.
Adicionar stop loss para limitar perdas.
Adicione filtros para evitar sinais falsos.
A estratégia combina indicadores e mecanismos para se adaptar às condições do mercado, mas erros de julgamento podem ocorrer devido a limitações de indicadores, futuras otimizações de parâmetros e controle de risco.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Adaptive Price Channel Strategy", overlay=true) length = input(20, title="Length") exit_length = input(10, title="Exit After X Periods") atr_multiplier = input(3.2, title="ATR Multiplier") startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date") endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date") hh = ta.highest(high, length) ll = ta.lowest(low, length) atr = ta.atr(length) // calculate +DI and -DI upMove = high - high[1] downMove = low[1] - low plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0) minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0) plusDI = ta.rma(plusDM, length) / atr * 100 minusDI = ta.rma(minusDM, length) / atr * 100 // calculate ADX dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = ta.rma(dx, length) var int barSinceEntry = na if (not na(close[length]) ) if (adx < 25) // Sideways market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 else if (adx >= 25 and plusDI > minusDI) // Bullish market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (adx >= 25 and plusDI < minusDI) // Bearish market if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 if (na(barSinceEntry)) barSinceEntry := barSinceEntry[1] + 1 else if (barSinceEntry >= exit_length) strategy.close("PChLE") strategy.close("PChSE") barSinceEntry := na plot(hh, title="Highest High", color=color.green, linewidth=2) plot(ll, title="Lowest Low", color=color.red, linewidth=2)