Chiến lược này sử dụng chỉ số Supertrend để xác định xu hướng giá và đi vào các vị trí dài hoặc ngắn khi xu hướng thay đổi. Chiến lược cho phép điều chỉnh thời gian ATR và nhân để tối ưu hóa các thông số. Nó cũng cung cấp tùy chọn để thay đổi phương pháp tính toán ATR cho các kết quả hơi khác nhau.
Chiến lược này có built-in backtesting date ranges và khả năng giao dịch chỉ trong một số thời gian nhất định trong ngày và đóng tất cả các giao dịch vào cuối khung thời gian đó. Điều này đặc biệt hữu ích cho các cổ phiếu giao dịch trong ngày. Khi tùy chọn khung thời gian được bật, bạn có thể chọn nhập vị trí hiện tại ngay lập tức khi khung thời gian bắt đầu, hoặc chờ thay đổi xu hướng để nhập vị trí đầu tiên.
Chiến lược này cũng cho phép bạn xác định mức dừng lỗ dựa trên tỷ lệ phần trăm và lấy lợi nhuận. Trong hầu hết các trường hợp, lệnh dừng dựa trên ATR được cung cấp bởi Supertrend tự nó làm cho một lệnh dừng lỗ bổ sung không cần thiết. Vì vậy, bạn có thể chỉ bật lấy lợi nhuận để tối ưu hóa cơ chế thoát.
Cuối cùng, có các trường cảnh báo tùy chỉnh cho các thông báo nhập và xuất để được sử dụng với các dịch vụ giao dịch tự động.
Chiến lược Supertrend dựa trên các nguyên tắc chính sau:
Tính toán giá trị ATR: Có thể chọn giữa tính toán SMA hoặc chỉ số ATR tích hợp. Công thức SMA:
atr2 = sma(tr, Periods)
Tính toán các dải trên và dưới. Dải trên là gần trừ ATR nhân ATR. Dải dưới là gần cộng với nhân ATR.
up = close - (Multiplier * atr)
dn = close + (Multiplier * atr)
Xác định hướng xu hướng bằng cách so sánh giá với dải. Xu hướng tăng khi giá vượt qua dải dưới. Xu hướng giảm khi giá vượt qua dải trên.
trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
Tạo tín hiệu giao dịch về sự thay đổi xu hướng, ví dụ như tín hiệu bán khi thay đổi từ xu hướng tăng lên xu hướng giảm:
sellSignal = trend == -1 and trend[1] == 1
Bộ lọc nhập dựa trên tín hiệu và các điều kiện bổ sung.
Sử dụng dừng lỗ và lấy lợi nhuận để khóa lợi nhuận hoặc hạn chế rủi ro.
Đây là các nguyên tắc hoạt động chính đằng sau chiến lược Supertrend. Kết hợp với tối ưu hóa tham số, nó có thể tạo ra kết quả giao dịch tốt.
Chiến lược Supertrend có một số lợi thế:
Bản thân Supertrend xác định hiệu quả xu hướng và thường được sử dụng để dừng lại.
Các thông số ATR có thể tùy chỉnh có thể được tối ưu hóa trên các sản phẩm để phù hợp nhất.
Các phạm vi thời gian giao dịch trực tiếp và backtest có thể cấu hình phù hợp với các phiên giao dịch khác nhau.
Tùy chọn để tham gia giao dịch đầu tiên ngay lập tức hoặc chờ tín hiệu phục vụ cho các sản phẩm khác nhau.
Đặt lỗ và lấy lợi nhuận tích hợp giúp cải thiện quản lý rủi ro hoặc khóa nhiều lợi nhuận hơn.
Các cảnh báo giao dịch có thể tùy chỉnh để tích hợp với các hệ thống giao dịch tự động và bot.
Ngoài ra còn có một số rủi ro cần xem xét:
Supertrend có thể tạo ra các tín hiệu sai mà cần phải được lọc với các điều kiện bổ sung.
Các thông số ATR không chính xác có thể dẫn đến giao dịch quá mức hoặc thiếu xu hướng.
Giữ lỗ quá gần có thể sớm thoát khỏi các giao dịch có lợi nhuận. Lợi nhuận quá lỏng lẻo có thể để lại tiền trên bàn.
Cấu hình khung thời gian kém có thể bỏ lỡ các phiên giao dịch hoặc ràng buộc lợi nhuận không cần thiết.
Những rủi ro này có thể được giải quyết thông qua các điều chỉnh thích hợp cho các thông số hoặc các bộ lọc bổ sung để cải thiện độ bền.
Một số cách chiến lược có thể được tối ưu hóa thêm:
Kiểm tra các khoảng thời gian ATR khác nhau để tìm sự cân bằng đúng, thường 10-20 hoạt động tốt.
Thử các giá trị nhân ATR khác nhau, thường 2-5 là thích hợp, điều chỉnh để tìm tối ưu.
Thêm các bộ lọc như MACD, RSI v.v. để giảm tín hiệu sai.
Tối ưu hóa mức dừng lỗ và lấy mức lợi nhuận để có kết quả tốt nhất.
Kiểm tra các phạm vi thời gian giao dịch khác nhau. Thời gian ngắn hơn phù hợp với các chiến lược trong ngày và tần số cao.
Thực hiện tự động lựa chọn biểu tượng để theo dõi động lượng cao hoặc biến động.
Nhìn chung, đây là một chiến lược theo xu hướng khá phổ biến và thực tế. Nó theo dõi hiệu quả xu hướng với các tham số có thể tùy chỉnh, nhưng cũng có rủi ro vốn có để quản lý. Với tối ưu hóa và các điều kiện bổ sung, nó có thể được tinh chỉnh thành một hệ thống giao dịch lượng mạnh mẽ với alpha nhất quán.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m 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/ // © REV0LUTI0N //@version=4 // Strategy strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash) 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) enableentry = input(true, title="Enter First Trade ASAP") waitentry = input(false, title="Wait To Enter First Trade") 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 upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) Long = (trend == 1 ? up : na) buySignal = trend == 1 and trend[1] == -1 dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) Short = (trend == 1 ? na : dn) sellSignal = trend == -1 and trend[1] == 1 // Strategy Backtesting startDate = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date') finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date') time_cond = true //Time Restriction Settings startendtime = input("", title='Time Frame To Enter Trades') enableclose = input(false, title='Enable Close Trade At End Of Time Frame') timetobuy = (time(timeframe.period, startendtime)) timetoclose = na(time(timeframe.period, startendtime)) // Stop Loss & Take Profit % Based enablesl = input(false, title='Enable Stop Loss') enabletp = input(false, title='Enable Take Profit') stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100 takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100 longStop = strategy.position_avg_price * (1 - stopTick) shortStop = strategy.position_avg_price * (1 + stopTick) shortTake = strategy.position_avg_price * (1 - takeTick) longTake = strategy.position_avg_price * (1 + takeTick) plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL") plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL") plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit") plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit") // Alert messages message_enterlong = input("", title="Long Entry message") message_entershort = input("", title="Short Entry message") message_closelong = input("", title="Close Long message") message_closeshort = input("", title="Close Short message") // Strategy Execution if Long and time_cond and timetobuy and enableentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if Short and time_cond and timetobuy and enableentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if buySignal and time_cond and timetobuy and waitentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if sellSignal and time_cond and timetobuy and waitentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if strategy.position_size > 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closelong) if strategy.position_size < 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closeshort) if strategy.position_size > 0 and enablesl and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enablesl and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort) if strategy.position_size > 0 and enabletp and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enabletp and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)