Стратегия отслеживания трендов в многочасовом диапазоне на основе супертенденций

Автор:Чао Чжан, Дата: 2024-02-21 11:05:17
Тэги:

img

Обзор

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

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

Стратегия восстанавливает значения индикатора Supertrend из более высокого временного интервала (по умолчанию 4x текущего временного интервала) путем вызова функции безопасности. Индикатор Supertrend состоит из двух линий: линии Supertrend и линии тренда. Линия Supertrend выше линии тренда является бычьим сигналом, а ниже - медвежьим сигналом.

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

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

Преимущества

  • Фильтрует шум из более низких временных рамок с использованием информации о структуре рынка из более высоких tf
  • Более надежные сигналы от объединения анализа нескольких временных рамок
  • Настраиваемые параметры Supertrend для оптимизации стратегии
  • Встроенные настройки диапазона дат для ограничения периода обратного тестирования

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

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

Решения:

  • Настройки более высоких временных рамок для уменьшения задержки сигнала
  • Добавление других показателей для подтверждения суждений о более длительных сроках
  • Оптимизировать параметры Supertrend для улучшения качества сигнала
  • Постепенно расширять период обратного тестирования для проверки надежности

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

Эта стратегия может быть улучшена в нескольких областях:

  1. Оптимизировать параметры Supertrend для наилучшей комбинации параметров
  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)


Больше