Estratégia de linha de tendência instantânea Els


Data de criação: 2023-12-20 16:51:05 última modificação: 2023-12-20 16:51:05
cópia: 0 Cliques: 938
1
focar em
1621
Seguidores

Estratégia de linha de tendência instantânea Els

Visão geral

A estratégia de linha de tendência instantânea de Ehlers foi desenvolvida por John Ehlers em sua caixa de análise de controle de ações e futuros. A estratégia usa indicadores técnicos para identificar a tendência instantânea de uma ação ou futuros e abrir posições quando a tendência é invertida.

Princípio da estratégia

O núcleo da estratégia é calcular a linha de tendência instantânea. A fórmula de cálculo da linha de tendência instantânea é a seguinte:

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

onde src representa o preço, a é um fator de nivelamento com o valor padrão de 0,07. A fórmula é um filtro de segunda ordem, capaz de nivelar o preço e gerar tendências.

Outro indicador-chave é a linha de atraso (lag), cuja fórmula é:

lag = 2.0 * it - nz(it[2])

A linha está um ciclo atrás da linha de TI. Quando o preço atravessa a linha de atraso acima, representa a reversão da tendência, fazendo mais; quando o preço atravessa a linha de atraso abaixo, representa a reversão da tendência, fazendo vazio.

Além disso, a estratégia também estabelece um stop loss para controlar o risco.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. Utilizando a tendência de identificação de linhas de TI, é possível filtrar o ruído do mercado e melhorar a qualidade do sinal
  2. Aplicação de filtros de segunda ordem, grande espaço de otimização de parâmetros, alta ajustabilidade
  3. Geração de sinais de negociação em combinação com a linha de atraso, evitando a abertura de posições vazias repetidas na tendência
  4. Configurar o risco de controle de stop loss único, com a possibilidade de predefinir a proporção de stop loss
  5. Estrutura de código clara, fácil de entender e modificar

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. A configuração inadequada dos parâmetros da linha de TI e da linha de atraso pode gerar um sinal de erro
  2. A configuração inadequada do ponto de parada pode parar prematuramente ou parar muito
  3. Frequência de transações pode ser mais alta, com custos de transação afetando os lucros
  4. O excesso de tempo de detenção de posições concentradas pode afetar a taxa de retorno

Esses riscos podem ser reduzidos por meio de:

  1. Parâmetros de otimização de algoritmos de aprendizagem de máquina
  2. Configuração do ponto de parada adaptável
  3. Ajustar adequadamente o número de posições abertas e reduzir a frequência de negociação
  4. Configuração de stop loss

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. Teste o efeito de diferentes parâmetros de filtro sobre os resultados, procurando o melhor parâmetro
  2. Tente filtrar sinais de negociação em combinação com outros indicadores para melhorar a qualidade do sinal
  3. Optimizar a lógica de abertura de posições, aumentando as posições durante a aceleração da tendência
  4. Estabelecer uma estratégia de stop-loss adaptável, ajustando o ponto de parada de acordo com a volatilidade do mercado
  5. Análise de sequência de tempo para avaliar a influência do tempo e do ciclo de negociação nos resultados

para concluir

Em geral, a estratégia de linha de tendência instantânea de Ells usa indicadores técnicos para identificar tendências em tempo real de ações/futuros e abrir posições quando a tendência se inverte. Ela possui vantagens como filtragem de ruído eficaz, alta ajustabilidade de parâmetros, lógica de geração de sinais clara e controle de risco embutido.

Código-fonte da estratégia
/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()