쌍둥이 최적화된 트렌드 추적 전략 (Twin Optimized Trend Tracker Strategy) 은 OTT 전략의 향상된 버전으로, 쌍둥이 OTT 라인과 변수 (coefficient) 를 결합하여 옆 시장에서 잘못된 신호를 더 잘 처리합니다. 이 전략은 터키의 상인 Anıl Özekşi에 의해 개발되었으며, 그는 비디오 튜토리얼에서 디자인 철학을 설명했습니다.
트윈 OTT 전략의 핵심은 두 가지 최적화된 트렌드 추적 라인 - OTT를 사용하여 트렌드 방향을 결정하는 것입니다. 먼저 이동 평균 MAvg를 계산하고, 그 다음 MAvg 값의 비율에 따라 긴 스톱 손실 라인 롱 스톱과 짧은 스톱 손실 라인 쇼트 스톱을 얻습니다. 가격이 롱 스톱 라인 위에 넘어가면 긴 신호이며, 쇼트 스톱 라인 아래에 넘어가면 짧은 신호입니다.
측면 시장에서 잘못된 신호를 처리하기 위해 전략은 다음 두 가지 측면을 개선합니다.
두 개의 수직적으로 이동된 OTT 라인, OTTup 및 OTTdn이 추가됩니다. 그들은 원래 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)