Стратегия отслеживания трендов с оптимизированными близнецами

Автор:Чао Чжан, Дата: 2023-10-08 15:10:31
Тэги:

Обзор

Стратегия Twin Optimized Trend Tracker - это улучшенная версия стратегии OTT, которая сочетает в себе двойные линии OTT и коэффициент для лучшего обработки ложных сигналов во время бокового рынка.

Принципы

Основой стратегии Twin OTT является определение направления тренда с использованием двух оптимизированных линий отслеживания тренда - OTT. Она сначала рассчитывает скользящую среднюю MAvg, затем получает длинную линию стоп-лосса longStop и короткую линию стоп-лосса shortStop на основе процента от значения MAvg. Когда цена пересекает линию longStop, это длинный сигнал, а когда она пересекает ниже линии shortStop, это короткий сигнал.

Чтобы справиться с ложными сигналами во время бокового рынка, стратегия улучшает следующие два аспекта:

  1. Добавляются две вертикально смещенные линии OTT, OTTup и OTTdn. Они представляют собой незначительные сдвиги вверх и вниз от оригинальной OTT. Только когда цена проходит через эти две смещенные линии, генерируются действительные торговые сигналы.

  2. Для тонкой настройки двух перемещенных линий OTT для повышения точности вводится небольшой коэффициент.

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

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

  • Дизайн двух линий OTT может эффективно фильтровать ложные сигналы и повышать стабильность стратегии
  • Дополнительный коэффициент помогает линиям OTT лучше реагировать на рынок
  • Автор Anıl Özekşi ясно объясняет логику стратегии в своих видеоуроках, которые легко понять
  • Он сочетает в себе множество технических индикаторов, таких как EMA, линии остановки потери для определения рыночных тенденций
  • Автор Anıl Özekşi - известный турецкий трейдер, что еще больше укрепляет доверие

Риски

  • Сам индикатор OTT имеет тенденцию к испытаниям и отзывам. Двойной дизайн OTT облегчает эту проблему.
  • При сильных колебаниях линии стоп-лосса могут часто запускаться, что приводит к переоценке.
  • Коэффициент коэффициента должен тщательно проверяться для получения оптимального значения, иначе он подрывает эффективность.
  • Учебники на турецком языке. Языковой барьер может привести к недопониманию логики.
  • Недостаточные обратные тесты, для проверки стратегии требуется больше периодов и рынков.

Противодействие:

  • Добавить буфер между линиями стоп-лосса и двойной OTT для предотвращения чрезмерной чувствительности
  • Оптимизировать настройки коэффициента в соответствии с результатами обратных испытаний
  • Переводить учебники для обеспечения правильного понимания логики
  • Проведение обратных тестов в более исторические периоды для проверки надежности

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

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

В целом, стратегия Twin OTT в полной мере использует опыт Anıl Özekşi и внедряет инновации. Она имеет потенциал стать надежной, настраиваемой структурой отслеживания трендов. Но для адаптации к изменяющимся рынкам все еще необходимы постоянная оптимизация и тестирование.

Заключение

Стратегия Twin OTT эффективно обрабатывает ложные сигналы во время боковых рынков с использованием двойных оптимизированных линий отслеживания тренда и коэффициента тонкой настройки. Для отслеживания тенденций она разумно использует концепции скользящих средних и динамических линий остановки убытков. Эта лаконичная и практичная стратегия основана на опыте известного трейдера, что делает ее полезной для глубоких исследований и применения. Но мы также должны знать о ее ограничениях и избегать самодовольства. Только путем непрерывной оптимизации и тщательного тестирования она может стать надежной стратегией отслеживания тренда.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic

//created by: @Anil_Ozeksi
//developer: ANIL ÖZEKŞİ
//author: @kivancozbilgic

strategy("Twin Optimized Trend Tracker","TOTT", overlay=true)
src = input(close, title="Source")
length=input(40, "OTT Period", minval=1)
percent=input(1, "Optimization Constant", type=input.float, step=0.1, minval=0)
coeff=input(0.001, "Twin OTT Coefficient", type=input.float, step=0.001, minval=0)
showsupport = input(title="Show Support Line?", type=input.bool, defval=true)
showsignalsk = input(title="Show Signals?", type=input.bool, defval=true)
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
OTTup=OTT*(1+coeff)
OTTdn=OTT*(1-coeff)

PPLOT=plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Support Line")

pALLup=plot(nz(OTTup[2]), color=color.green, linewidth=2, title="OTTup", transp=0)
pALLdn=plot(nz(OTTdn[2]), color=color.red, linewidth=2, title="OTTdown", transp=0)

buySignalk = crossover(MAvg, OTTup[2])
sellSignalk = crossunder(MAvg, OTTdn[2])
K1=barssince(buySignalk)
K2=barssince(sellSignalk)
O1=barssince(buySignalk[1])
O2=barssince(sellSignalk[1])

plotshape(buySignalk and showsignalsk and O1>K2 ? min(low-abs(roc(low,1)),OTTdn-abs(roc(low,1))) : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(sellSignalk and showsignalsk and O2>K1 ? max(high+abs(roc(high,1)),OTTup+abs(roc(high,1))) : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (O2>K1 ? color.green : na) : na
shortFillColor = highlighting ? (O1>K2 ? color.red : na) : na
fill(mPlot, PPLOT, title="UpTrend Highligter", color=longFillColor,transp=90)
fill(mPlot, PPLOT, title="DownTrend Highligter", color=shortFillColor,transp=90)
fill(pALLup, pALLdn, title="Flat Zone Highligter", color=color.blue,transp=90)



dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalk
    strategy.entry("Long", strategy.long)
if sellSignalk
    strategy.entry("Short", strategy.short)

Больше