Đánh dấu xu hướng năng động Chiến lược tối ưu

Tác giả:ChaoZhang, Ngày: 2024-01-12 11:20:04
Tags:

img

Tổng quan

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

Chiến lược logic

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

Phân tích lợi thế

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

Phân tích rủi ro

  1. Chỉ số CMO có tác dụng chậm, có thể bỏ lỡ các điểm chuyển đổi giá
  2. Việc phá vỡ đường dây hỗ trợ có thể tạo ra tín hiệu sai
  3. Tối ưu hóa dừng lỗ không chính xác có thể dẫn đến tổn thất lớn hơn

Giải pháp rủi ro:

  1. Điều chỉnh các thông số CMO đúng cách để giảm sự chậm trễ
  2. Thêm nhiều bộ lọc với các chỉ báo khác để tránh tín hiệu sai
  3. Thử nghiệm để xác định tỷ lệ tối ưu hóa stop loss phù hợp

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

  1. Thêm nhiều chỉ số để lọc các tín hiệu sai
  2. AI tối ưu hóa tự động phạm vi dừng lỗ
  3. Tự động điều chỉnh kích thước giao dịch

Tóm lại

Nhìn chung, chiến lược này hoạt động tốt, sử dụng đường hỗ trợ để xác định rõ hướng xu hướng. Kết hợp với chỉ số CMO và dừng lỗ tối ưu hóa, nó đạt được kết quả tốt. Nhưng có một số rủi ro của tín hiệu sai, có thể được cải thiện bằng cách kết hợp nhiều chỉ số hơn.


/*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)





Thêm nữa