Esta estratégia calcula o Índice de Movimento Direcional (DI) de commodities e o combina com parâmetros de limite para implementar negociação de duas direções.
O indicador central desta estratégia é o Índice de Movimento Direccional (DI).
DI+ = (DM+ / Real Range) × 100 DI- = (DM- / Real Range) × 100
O Real Range representa a volatilidade recente através do cálculo do valor máximo do preço mais alto, o preço mais baixo e o preço de fechamento do dia anterior ao longo de três dias.
De acordo com a definição de DI, quando DI+ > DI-, significa que o momento do mercado atual é mais forte, pertencente a um mercado de alta; quando DI- > DI+, significa que o momento da baixa é mais forte do que o momento da alta, pertencente a um mercado de baixa.
Esta estratégia utiliza esta característica e define um parâmetro limite. Quando o DI + é maior que o DI- por um parâmetro limite, determina que o mercado atual é um mercado de alta e vai longo. Quando o DI- é maior que o DI + por um parâmetro limite, determina que o mercado atual é um mercado de baixa e vai curto.
Por exemplo, se o parâmetro limite for definido em 3, as regras específicas de negociação são:
Uma vez que muitas vezes existem pequenas diferenças flutuantes entre DI+ e DI-, a fixação de um parâmetro limite pode filtrar algumas transacções sem direcionalidade significativa e reduzir transacções desnecessárias.
As principais vantagens desta estratégia são:
A DI é fiável no julgamento da direccionalidade do mercado
A DI julga diretamente as tendências do mercado calculando o poder dos touros e dos ursos.
O parâmetro limite pode filtrar efetivamente os sinais
O parâmetro de limite filtra pequenas flutuações sem direcionalidade significativa, selecionando apenas secções com direcionalidade significativa para o comércio, evitando ser preso.
Realizar negociações automatizadas em duas direcções
As posições longas e curtas podem ser automaticamente trocadas com base no indicador DI sem julgamento manual, reduzindo a dificuldade de negociação.
Quadro de tempo de negociação personalizável
Suporta a configuração para negociar apenas dentro de um intervalo de datas personalizável e fechar todas as posições automaticamente depois, flexível e conveniente.
Apenas selecionável longo ou curto
Através dos interruptores longos e curtos, apenas sinais unidirecionais podem ser selecionados para implementar estratégias longas ou curtas adequadas a diferentes ambientes de mercado.
Há também alguns riscos com esta estratégia:
Possibilidade de o DI dar sinais errados
O DI pode dar sinais errados a curto prazo quando ocorrem flutuações drásticas do mercado, levando a operações fracassadas.
Configuração incorreta dos parâmetros de limite
A configuração inadequada dos parâmetros de limite alto ou baixo pode conduzir a sinais de negociação demasiado poucos ou demasiados.
Incapacidade de determinar o ponto final da tendência
O DI só pode determinar a direcção actual da tendência e não pode julgar se a tendência terminou ou se reverteu.
As soluções para os riscos incluem:
Combinar média móvel e outros indicadores para filtrar sinais de DI
Ajustar parâmetros-limite com base nos resultados dos backtests
Combine Volume, MACD etc. para determinar se a inversão da tendência
A estratégia pode ser ainda melhorada das seguintes maneiras:
Combinar outros indicadores de avaliação da tendência, como o Perfil de Mercado
A combinação de indicadores como o Perfil de Mercado, que também julga intuitivamente a potência longa e curta com a DI, pode melhorar a precisão do julgamento.
Adicionar estratégias de stop-profit e stop-loss
A definição de stop-profit, tempo ou percentual de stop-loss pode garantir lucros e reduzir perdas.
Ajustar parâmetros para produtos específicos
O ajustamento dos parâmetros de limite e dos tempos de negociação em função das diferentes características do produto pode melhorar o desempenho da estratégia.
Optimização dinâmica utilizando aprendizagem de máquina
Aplicar algoritmos de aprendizagem por reforço para otimizar dinamicamente as definições dos parâmetros com base em sinais em tempo real.
Em resumo, esta estratégia é relativamente simples e prática. Utiliza o cálculo de DI
/*backtest start: 2022-12-12 00:00:00 end: 2023-12-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Noro's DI Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") len = input(title="Length", defval=14) limit = input(3, title = "limit, %") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //DI TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementMinus = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 //Trend trend = 0 trend := DIPlus > DIMinus + limit ? 1 : DIPlus < DIMinus - limit ? -1 : trend[1] //Background col = trend == 1 ? lime : red bgcolor(col, transp = 80) //Lines plot(DIPlus, color=lime, title="DI+", linewidth = 3) plot(DIMinus, color=red, title="DI-", linewidth = 3) //Trading size = strategy.position_size lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if trend == 1 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if trend == -1 strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()