Esta estratégia utiliza indicadores de impulso, incluindo o índice direcional médio (ADX), o índice de movimento direcional (DMI) e o índice de canal de commodities (CCI) para determinar a direção da tendência e seguir as tendências.
Calcular os indicadores ADX, DMI e CCI.
Determine a direcção da tendência.
Entrem em posição.
Posições de saída com stop loss.
O ADX filtra a negociação durante tendências fracas.
O DMI reduz os erros na identificação de tendências.
A entrada em vigor de uma prorrogação excessiva da CCI melhora o calendário e reduz o risco.
A combinação de indicadores de impulso melhora a precisão.
Limites de perdas de parada por transação.
Aumentar o limiar do ADX para garantir uma tendência suficientemente forte.
DMI está atrasado na fase inicial da tendência.
Alta frequência de negociação CCI, alargue a gama CCI para filtrar ruído.
Considerar uma estratégia de neutralidade de mercado quando longo e curto, para cobrir o risco geral da posição.
Otimizar os parâmetros do ADX para equilibrar a filtragem do ruído e a tendência de captura.
Otimizar os parâmetros do DMI para equilibrar o atraso e a sensibilidade.
Otimizar os parâmetros do CCI para equilibrar a frequência de negociação e capturar reversões.
Teste adição ou modificação de indicadores para melhores combinações, por exemplo MACD, KDJ.
Teste em diferentes produtos para encontrar o melhor ajuste.
Otimizar o dimensionamento das posições para controlar o risco, mantendo o acompanhamento da tendência.
A estratégia usa logicamente ADX para tendência, DMI para direção e CCI para reversões. Mas os parâmetros precisam de otimização e dimensionamento de posição para controle de risco.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("ADX Strategy", currency = "USD", initial_capital = 1000, overlay=true) adxlen = input(9, title="ADX Smoothing") dilen = input(14, title="DI Length") ADX_Entry = input(25, title="ADX Entry") dirmov(len) => up = change(high) down = -change(low) truerange = rma(tr, len) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) cci_length = input(20, minval=1, title="CCI Length") cci_ma = sma(close, cci_length) cci = (close - cci_ma) / (0.015 * dev(close, cci_length)) stop_loss = syminfo.mintick * 100 open_longs = strategy.position_size > 0 open_shorts = strategy.position_size < 0 possible_bull = false possible_bull := not open_longs ? (possible_bull[1] and not crossunder(up,down) ? true : false) : false possible_bear = false possible_bear := not open_shorts ? (possible_bear[1] and not crossunder(down,up) ? true : false) : false bool bull_entry = crossover(up,down) if(bull_entry and up < ADX_Entry and cci < 0) possible_bull := true bull_entry := false if(possible_bull and up > ADX_Entry and cci > -100) bull_entry := true bool bear_entry = crossover(down,up) if(bear_entry and down < ADX_Entry and cci > 0) possible_bear := true bear_entry := false if(possible_bear and down >= ADX_Entry and cci < 100) bear_entry := true strategy.entry("Short", strategy.short, qty = 1,comment="Short", stop=high[1] - stop_loss, when = bear_entry) strategy.entry("Long", strategy.long, qty = 1, comment="Long", stop=low[1] - stop_loss, when = bull_entry ) strategy.close_all(when = (open_shorts and (crossover(up,down) or crossover(sig,down))) or (open_longs and ( crossover(down,up) or crossover(sig, up))))