Стратегии следования за трендом, основанные на трансцендентных временных рамках


Дата создания: 2024-02-21 11:05:17 Последнее изменение: 2024-02-21 11:05:17
Копировать: 0 Количество просмотров: 690
1
Подписаться
1617
Подписчики

Стратегии следования за трендом, основанные на трансцендентных временных рамках

Обзор

Основная идея этой стратегии заключается в том, чтобы идентифицировать рыночные тенденции в сочетании с несколькими временными рамками, используя показатели превышения на высоких временных рамках в качестве фильтров, чтобы посылать сигналы покупки и продажи на низких временных рамках. Эта стратегия направлена на использование информации о структуре рынка, предоставляемой высокими временными рамками, для повышения качества торговых решений.

Стратегический принцип

Эта стратегия получает значение показателя превышения высокого временного фрейма (по умолчанию в 4 раза превышает текущий временный фрейм) с помощью вызова функции security. Показатель превышения включает в себя две линии: линию превышения и линию тренда.

Эта стратегия использует направление сверхтенденции высоких временных рамок в качестве условия фильтрации и посылает торговый сигнал только тогда, когда направление сверхтенденции низких временных рамок совпадает с направлением сверхтенденции высоких временных рамок. То есть, эта стратегия делает больше или меньше, когда только индикаторы сверхтенденции на двух временных рамах посылают однонаправленные сигналы.

Это позволяет избежать помех от шума рынка в низких временных рамках, повышая надежность сигналов. В то же время используйте высокие временные рамки, чтобы оценить структуру рынка и принять правильные решения в целом.

Стратегические преимущества

  • Использование информации о структуре рынка, предоставляемой высокими временными рамками, для фильтрации шума низких временных рамок и повышения качества торговых решений
  • Анализ по нескольким временным рамкам делает торговые сигналы более надежными
  • Настраиваемые параметры сверхтенденционных индикаторов, оптимизация стратегий покупки и продажи
  • Встроенный диапазон дат, ограничивающий диапазон времени отслеживания

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

  • Сигналы высоких временных рамок задерживаются, возможно, пропускается возможность короткой линии
  • Высокая вероятность ошибок в определении структуры рынка
  • Сами индикаторы сверхтенденции могут давать ошибочные сигналы
  • Ограничения в диапазоне времени отслеживания могут игнорировать важные данные и влиять на точность результатов тестирования.

Решение проблемы:

  • Устройство высоких временных рамок для снижения задержки сигналов
  • В сочетании с другими показателями, подтверждающими высокие структурные оценки временных рамок
  • Оптимизация параметров индикатора сверхтенденции для улучшения качества сигнала
  • Постепенное расширение диапазона времени отсчета, устойчивость стратегии тестирования

Направление оптимизации стратегии

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

  1. Оптимизация параметров сверхтенденционного индикатора, поиск оптимальной комбинации параметров
  2. Добавление других показателей в комбинации с образованием многофакторной модели
  3. Тестирование различных комбинаций высоких и низких временных рамок
  4. Добавление механизмов сдерживания убытков для контроля рисков
  5. Динамическая настройка гиперпараметров в сочетании с алгоритмами машинного обучения

Методы, такие как оптимизация параметров, комбинирование показателей, улучшение остановочных потерь и внедрение машинного обучения, могут значительно повысить эффективность стратегии отслеживания тенденций в многократных временных рамках.

Подвести итог

Эта стратегия искусно использует трендовые суждения высоких временных рамок для руководства выполнением сделок в низких временных рамах. Такая многовременная конструкция может эффективно фильтровать рыночный шум и выявлять более четкое направление тенденции. В то же время встроенная функция установки даты делает отсчет более гибким.

Исходный код стратегии
/*backtest
start: 2023-02-14 00:00:00
end: 2024-02-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)