Chiến lược theo dõi xu hướng Twin Optimized

Tác giả:ChaoZhang, Ngày: 2023-10-08 15:10:31
Tags:

Tổng quan

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.

Nguyên tắc

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:

  1. 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.

  2. 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.

Ưu điểm

  • Thiết kế hai đường OTT có thể lọc hiệu quả các tín hiệu sai và tăng tính ổn định chiến lược
  • Tỷ lệ hệ số bổ sung giúp các đường OTT đáp ứng tốt hơn với thị trường
  • Tác giả Anıl Özekşi giải thích logic chiến lược một cách rõ ràng trong các hướng dẫn video của mình, dễ hiểu
  • Nó kết hợp nhiều chỉ số kỹ thuật như EMA, đường dừng lỗ để xác định xu hướng thị trường
  • Tác giả Anıl Özekşi là một thương nhân Thổ Nhĩ Kỳ nổi tiếng, thêm vào sự tín nhiệm

Rủi ro

  • Bản thân chỉ số OTT có xu hướng thử nghiệm và rút lại.
  • Với biến động mạnh mẽ, các đường dừng lỗ có thể được kích hoạt thường xuyên, gây ra quá mức giao dịch.
  • Các hệ số cần kiểm tra cẩn thận cho giá trị tối ưu, nếu không nó làm suy yếu hiệu quả.
  • Các hướng dẫn là bằng tiếng Thổ Nhĩ Kỳ. Rào cản ngôn ngữ có thể dẫn đến hiểu lầm về logic.
  • Không đủ backtests, cần nhiều thời gian và thị trường hơn để xác minh chiến lược.

Các biện pháp đối phó:

  • Thêm một bộ đệm giữa các đường dừng lỗ và OTT đôi để ngăn ngừa độ nhạy quá mức
  • Tối ưu hóa các cài đặt hệ số theo kết quả backtest
  • Dịch các hướng dẫn để đảm bảo sự hiểu biết chính xác về logic
  • Tiến hành kiểm tra ngược qua nhiều giai đoạn lịch sử hơn để xác minh độ tin cậy

Hướng dẫn tối ưu hóa

  • Làm cho các tham số như thời gian dài đầu vào điều chỉnh
  • Hãy thử các loại trung bình động khác phù hợp hơn với các nguyên tắc OTT
  • Tối ưu hóa hệ số cho các công cụ giao dịch khác nhau riêng biệt
  • Thêm bộ lọc để tránh tín hiệu sai trong các phiên giao dịch nhỏ
  • Làm cho các đường dừng lỗ năng động dựa trên biến động
  • giới thiệu máy học để tự động tối ưu hóa các thông số

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.

Kết luận

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)

Thêm nữa