트윈 최적화 트렌드 추적 전략

저자:차오장, 날짜: 2023-10-08 15:10:31
태그:

전반적인 설명

쌍둥이 최적화된 트렌드 추적 전략 (Twin Optimized Trend Tracker Strategy) 은 OTT 전략의 향상된 버전으로, 쌍둥이 OTT 라인과 변수 (coefficient) 를 결합하여 옆 시장에서 잘못된 신호를 더 잘 처리합니다. 이 전략은 터키의 상인 Anıl Özekşi에 의해 개발되었으며, 그는 비디오 튜토리얼에서 디자인 철학을 설명했습니다.

원칙

트윈 OTT 전략의 핵심은 두 가지 최적화된 트렌드 추적 라인 - OTT를 사용하여 트렌드 방향을 결정하는 것입니다. 먼저 이동 평균 MAvg를 계산하고, 그 다음 MAvg 값의 비율에 따라 긴 스톱 손실 라인 롱 스톱과 짧은 스톱 손실 라인 쇼트 스톱을 얻습니다. 가격이 롱 스톱 라인 위에 넘어가면 긴 신호이며, 쇼트 스톱 라인 아래에 넘어가면 짧은 신호입니다.

측면 시장에서 잘못된 신호를 처리하기 위해 전략은 다음 두 가지 측면을 개선합니다.

  1. 두 개의 수직적으로 이동된 OTT 라인, OTTup 및 OTTdn이 추가됩니다. 그들은 원래 OTT의 약간 상향 및 하향 이동입니다. 가격이 이 두 개의 이동된 라인을 통과 할 때만 유효한 거래 신호가 생성됩니다.

  2. 작은 계수 계수가 도입되어 더 나은 정확성을 위해 두 개의 이동된 OTT 라인을 정밀 조정합니다.

이 쌍둥이 OTT 디자인은 잘못된 신호를 피하기 위해 옆 시장에서 발생하는 대부분의 소음을 필터 할 수 있습니다. 트렌드 전환점을 파악하고 적시에 위치를 전환하는 데 도움이됩니다. 이것은 쌍둥이 OTT 전략의 가장 큰 장점입니다.

장점

  • 쌍둥이 OTT 라인 디자인은 잘못된 신호를 효과적으로 필터링하고 전략 안정성을 향상시킬 수 있습니다.
  • 추가 계수 계수는 OTT 라인이 시장에 더 잘 대응하도록 돕습니다.
  • 저자 Anıl Özekşi는 이해하기 쉬운 비디오 튜토리얼에서 전략 논리를 명확히 설명합니다.
  • 그것은 시장 트렌드를 결정하기 위해 EMA, 중지 손실 라인 같은 여러 기술적 지표를 결합
  • 저자 안일 오제키시는 유명한 터키 상인입니다.

위험성

  • OTT 지표 자체는 윙사 및 풀백 테스트를 수행하는 경향이 있습니다. 쌍둥이 OTT 디자인은이 문제를 완화합니다.
  • 격렬한 변동으로, 스톱 로스 라인은 자주 발생하여 오버 트레이딩을 유발할 수 있습니다.
  • 계수는 최적의 값을 위해 신중한 테스트가 필요합니다. 그렇지 않으면 효과를 약화합니다.
  • 튜토리얼은 터키어로 되어 있습니다. 언어 장벽으로 인해 논리에 대한 오해가 발생할 수 있습니다.
  • 역시험이 충분하지 않습니다. 전략을 확인하기 위해 더 많은 기간과 시장이 필요합니다.

대책:

  • 과도한 민감성을 방지하기 위해 스톱 손실 라인과 트윈 OTT 사이에 버퍼를 추가합니다.
  • 백테스트 결과에 따라 계수 설정을 최적화
  • 논리를 올바르게 이해하기 위해 튜토리얼 번역
  • 신뢰성을 확인하기 위해 더 많은 역사적 기간에 백테스트를 수행합니다.

최적화 방향

  • 기간 길이와 같은 매개 변수를 조정 가능한 입력
  • OTT 원칙에 더 잘 맞는 다른 유형의 이동 평균을 시도하십시오.
  • 각 거래기준에 대한 계율 최적화
  • 작은 거래 세션에서 잘못된 신호를 피하기 위해 필터를 추가합니다.
  • 변동성에 기반한 스톱 로스 라인을 동적으로 만들어라
  • 매개 변수를 자동으로 최적화하기 위해 기계 학습을 도입

요약하자면, 트윈 OTT 전략은 Anıl Özekşi의 OTT 경험을 완전히 활용하고 혁신을 합니다. 신뢰할 수 있고 사용자 정의 가능한 트렌드 추적 프레임워크가 될 가능성이 있습니다. 그러나 변화하는 시장에 적응하기 위해 지속적인 최적화와 테스트가 여전히 필요합니다.

결론

쌍둥이 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)

더 많은