Стратегия мгновенного тренда Элерса

Автор:Чао Чжан, Дата: 2023-12-20 16:51:05
Тэги:

img

Обзор

Стратегия Ehlers Instantaneous Trendline была предложена Джоном Элерсом в его книге "Кибернетический анализ акций и фьючерсов". Она использует технические индикаторы для выявления трендов акций/фьючерсов в режиме реального времени и открытых позиций при обратном тренде.

Логика стратегии

Ядром этой стратегии является вычисление мгновенной линии тренда (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]

где src - цена, а - фактор сглаживания, по умолчанию 0,07. Эта формула является фильтром второго порядка, который может сглаживать цену и генерировать тенденции.

Другим ключевым показателем является линия задержки, рассчитанная на:

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

Когда цена пересекает линию задержки на один бар, это сигнализирует о взлетном прорыве, идите на длинный.

Кроме того, стратегия устанавливает ордера стоп-лосса для контроля рисков.

Анализ преимуществ

Преимущества этой стратегии включают:

  1. ИТ-линия эффективно фильтрует шум и улучшает качество сигнала
  2. Фильтр второго порядка обеспечивает большую гибкость настройки и надежность
  3. Лайна задержки избегает ненужных сдвигов в рамках трендов
  4. Включенные средства контроля стоп-лосса контролируют риски на заранее определенных уровнях
  5. Чистая структура кода, легкая для понимания и изменения

Анализ рисков

Эта стратегия также сопряжена с некоторыми рисками:

  1. Неправильная настройка параметров линии ИТ/задержки может вызвать ложные сигналы
  2. Плохая конфигурация стоп-лосса может привести к преждевременному стоп-оту или чрезмерному убытку
  3. Высокая частота торговли приводит к накоплению комиссионных
  4. Длительное время хранения увеличивает риск увеличения потерь

Эти риски могут быть смягчены:

  1. Применение машинного обучения для оптимизации параметров
  2. Установка адаптивных уровней остановки потерь
  3. Сокращение размеров позиций с целью снижения частоты торгов
  4. Включение потерь при остановке хранения

Руководство по оптимизации

Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:

  1. Испытание воздействия различных параметров фильтра для определения оптимального
  2. Попробуйте комбинировать другие индикаторы для фильтрации сигналов
  3. Улучшить логику входа для увеличения размера во время стадий ускорения тренда
  4. Установка адаптивного стоп-лосса на основе волатильности рынка
  5. Проведение анализа временных рядов по торговым сеансам и частотам

Заключение

В целом, стратегия Ehlers Instantaneous Trendline использует технические индикаторы для выявления трендов в реальном времени в акциях/фьючерсах и открытых позициях при обратном направлении трендов. Она имеет преимущества эффективной фильтрации шума, высокой настройки параметров, четкой логики генерации сигналов и встроенного контроля рисков. При дальнейшей оптимизации выбора параметров, фильтрации сигналов, размеров позиций и настройки стоп-лосса эта стратегия может достичь еще лучшей производительности.


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

Больше