Chiến lược theo xu hướng năng động

ATR
Ngày tạo: 2024-06-03 16:57:51 sửa đổi lần cuối: 2024-06-03 16:57:51
sao chép: 4 Số nhấp chuột: 628
1
tập trung vào
1617
Người theo dõi

Chiến lược theo xu hướng năng động

Tổng quan

Chiến lược này sử dụng chỉ số Supertrend để nắm bắt xu hướng thị trường. Chỉ số Supertrend kết hợp giá và tỷ lệ biến động, biểu thị xu hướng tăng khi đường chỉ số màu xanh lá cây và xu hướng giảm khi màu đỏ. Chiến lược tạo ra tín hiệu mua bán bằng cách phát hiện sự thay đổi màu sắc của đường chỉ số, đồng thời sử dụng đường chỉ số làm điểm dừng động.

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

  1. Tính toán đường lên và đường xuống của chỉ số Supertrend và định hướng xu hướng hiện tại dựa trên mối quan hệ giữa giá đóng cửa và đường lên xuống.
  2. Khi xu hướng chuyển từ giảm ((-1) sang tăng ((1), tạo ra tín hiệu mua ((buySignal); khi xu hướng chuyển từ tăng ((1) sang giảm ((-1), tạo ra tín hiệu bán ((sellSignal)
  3. Khi tạo ra tín hiệu mua, mở vị trí làm nhiều và đặt điểm dừng xuống đường ray ((dn); khi tạo ra tín hiệu bán, mở vị trí làm trống và đặt điểm dừng lên đường ray ((up)).
  4. Lập ra logic dừng di động, khi giá tăng / giảm một số điểm (trailingValue), dừng sẽ di chuyển lên / xuống, để thực hiện bảo vệ dừng.
  5. Tiến hành logic dừng cố định, khi xu hướng thay đổi, vị trí yên sẽ thu được lợi nhuận.

Lợi thế chiến lược

  1. Khả năng thích ứng: Chỉ số Supertrend kết hợp giá cả và tỷ lệ biến động, có thể thích ứng với các tình trạng thị trường và các loại giao dịch khác nhau.
  2. Hạn chế động: Sử dụng đường chỉ số như là điểm dừng động, có thể kiểm soát rủi ro hiệu quả, giảm tổn thất.
  3. Hạn chế di chuyển: giới thiệu logic dừng di chuyển, có thể bảo vệ lợi nhuận và tăng lợi nhuận của chiến lược khi xu hướng tiếp tục.
  4. Dấu hiệu rõ ràng: Dấu hiệu mua và bán được tạo ra bởi chiến lược rõ ràng, dễ vận hành và thực hiện.
  5. Tính linh hoạt của tham số: Các tham số của chiến lược (ví dụ như chu kỳ ATR, số lần ATR, v.v.) có thể được điều chỉnh theo đặc điểm thị trường và phong cách giao dịch để cải thiện khả năng thích ứng.

Rủi ro chiến lược

  1. Rủi ro tham số: Các thiết lập tham số khác nhau có thể dẫn đến sự khác biệt lớn trong hiệu suất của chiến lược, cần phải kiểm tra lại đầy đủ và tối ưu hóa tham số.
  2. Rủi ro thị trường chấn động: Trong thị trường chấn động, sự thay đổi xu hướng thường xuyên có thể dẫn đến việc chiến lược tạo ra nhiều tín hiệu giao dịch hơn, làm tăng chi phí giao dịch và rủi ro trượt.
  3. Rủi ro thay đổi xu hướng: Khi xu hướng thị trường thay đổi đột ngột, chiến lược có thể không điều chỉnh vị trí kịp thời, dẫn đến tổn thất lớn hơn.
  4. Rủi ro tối ưu hóa quá mức: tối ưu hóa quá mức cho chiến lược có thể dẫn đến đường cong phù hợp và không hoạt động tốt trong thị trường tương lai.

Hướng tối ưu hóa chiến lược

  1. Tiếp theo, các nhà phân tích đã đưa ra phân tích nhiều khung thời gian, xác nhận sự ổn định của xu hướng và giảm giao dịch thường xuyên trong thị trường bất ổn.
  2. Kết hợp với các chỉ số kỹ thuật hoặc các yếu tố cơ bản khác để tăng độ chính xác trong việc đánh giá xu hướng.
  3. Tối ưu hóa logic dừng lỗ và dừng chân, chẳng hạn như giới thiệu dừng động hoặc tỷ lệ lợi nhuận rủi ro, để tăng tỷ lệ lợi nhuận của chiến lược.
  4. Kiểm tra tính ổn định của các tham số, chọn các tham số có thể hoạt động tốt trong các tình trạng thị trường khác nhau.
  5. Đưa ra các quy tắc quản lý vị trí và quản lý tài chính, kiểm soát rủi ro giao dịch đơn lẻ và rủi ro tổng thể.

Tóm tắt

Chiến lược theo dõi xu hướng động sử dụng chỉ số Supertrend để nắm bắt xu hướng thị trường, kiểm soát rủi ro bằng cách dừng động và dừng động, đồng thời sử dụng dừng cố định để khóa lợi nhuận. Chiến lược này có khả năng thích ứng, tín hiệu rõ ràng và dễ vận hành. Tuy nhiên, trong ứng dụng thực tế, cần chú ý đến các vấn đề như tối ưu hóa tham số, rủi ro thị trường xung đột và rủi ro thay đổi xu hướng.

Mã nguồn chiến lược
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Supertrend Strategy', overlay=true, format=format.price, precision=2)
Periods = input.int(title='ATR Period', defval=10)
src = input.source(hl2, title='Source')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0)
changeATR = input.bool(title='Change ATR Calculation Method ?', defval=true)
showsignals = input.bool(title='Show Buy/Sell Signals ?', defval=true)
highlighting = input.bool(title='Highlighter On/Off ?', defval=true)

// ATR calculation
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2

// Supertrend calculations
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn

// Trend direction
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Plotting
upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))

dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))

// Highlighting
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? trend == 1 ? color.green : color.white : color.white
shortFillColor = highlighting ? trend == -1 ? color.red : color.white : color.white
fill(mPlot, upPlot, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, dnPlot, title='DownTrend Highligter', color=shortFillColor, transp=90)

// Alerts
alertcondition(buySignal, title='SuperTrend Buy', message='SuperTrend Buy!')
alertcondition(sellSignal, title='SuperTrend Sell', message='SuperTrend Sell!')
changeCond = trend != trend[1]
alertcondition(changeCond, title='SuperTrend Direction Change', message='SuperTrend has changed direction!')

// Pip and trailing stop calculation
pips = 50
pipValue = syminfo.mintick * pips
trailingPips = 10
trailingValue = syminfo.mintick * trailingPips

// Strategy
if (buySignal)
    strategy.entry("Long", strategy.long, stop=dn, comment="SuperTrend Buy")
if (sellSignal)
    strategy.entry("Short", strategy.short, stop=up, comment="SuperTrend Sell")

// Take profit on trend change
if (changeCond and trend == -1)
    strategy.close("Long", comment="SuperTrend Direction Change")
if (changeCond and trend == 1)
    strategy.close("Short", comment="SuperTrend Direction Change")

// Initial Stop Loss
longStopLevel = up - pipValue
shortStopLevel = dn + pipValue

// Trailing Stop Loss
var float longTrailStop = na
var float shortTrailStop = na

if (strategy.opentrades > 0)
    if (strategy.position_size > 0)  // Long position
        if (longTrailStop == na or close > strategy.position_avg_price + trailingValue)
            longTrailStop := high - trailingValue
        strategy.exit("Stop Loss Long", from_entry="Long", stop=longTrailStop)
    if (strategy.position_size < 0)  // Short position
        if (shortTrailStop == na or close < strategy.position_avg_price - trailingValue)
            shortTrailStop := low + trailingValue
        strategy.exit("Stop Loss Short", from_entry="Short", stop=shortTrailStop)

// Initial Exit
strategy.exit("Initial Stop Loss Long", from_entry="Long", stop=longStopLevel)
strategy.exit("Initial Stop Loss Short", from_entry="Short", stop=shortStopLevel)