Тенденция после стратегии, основанной на кроссовере TEMA с несколькими временными рамками

Автор:Чао Чжан, Дата: 2023-12-25 14:20:36
Тэги:

img

Обзор

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

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

Стратегия использует два индикатора TEMA, один с быстрой и медленной линией, основанной на 5 и 15 периодах, а другой на основе более высоких временных рамок, определенных пользователем, таких как ежедневные или еженедельные.

Когда более высокая временная линия TEMA пересекает более медленную линию, длинный вход может быть задействован, когда более низкая временная линия TEMA пересекает более медленную линию; сигнал выхода подается, когда быстрая линия пересекает ниже медленной линии. Аналогично, когда более высокая временная линия TEMA падает ниже медленной линии, короткий вход запускается на более низких временных рамках TEMA медленный перекресток и выход, когда происходит быстрый перекресток.

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

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

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

  1. TEMA имеет задерживающий эффект, может пропустить первоначальное изменение цены
  2. Краткосрочные корректировки на более высокие TF могут привести к ненужным обратным сделкам
  3. Неправильное установление более высокого TF не отражает реальной тенденции
  4. Неправильное установление нижнего TF увеличивает риск остановки потери

Решения рисков:

  1. Тонкие параметры TEMA для баланса
  2. Умеренное ослабление маржи стоп-лосса
  3. Оптимизировать настройки высоких и низких циклов
  4. Устойчивость параметров испытания для различных продуктов

Возможности для расширения

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

Резюме

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-12-24 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/
// © Seltzer_

//@version=4
strategy(title="TEMA Cross +HTF Backtest", shorttitle="TEMA_X_+HTF_BT", overlay=true)

orderType = input("Longs+Shorts",title="What type of Orders", options=["Longs+Shorts","LongsOnly","ShortsOnly"])
isLong   = (orderType != "ShortsOnly")
isShort  = (orderType != "LongsOnly")

// Backtest Section {

// Backtest inputs
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2020, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2017)

// Define backtest timewindow
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() => true

// }

//TEMA Section {

//LTF Section
xLength = input(20, minval=1, title="Fast Length")
xPrice = close
xEMA1 = ema(xPrice, xLength)
xEMA2 = ema(xEMA1, xLength)
xEMA3 = ema(xEMA2, xLength)
xnRes = (3 * xEMA1) - (3 * xEMA2) + xEMA3
xnResP = plot(xnRes, color=color.green, linewidth=2, title="TEMA1")

yLength = input(60, minval=1, title="Slow Length")
yPrice = close
yEMA1 = ema(yPrice, yLength)
yEMA2 = ema(yEMA1, yLength)
yEMA3 = ema(yEMA2, yLength)
ynRes = (3 * yEMA1) - (3 * yEMA2) + yEMA3
ynResP = plot(ynRes, color=color.red, linewidth=2, title="TEMA2")

fill(xnResP, ynResP, color=xnRes > ynRes ? color.green : color.red, transp=65, editable=true)

//HTF Section
HTFres = input(defval="D", type=input.resolution, title="HTF Resolution")

HTFxLength = input(5, minval=1, title="HTF Fast Length")
HTFxPrice = close
HTFxEMA1 = security(syminfo.tickerid, HTFres, ema(HTFxPrice, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA2 = security(syminfo.tickerid, HTFres, ema(HTFxEMA1, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA3 = security(syminfo.tickerid, HTFres, ema(HTFxEMA2, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxnRes = (3 * HTFxEMA1) - (3 * HTFxEMA2) + HTFxEMA3
HTFxnResP = plot(HTFxnRes, color=color.yellow, linewidth=1,transp=30, title="TEMA1")

HTFyLength = input(15, minval=1, title="HTF Slow Length")
HTFyPrice = close
HTFyEMA1 = security(syminfo.tickerid, HTFres, ema(HTFyPrice, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA2 = security(syminfo.tickerid, HTFres, ema(HTFyEMA1, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA3 = security(syminfo.tickerid, HTFres, ema(HTFyEMA2, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFynRes = (3 * HTFyEMA1) - (3 * HTFyEMA2) + HTFyEMA3
HTFynResP = plot(HTFynRes, color=color.purple, linewidth=1, transp=30, title="TEMA2")

fill(HTFxnResP, HTFynResP, color=HTFxnRes > HTFynRes ? color.yellow : color.purple, transp=90, editable=true)
bgcolor(HTFxnRes > HTFynRes ? color.yellow : na, transp=90, editable=true)
bgcolor(HTFxnRes < HTFynRes ? color.purple : na, transp=90, editable=true)

// }

// Buy and Sell Triggers
LongEntryAlert = xnRes > ynRes and HTFxnRes > HTFynRes and window()
LongCloseAlert = xnRes < ynRes and window()
ShortEntryAlert = xnRes < ynRes and HTFxnRes < HTFynRes and window()
ShortCloseAlert = xnRes > ynRes

// Entry & Exit signals
if isLong
    strategy.entry("Long", strategy.long, when = LongEntryAlert)
    strategy.close("Long", when = LongCloseAlert)

if isShort
    strategy.entry("Short", strategy.short, when = ShortEntryAlert)
    strategy.close("Short", when = ShortCloseAlert)

Больше