Chiến lược Twin Optimized Trend Tracker là một phiên bản nâng cao của chiến lược OTT kết hợp hai dòng OTT và một hệ số để xử lý tốt hơn các tín hiệu sai trong thị trường bên.
Cốt lõi của chiến lược Twin OTT là xác định hướng xu hướng bằng cách sử dụng hai đường theo dõi xu hướng tối ưu hóa - OTT. Đầu tiên nó tính toán đường trung bình động MAvg, sau đó lấy đường dừng lỗ dài longStop và đường dừng lỗ ngắn shortStop dựa trên tỷ lệ phần trăm của giá trị MAvg. Khi giá vượt qua đường longStop, đó là tín hiệu dài, và khi nó vượt qua dưới đường shortStop, đó là tín hiệu ngắn.
Để xử lý các tín hiệu sai trong thị trường bên cạnh, chiến lược cải thiện hai khía cạnh sau:
Hai đường OTT di chuyển theo chiều dọc, OTTup và OTTdn, được thêm vào. Chúng là sự dịch chuyển lên và xuống nhẹ của OTT ban đầu. Chỉ khi giá vượt qua hai đường di chuyển này, các tín hiệu giao dịch hợp lệ được tạo ra.
Một hệ số nhỏ được giới thiệu để điều chỉnh chính xác hai đường OTT bị dịch chuyển để có độ chính xác tốt hơn.
Với thiết kế OTT đôi này, hầu hết tiếng ồn từ thị trường bên có thể được lọc để tránh tín hiệu sai. Nó giúp nắm bắt các điểm chuyển hướng xu hướng và chuyển vị trí kịp thời. Đây là lợi thế lớn nhất của chiến lược OTT đôi.
Các biện pháp đối phó:
Tóm lại, chiến lược Twin OTT sử dụng đầy đủ kinh nghiệm OTT của Anıl Özekşi và tạo ra những đổi mới. Nó có tiềm năng trở thành một khuôn khổ theo dõi xu hướng đáng tin cậy, tùy chỉnh. Nhưng vẫn cần tối ưu hóa và thử nghiệm liên tục để thích nghi với thị trường thay đổi.
Chiến lược Twin OTT xử lý hiệu quả các tín hiệu sai trong các thị trường bên cạnh bằng cách sử dụng hai đường theo dõi xu hướng tối ưu hóa và hệ số điều chỉnh tốt. Nó sử dụng hợp lý các khái niệm trung bình chuyển động và đường dừng lỗ động để theo dõi xu hướng. Chiến lược ngắn gọn và thực tế này bắt nguồn từ kinh nghiệm trực tiếp của một nhà giao dịch nổi tiếng, khiến nó đáng để nghiên cứu và áp dụng sâu sắc. Nhưng chúng ta cũng nên nhận thức được những hạn chế của nó và tránh tự mãn. Chỉ thông qua tối ưu hóa liên tục và thử nghiệm nghiêm ngặt, nó có thể trở thành một chiến lược theo dõi xu hướng mạnh mẽ.
/*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)