ADX Estratégia de acompanhamento de tendências inteligente

Autora:ChaoZhang, Data: 23 de janeiro de 2021
Tags:

img

Resumo

A estratégia de rastreamento de tendências inteligente da ADX usa o índice direcional médio (ADX) para julgar a força das tendências e capturar tendências quando elas são fracas e seguir tendências fortes para lucro.

Princípio da estratégia

O núcleo desta estratégia é baseado principalmente no índice direcional médio (ADX) para julgar a força da tendência atual. O ADX calcula o valor médio do indicador direcional das flutuações de preços durante um determinado período para representar a força da tendência. Quando o valor do ADX está abaixo do limiar definido, acreditamos que o mercado está se consolidando. Neste momento, o intervalo da caixa é determinado. Se o preço atravessar os trilhos superior e inferior da caixa, um sinal de negociação é gerado.

Especificamente, a estratégia primeiro calcula o valor do ADX de 14 ciclos. Quando é inferior a 18, considera-se que a tendência é mais fraca. Em seguida, calcula o intervalo da caixa formada pelos preços mais altos e mais baixos das últimas 20 linhas K. Quando o preço atravessa essa caixa, são gerados sinais de compra e venda. A distância de stop loss é 50% do tamanho da caixa e a distância de take profit é 100% do tamanho da caixa.

Esta estratégia combina o julgamento da força da tendência e os sinais de ruptura para capturar tendências quando elas são mais fracas e entram em consolidação, evitando negociações frequentes em mercados desordenados.

Vantagens da estratégia

  1. A combinação de julgamentos sobre a força da tendência pode evitar negociações frequentes em mercados desordenados.
  2. A ruptura da caixa aumenta a filtragem para evitar ser preso em mercados voláteis.
  3. Nos mercados de tendência, podem ser obtidas metas de lucro mais elevadas.
  4. Parâmetros ADX personalizáveis, parâmetros de caixa, coeficientes de stop loss, etc. para se adaptarem a diferentes variedades.

Riscos da Estratégia

  1. As definições incorretas dos parâmetros ADX podem deixar de lado tendências ou fazer julgamentos errados.
  2. Os intervalos de caixa demasiado grandes ou pequenos podem afectar os resultados.
  3. Os coeficientes inadequados de stop loss e de take profit podem causar stop loss insuficientes ou take profit prematura demais.

Parâmetros como ADX, intervalo de caixa, coeficientes de stop loss podem ser otimizados para torná-lo mais adequado para diferentes produtos e ambientes de mercado.

Orientações para a otimização da estratégia

  1. Os parâmetros ADX podem testar os resultados de diferentes ciclos.
  2. Os parâmetros da caixa podem testar diferentes comprimentos para determinar tamanhos de faixa ideais.
  3. Ajustar os coeficientes de stop loss e take profit para otimizar as taxas de risco-retorno.
  4. Teste apenas os efeitos da negociação unilateral longa/curta.
  5. Adicionar outros indicadores para combinações, como indicadores de volume.

Resumo

A estratégia de rastreamento de tendências inteligente da ADX é geralmente uma estratégia de rastreamento de tendências relativamente estável. Ela combina o julgamento da força da tendência e os sinais de avanço do preço para evitar os problemas como perseguir altos e matar baixos que são comuns em estratégias típicas de rastreamento de tendências. Através da otimização de parâmetros e da gestão rigorosa do dinheiro, a estratégia pode lucrar constantemente.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Developer: Andrew Palladino. 
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter

strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)

adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")


// When the ADX drops below threshold limit, then we consider the pair in consolidation. 
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. 
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. 
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. 


dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, 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)

adxHigh(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	plus
	
adxLow(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	minus
	
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)

isADXLow = sig < adxLowerLevel

//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]

var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0

boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel

boxWidth = boxUpperLevel - boxLowerLevel

profitTarget = strategy.position_size > 0  ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ?  strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na

plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)


bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")

isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow

//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
    strategy.entry("open_long", strategy.long)

isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow

//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
    strategy.entry("open_short", strategy.short)

Mais.