
Đây là một chiến lược theo dõi xu hướng dựa trên chỉ số Supertrend, kết hợp với cơ chế theo dõi dừng tự thích ứng. Chiến lược này chủ yếu sử dụng chỉ số Supertrend để xác định hướng xu hướng thị trường và sử dụng theo dõi dừng để điều chỉnh động để quản lý rủi ro và tối ưu hóa thời gian ra ngoài. Chiến lược hỗ trợ nhiều phương thức dừng, bao gồm dừng phần trăm, dừng ATR và dừng số điểm cố định, có thể điều chỉnh linh hoạt theo môi trường thị trường khác nhau.
Logic cốt lõi của chiến lược này dựa trên các yếu tố chính sau:
Đây là một chiến lược theo dõi xu hướng được thiết kế hợp lý, có thể kiểm soát rủi ro. Bằng cách kết hợp các chỉ số Supertrend và cơ chế dừng lỗ linh hoạt, chiến lược có thể kiểm soát rủi ro một cách hiệu quả trong khi vẫn có lợi nhuận cao. Chiến lược có khả năng cấu hình mạnh mẽ, phù hợp để sử dụng trong các môi trường thị trường khác nhau, nhưng cần được tối ưu hóa thông số đầy đủ và kiểm tra lại.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Supertrend Strategy with Adjustable Trailing Stop [Bips]", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=15)
// Inputs
atrPeriod = input(10, "ATR Länge", "Average True Range „wahre durchschnittliche Schwankungsbreite“ und stammt aus der technischen Analyse. Die ATR misst die Volatilität eines Instruments oder eines Marktes. Mit ihr kann die Wahrscheinlichkeit für einen Trendwechsel bestimmt werden.", group="Supertrend Settings")
factor = input.float(3.0, "Faktor", step=0.1, group="Supertrend Settings")
tradeDirection = input.string("Long", "Trade Direction", options=["Both", "Long", "Short"], group="Supertrend Settings")
sl_type = input.string("%", "SL Type", options=["%", "ATR", "Absolute"])
// Parameter für ST nur für einstieg -> Beim Ausstieg fragen ob der bool WWert true ist -> Für weniger und längere Trädes
sl_perc = input.float(4.0, "% SL", group="Stop Loss Einstellung")
atr_length = input.int(10, "ATR Length", group="Stop Loss Einstellung")
atr_mult = input.float(2.0, "ATR Mult", group="Stop Loss Einstellung")
sl_absol = input.float(10.0, "Absolute SL", group="Stop Loss Einstellung")
//-------------------------//
// BACKTESTING RANGE
fromDay = input.int(defval=1, title="From Day", minval=1, maxval=31, group="Backtesting Einstellung")
fromMonth = input.int(defval=1, title="From Month", minval=1, maxval=12, group="Backtesting Einstellung")
fromYear = input.int(defval=2016, title="From Year", minval=1970, group="Backtesting Einstellung")
toDay = input.int(defval=1, title="To Day", minval=1, maxval=31, group="Backtesting Einstellung")
toMonth = input.int(defval=1, title="To Month", minval=1, maxval=12, group="Backtesting Einstellung")
toYear = input.int(defval=2100, title="To Year", minval=1970, group="Backtesting Einstellung")
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
//-------------------------//
// Supertrend calculation
[_, direction] = ta.supertrend(factor, atrPeriod)
// SL values
sl_val = sl_type == "ATR" ? atr_mult * ta.atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// Init Variables
var pos = 0
var float trailing_sl = 0.0
// Signals
long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1])
// Calculate SL
trailing_sl := short_signal ? high + sl_val :
long_signal ? low - sl_val :
nz(pos[1]) == 1 ? math.max(low - sl_val, nz(trailing_sl[1])) :
nz(pos[1]) == -1 ? math.min(high + sl_val, nz(trailing_sl[1])) :
nz(trailing_sl[1])
// Position var
pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1])
// Entry logic
if ta.change(direction) < 0 and time_cond
if tradeDirection == "Both" or tradeDirection == "Long"
strategy.entry("Long", strategy.long, stop=trailing_sl)
else
strategy.close_all("Stop Short")
if ta.change(direction) > 0 and time_cond
if tradeDirection == "Both" or tradeDirection == "Short"
strategy.entry("Short", strategy.short, stop=trailing_sl)
else
strategy.close_all("Stop Long")
// Exit logic: Trailing Stop and Supertrend
//if strategy.position_size > 0 and not na(trailing_sl)
//strategy.exit("SL-Exit Long", from_entry="Long", stop=trailing_sl)
//if strategy.position_size < 0 and not na(trailing_sl)
//strategy.exit("SL-Exit Short", from_entry="Short", stop=trailing_sl)
// Trailing Stop visualization
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//plot(not na(trailing_sl) ? trailing_sl : na, color=pos == 1 ? color.green : color.red, linewidth=2, title="Trailing Stop")