Chiến lược tối ưu hóa theo dõi xu hướng động


Ngày tạo: 2024-01-12 11:20:04 sửa đổi lần cuối: 2024-01-12 11:20:04
sao chép: 2 Số nhấp chuột: 551
1
tập trung vào
1617
Người theo dõi

Chiến lược tối ưu hóa theo dõi xu hướng động

Tổng quan

Chiến lược này vẽ đường hỗ trợ bằng cách tính toán các chỉ số CMO và tỷ lệ thay đổi. Nó tạo ra tín hiệu giao dịch khi giá vượt qua đường hỗ trợ. Đồng thời, chiến lược này cũng khóa thêm lợi nhuận bằng cách tối ưu hóa phạm vi dừng lỗ gần đường hỗ trợ.

Nguyên tắc chiến lược

  1. Tính toán chỉ số CMO để xác định xu hướng giá cả
  2. Tính biến đổi Var, phản ánh xu hướng thay đổi giá
  3. Hình vẽ đường hỗ trợ theo tỷ lệ thay đổi
  4. Tính toán đường dừng tối ưu longStop và shortStop
  5. Tạo tín hiệu giao dịch khi giá vượt qua ngưỡng hỗ trợ

Phân tích lợi thế

  1. Sử dụng chỉ số CMO để đánh giá xu hướng giá và tránh phá vỡ giả
  2. Dòng hỗ trợ có thể xác định rõ xu hướng
  3. Đường dừng tối ưu hóa có thể khóa nhiều lợi nhuận hơn
  4. Các tín hiệu giao dịch đơn giản, rõ ràng và dễ theo dõi

Phân tích rủi ro

  1. Chỉ số CMO bị tụt hậu, có thể bỏ lỡ điểm biến đổi giá
  2. Dòng hỗ trợ bị phá vỡ có thể tạo ra tín hiệu giả.
  3. Không tối ưu hóa phạm vi dừng lỗ có thể dẫn đến tổn thất lớn hơn

Phương pháp giải quyết rủi ro:

  1. Điều chỉnh các tham số CMO để giảm sự chậm trễ
  2. Kết hợp các chỉ số khác để lọc các tín hiệu giả
  3. Thử nghiệm xác định tỷ lệ tối ưu hóa lỗ hổng phù hợp

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

  1. Các chỉ số khác được kết hợp, lọc các tín hiệu giả
  2. AI tự động tối ưu hóa phạm vi dừng lỗ
  3. Tự động điều chỉnh khối lượng giao dịch

Tóm tắt

Chiến lược này hoạt động tốt, sử dụng đường hỗ trợ để xác định rõ xu hướng. Tuy nhiên, có một số rủi ro về tín hiệu sai, có thể được tối ưu hóa bằng cách kết hợp nhiều chỉ số.

Mã nguồn chiến lược
/*backtest
start: 2024-01-04 00:00:00
end: 2024-01-11 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna

//@version=4
strategy("Optimized Trend Tracker - Strategy Version", shorttitle="OTT-Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent)

src = input(close, title="Source")
pds=input(1, "OTT Period", minval=1)
percent=input(0.1, "OTT Percent", type=input.float, step=0.1, minval=0)
condition = input(title="Condition", defval="Support Line Crossing Signals", options=["Price/OTT Crossing Signals", "Support Line Crossing Signals"])
showsupport = input(title="Show Support Line?", type=input.bool, defval=true)
highlight = input(title="Show OTT Color Changes?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloing = input(title="Barcolor On/Off ?", type=input.bool, defval=true)
showlabels = input(title="Show OTT BUY/SELl Labels?", type=input.bool, defval=false)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

alpha=2/(pds+1)
ud1=src>src[1] ? src-src[1] : src
dd1=src<src[1] ? src[1]-src : src
UD=sum(ud1,9)
DD=sum(dd1,9)
CMO=(UD-DD)/(UD+DD)
k= abs(CMO)
Var=0.0
Var:=(alpha*k*src)+(1-alpha*k)*nz(Var[1])
fark=Var*percent*0.01
longStop = Var - fark
longStopPrev = nz(longStop[1], longStop)
longStop := Var > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  Var + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := Var < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and Var > shortStopPrev ? 1 : dir == 1 and Var < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=Var>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
plot(showsupport ? Var : na, color=#0585E1, linewidth=2, title="Support Line")
OTTC = highlight ? OTT[2] > OTT[3] ? color.green : color.red : #B800D9 
pALL=plot(nz(OTT[2]), color=OTTC, linewidth=2, title="OTT", transp=0)

buySignalk = window() and crossover(Var, OTT[2])
sellSignallk = window() and crossunder(Var, OTT[2])
buySignalc = window() and crossover(src, OTT[2])
sellSignallc = window() and crossunder(src, OTT[2])

plotshape(condition == "Support Line Crossing Signals" ? showlabels and buySignalk ? OTT*0.995 : na : showlabels and buySignalc ? OTT*0.995 : na, title="BUY", text="BUY", location=location.belowbar, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
plotshape(condition == "Support Line Crossing Signals" ? showlabels and sellSignallk ? OTT*1.005 : na : showlabels and sellSignallc ? OTT*1.005 : na, title="SELL", text="SELL", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
  
ottBuyColor=#77DD77
ottSellColor=#FF0000
vColor = strategy.position_size > 0 ? ottBuyColor : ottSellColor

if condition == "Support Line Crossing Signals"
    strategy.entry("BUY", true, 1, when = buySignalk)
    strategy.entry("SELL", false, 1, when = sellSignallk)
else
    strategy.entry("BUY", true, 1, when = buySignalc)
    strategy.entry("SELL", false, 1, when = sellSignallc)

mPlot = plot(close, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (Var>OTT ? color.green : na) : na
shortFillColor = highlighting ? (Var<OTT ? color.red : na) : na
fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

barcolor(barcoloing ? vColor : na)