Chiến lược theo dõi xu hướng OTT kép


Ngày tạo: 2023-10-08 15:10:31 sửa đổi lần cuối: 2023-10-08 15:10:31
sao chép: 0 Số nhấp chuột: 912
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược theo dõi xu hướng OTT kép là một chiến lược OTT được cải tiến, kết hợp các đường OTT kép và hệ số để đối phó tốt hơn với tín hiệu giả khi thị trường được điều chỉnh. Chiến lược này được phát triển bởi nhà giao dịch người Thổ Nhĩ Kỳ Anıl Özekşi, người đã giải thích chi tiết về ý tưởng thiết kế chiến lược này trong hướng dẫn video của mình.

Nguyên tắc

Cốt lõi của chiến lược OTT kép là sử dụng hai đường theo dõi xu hướng tối ưu OTT để đánh giá xu hướng. Nó đầu tiên tính toán đường trung bình di chuyển MAvg, sau đó lấy đường dừng dài và đường dừng ngắn dựa trên tỷ lệ phần trăm của giá trị MAvg.

Để xử lý các tín hiệu sai lệch của thị trường, chiến lược này đã cải thiện hai điểm sau:

  1. Thêm hai dòng OTT di chuyển theo chiều dọc, OTTup và OTTdn, chúng di chuyển lên và xuống một chút của OTT. Chỉ khi giá phá vỡ hai dòng di chuyển này, tín hiệu giao dịch thực sự sẽ được tạo ra.

  2. Một hệ số coef nhỏ được đưa ra để điều chỉnh hai đường OTT di chuyển, làm cho nó phù hợp với thị trường chính xác hơn.

Thông qua thiết kế OTT kép này, bạn có thể lọc phần lớn tiếng ồn của thị trường hoà giải, tránh tạo ra tín hiệu sai. Do đó, bạn có thể nắm bắt tốt hơn các điểm chuyển 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 kép.

Ưu điểm

  • Sử dụng thiết kế đường OTT kép có thể lọc hiệu quả các tín hiệu giả và tăng cường sự ổn định của chiến lược
  • Tăng hệ số coef điều chỉnh giúp các dòng OTT gần hơn với phản ứng của thị trường
  • Anıl Özekşi, tác giả của cuốn sách, đã chia sẻ chi tiết về chiến lược trong một video, giúp người dùng dễ dàng hiểu và nắm bắt.
  • Các chỉ số kỹ thuật khác nhau như EMA tổng hợp, đường dừng lỗ để đánh giá xu hướng thị trường
  • Anıl Özekşi là một nhà giao dịch nổi tiếng của Thổ Nhĩ Kỳ, có một số danh tiếng chuyên nghiệp.

Rủi ro

  • Các chỉ số OTT có thể gây ra nguy cơ rút lại bài kiểm tra, và thiết kế OTT kép có thể giảm thiểu vấn đề này.
  • Trong trường hợp biến động lớn, đường dừng có thể được kích hoạt thường xuyên, có nguy cơ giao dịch quá mức
  • Coefficient cần được kiểm tra cẩn thận để đạt được giá trị tối ưu, nếu không hiệu quả sẽ bị giảm giá
  • Video do tác giả là bài học tiếng Thổ Nhĩ Kỳ, rào cản ngôn ngữ có thể ảnh hưởng đến sự hiểu biết chính xác của thuật toán
  • Dữ liệu phản hồi không đầy đủ, cần xác minh hiệu quả của chiến lược trong thời gian dài hơn và nhiều thị trường hơn

Phản ứng:

  • Tăng vùng đệm giữa dây dừng và OTT kép, tránh quá nhạy cảm
  • Tối ưu hóa cài đặt hệ số coef để phù hợp hơn với kết quả phản hồi
  • Dịch hướng dẫn của tác giả để đảm bảo hiểu đúng về logic của thuật toán
  • Đánh giá lại trong nhiều bối cảnh lịch sử hơn để xác minh độ tin cậy của các tham số chiến lược

Hướng tối ưu hóa

  • Có thể xem xét đặt các tham số như cyclelength như giá trị đầu vào có thể điều chỉnh
  • Thử các loại trung bình di chuyển khác để tìm các thuật toán trung bình phù hợp hơn với nguyên tắc OTP
  • Kích thước của hệ số coef được tối ưu hóa theo các loại giao dịch khác nhau
  • Tăng cơ chế lọc để tránh các tín hiệu sai trong các khoảng thời gian giao dịch không chính
  • Chuyển đổi Stop Lines thành Dynamic Tracking, điều chỉnh theo tỷ lệ biến động trong thời gian thực
  • Thêm thuật toán học máy, sử dụng AI để tự động tối ưu hóa cài đặt tham số

Tóm lại, chiến lược OTT kép đã tận dụng kinh nghiệm của Anıl Özekşi về OTTp và tạo ra sự đổi mới. Nó có khả năng trở thành một khung chiến lược theo dõi xu hướng đáng tin cậy và có thể tùy chỉnh.

Tóm tắt

Chiến lược OTT kép thông qua đường theo dõi xu hướng tối ưu hóa kép và hệ số điều chỉnh tinh tế, có hiệu quả trong việc giải quyết vấn đề tín hiệu sai của thị trường. Nó sử dụng tư duy trung bình di chuyển hợp lý, hỗ trợ đường dừng để theo dõi xu hướng động. Chiến lược này đơn giản và thực tế, từ kinh nghiệm cá nhân của các nhà giao dịch nổi tiếng, đáng để nghiên cứu sâu hơn.

Mã nguồn chiến lược
/*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)