Estratégia de tendência instantânea de Ehlers

Autora:ChaoZhang, Data: 2023-12-20 16:51:05
Tags:

img

Resumo

A estratégia de linha de tendência instantânea de Ehlers é proposta por John Ehlers em seu livro Análise cibernética para ações e futuros.

Estratégia lógica

O núcleo desta estratégia é o cálculo da linha de tendência instantânea (IT).

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 é o preço, a é um fator de suavização, padrão para 0,07. Esta fórmula é um filtro de segunda ordem que pode suavizar o preço e gerar tendências.

Outro indicador chave é a linha de atraso, calculada por:

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

Quando o preço cruza acima da linha de atraso, ele sinaliza uma quebra para cima, vá longo.

Além disso, a estratégia estabelece ordens de stop loss para controlar os riscos.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. A linha de TI filtra eficazmente o ruído e melhora a qualidade do sinal
  2. O filtro de segunda ordem proporciona mais flexibilidade e robustez de ajuste
  3. A linha de atraso evita batidas desnecessárias dentro das tendências
  4. Os riscos de controlo de stop loss incorporados a níveis predefinidos
  5. Estrutura de código limpa, fácil de entender e modificar

Análise de riscos

Há também alguns riscos com esta estratégia:

  1. A regulação inadequada dos parâmetros da linha IT/lag pode gerar sinais falsos.
  2. Configuração de stop loss incorreta pode resultar em stop out prematuro ou perda excessiva
  3. A alta frequência de negociação leva a taxas de comissão acumuladas
  4. Os tempos de retenção mais longos aumentam o risco de aumento da perda

Estes riscos podem ser atenuados por:

  1. Aplicação de aprendizado de máquina para otimização de parâmetros
  2. Definição de níveis de stop loss adaptativos
  3. Reduzir o tamanho das posições para reduzir as frequências de negociação
  4. Incorporação de perdas de parada do período de detenção

Orientações de otimização

Esta estratégia pode ser melhorada nos seguintes aspectos:

  1. Impactos de ensaio de diferentes parâmetros do filtro para determinar o valor óptimo
  2. Tente combinar outros indicadores para filtrar sinais
  3. Melhorar a lógica de entrada para dimensionar durante as fases de aceleração da tendência
  4. Estabelecer um stop loss adaptativo com base na volatilidade do mercado
  5. Realizar análises de séries temporais sobre sessões e frequências de negociação

Conclusão

Em geral, a estratégia Ehlers Instantaneous Trendline utiliza indicadores técnicos para identificar tendências em tempo real em ações / futuros e posições abertas quando as tendências se revertem. Tem as vantagens de filtragem de ruído eficaz, alta sintonização de parâmetros, lógica clara de geração de sinal e controle de risco incorporado. Com otimização adicional na seleção de parâmetros, filtragem de sinal, dimensionamento de posição e sintonização de stop loss, essa estratégia pode alcançar um desempenho ainda melhor. A estrutura de código clara também facilita a compreensão e modificação. Em resumo, este é um sistema de tendência eficiente que vale a pena testar e melhorar.


/*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()

Mais.