Chiến lược siêu xu hướng là một chiến lược theo dõi xu hướng dựa trên tính toán sóng thực trung bình. Nó sử dụng sóng thực trung bình để thiết lập đường dừng để xác định hướng xu hướng bằng cách đánh giá liệu giá có phá vỡ đường dừng hay không, để tạo ra tín hiệu giao dịch.
Chiến lược này đầu tiên tính toán ATR của tần số thực trung bình trong một khoảng thời gian nhất định. Sau đó tính toán đường dừng dài và đường dừng ngắn dựa trên giá trị ATR nhân với hệ số thu nhỏ. Các phương pháp tính toán cụ thể như sau:
atr = mult * atr(length)
longStop = hl2 - atr
shortStop = hl2 + atr
Trong đó, length là độ dài chu kỳ tính toán của ATR, và mult là hệ số thu nhỏ của ATR.
Sau khi tính toán đường dừng, chiến lược tiếp tục đánh giá liệu giá có phá vỡ đường dừng của một đường K để xác định hướng xu hướng hay không:
dir := dir == -1 and close > shortStopPrev ? 1 :
dir == 1 and close < longStopPrev ? -1 : dir
Khi phá vỡ đường dừng đường dài, nó được coi là xu hướng chuyển đổi nhiều, khi phá vỡ đường dừng đường ngắn, nó được coi là xu hướng chuyển đổi.
Các tín hiệu mua và bán được tạo ra dựa trên sự thay đổi hướng của xu hướng:
buySignal = dir == 1 and dir[1] == -1
sellSignal = dir == -1 and dir[1] == 1
Cuối cùng, thực hiện các hoạt động giao dịch tương ứng khi có tín hiệu mua và bán.
Sử dụng chiều dài sóng thực trung bình để tính toán đường dừng, nó có thể loại bỏ hiệu quả tiếng ồn thị trường và nắm bắt các tín hiệu xu hướng đáng tin cậy hơn.
Các tham số chiến lược ít hơn, dễ hiểu và vận hành. Chu kỳ ATR và hệ số nhân có thể được điều chỉnh để phù hợp với môi trường thị trường khác nhau.
Sử dụng đường dừng phá vỡ để đánh giá thay đổi hướng xu hướng, có thể kiểm soát rủi ro một cách hiệu quả và dừng lỗ kịp thời.
Có thể cấu hình giao dịch nhiều hoặc hai chiều, đáp ứng phong cách giao dịch khác nhau.
Có thể được sử dụng trong bất kỳ khoảng thời gian nào và áp dụng cho nhiều loại giao dịch.
Trong trường hợp chấn động, giá trị ATR có thể được nâng cao, dẫn đến đường dừng quá rộng, tạo ra nhiều tín hiệu giả hơn.
Không thể xác định được sự kết hợp tham số tối ưu, chu kỳ ATR và số lần cần được tối ưu hóa theo tình hình thị trường.
Không thể xác định được chu kỳ giao dịch tốt nhất cho các loại giao dịch, cần thử nghiệm cho từng loại giao dịch.
Không thể xác định thời gian nhập cảnh tốt nhất, có một số chậm trễ.
Có một số rủi ro trống, có thể ở trong trạng thái trống khi xu hướng yếu hơn.
Có nguy cơ phá vỡ mức dừng, nên nới lỏng mức dừng thích hợp.
Bạn có thể xem xét việc lọc kết hợp với các chỉ số khác để tránh tín hiệu sai trong tình huống chấn động. Ví dụ: MACD, RSI, v.v.
Có thể sử dụng học máy hoặc thuật toán di truyền để tìm kiếm sự kết hợp tham số tốt nhất.
Các tham số có thể được tối ưu hóa cho các giống khác nhau để xác định chu kỳ ATR và hệ số nhân tối ưu.
Có thể kết hợp các chỉ số về số lượng để xác định thời gian nhập học, chẳng hạn như số lượng giao dịch, tránh nhập học sớm.
Bạn có thể xem xét sử dụng chiến lược khóa, giữ vị trí khi vị trí trống.
Có thể mở rộng phạm vi dừng lỗ thích hợp và kết hợp với chỉ số cường độ xu hướng để tối ưu hóa vị trí dừng lỗ.
Chiến lược siêu xu hướng là một trong những chiến lược theo dõi xu hướng đáng tin cậy và có thể kiểm soát rủi ro hơn. Chiến lược này rất đơn giản và dễ sử dụng, phù hợp với nhiều loại giao dịch, nhưng cần được tối ưu hóa cho các tham số và quy tắc chiến lược để có hiệu quả tốt hơn trong các thị trường khác nhau.
/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("SuperTrend Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000)
LongOnly = input(title="Long Only ?", type=input.bool, defval=true)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=true)
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date 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=2019, title="From Year", minval=1970)
// To Date Inputs
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=2020, title="To Year", minval=1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
////////////////////////////////////////////////////////////////////////////////
atr = mult * atr(length)
longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 :
dir == 1 and close < longStopPrev ? -1 : dir
longColor = color.green
shortColor = color.red
plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)
plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)
if LongOnly
if buySignal and time_cond
strategy.entry("Long", strategy.long, comment="Long")
if(sellSignal and time_cond)
strategy.close("Long")
else
if buySignal and time_cond
strategy.entry("Long", strategy.long, comment="Long")
else
strategy.cancel("Long")
if sellSignal and time_cond
strategy.entry("Short", strategy.short, comment="Short")
else
strategy.cancel("Short")
if not time_cond
strategy.close_all()