Chiến lược giao dịch dài hạn dựa trên SuperTrend

Tác giả:ChaoZhang, Ngày: 2023-09-20 17:14:33
Tags:

Tổng quan

Chiến lược này xác định các cơ hội dài bằng cách sử dụng chỉ số SuperTrend. Nó sử dụng ATR và một trình nhân để xác định mức hỗ trợ năng động cho bước vào dài. Tập trung vào các giao dịch dài.

Chiến lược logic

  1. Các dải trên và dưới được tính dựa trên thời gian ATR, nhân.

  2. Xu hướng hiện tại được theo dõi, với 1 cho xu hướng tăng và -1 cho xu hướng giảm. Giá phá vỡ trên dải trên chuyển xu hướng từ dưới lên, tạo ra tín hiệu mua. Bước dưới dải dưới chuyển từ trên xuống, tạo ra tín hiệu bán.

  3. Một đường trung bình động được thêm vào như một bộ lọc xu hướng. Chỉ mua nếu giá trên MA khi phá vỡ trên dải trên. Chỉ bán nếu giá dưới MA khi phá vỡ dưới dải dưới. Điều này tránh các đột phá giả.

  4. Các trợ lý trực quan làm nổi bật xu hướng, tín hiệu vv để hỗ trợ việc ra quyết định.

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. SuperTrend theo dõi động sự thay đổi giá và phản ánh sự thay đổi xu hướng kịp thời.

  2. ATR dừng lỗ điều chỉnh dừng dựa trên biến động thị trường, giúp khóa lợi nhuận.

  3. Bộ lọc MA loại bỏ các tín hiệu sai từ tiếng ồn trong các thị trường khác nhau.

  4. Thiết kế trực quan trực quan trình bày cơ chế chiến lược và tình hình thị trường.

  5. Chỉ có sự đảo ngược xu hướng giao dịch làm cho nó phù hợp với việc nắm giữ dài hạn.

Phân tích rủi ro

Những rủi ro chính là:

  1. SuperTrend rất nhạy cảm với các thông số.

  2. Trong thị trường hỗn loạn, dừng có thể được kích hoạt thường xuyên.

  3. Không tính đến chi phí giao dịch.

  4. Không dừng lỗ có nghĩa là rủi ro rút vốn cao.

  5. Bộ lọc xu hướng có thể bỏ lỡ một số cơ hội.

Các rủi ro có thể được giảm bằng cách:

  1. Tối ưu hóa các thông số ATR để điều chỉnh tần số băng tần thấp hơn.

  2. Thêm bộ lọc thanh tương đương để tránh dừng lại bởi các dao động nhỏ tần số cao.

  3. Thực hiện dừng lỗ và lấy lợi nhuận để bảo vệ lợi nhuận.

  4. Điều chỉnh thời gian trung bình di chuyển để cân bằng hiệu ứng lọc.

  5. Tối ưu hóa quản lý tiền để giảm tác động chi phí giao dịch.

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

Chiến lược có thể được cải thiện trong các khía cạnh sau:

  1. Kiểm tra các nguồn giá khác nhau như gần, cao vv

  2. Hãy thử các chỉ báo dừng lỗ động khác như Chandelier Exit.

  3. Thêm kích thước vị trí để tối ưu hóa việc sử dụng vốn.

  4. Bao gồm các chỉ số biến động để tinh chỉnh các mục.

  5. Thực hiện dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro.

  6. Điều chỉnh các thông số cho các thị trường khác nhau.

  7. Khám phá máy học để tối ưu hóa tham số.

  8. Kết hợp các chỉ số khác để cải thiện độ chính xác của bộ lọc.

Kết luận

Chiến lược này sử dụng SuperTrend với các điểm dừng năng động để xác định xu hướng, và thêm một bộ lọc MA để xác định các mục dài. Thiết kế trực quan đơn giản hóa hoạt động. Với các tham số tối ưu và các tính năng bổ sung, nó có thể trở thành một chiến lược giao dịch dài hạn mạnh mẽ.


/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR = input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr = changeATR ? atr(Periods) : atr2

up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := close[1] > up1 ? max(up, up1) : up

dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn

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

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
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))

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
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))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
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 = 999)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       

window()  => time >= start and time <= finish ? true : false

longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())

shortCondition = sellSignal
if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short, when = window())

buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)


Thêm nữa