Chiến lược theo dõi xu hướng Heiken Asch: Hệ thống nhận dạng xu hướng nhiều giai đoạn với cơ chế dừng lỗ nhiều cấp

supertrend ADX ATR HEIKEN ASHI DMI
Ngày tạo: 2025-04-14 11:31:37 sửa đổi lần cuối: 2025-04-14 11:31:37
sao chép: 1 Số nhấp chuột: 502
2
tập trung vào
319
Người theo dõi

Chiến lược theo dõi xu hướng Heiken Asch: Hệ thống nhận dạng xu hướng nhiều giai đoạn với cơ chế dừng lỗ nhiều cấp Chiến lược theo dõi xu hướng Heiken Asch: Hệ thống nhận dạng xu hướng nhiều giai đoạn với cơ chế dừng lỗ nhiều cấp

Tổng quan

Chiến lược theo dõi xu hướng Heiken Aashi là một hệ thống giao dịch tổng hợp kết hợp lợi thế của biểu đồ Heiken Aashi, chỉ số siêu xu hướng và bộ lọc chỉ số định hướng trung bình ((ADX) nhằm xác định chuyển động xu hướng mạnh mẽ và quản lý tiền hiệu quả. Chiến lược này tập trung vào việc nắm bắt động lực trong xu hướng đã được thiết lập, đồng thời sử dụng cơ chế dừng lỗ ba tầng tiên tiến để bảo vệ tiền và khóa lợi nhuận. Chiến lược này phù hợp với nhiều loại giao dịch, đặc biệt là trong thị trường có nhiều biến động.

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

Chiến lược theo dõi xu hướng của HaikenAsh dựa trên sự phối hợp của ba chỉ số kỹ thuật cốt lõi:

  1. Phân tích bản đồ Haiken AchievementChiến lược này đặc biệt chú ý đến “các thực thể” Haykan Akismet hầu như không có đường bóng lên xuống, các dấu hiệu này cho thấy giá di chuyển một cách dứt khoát theo một hướng, hầu như không có sự điều chỉnh, ám chỉ động lực mạnh mẽ và xu hướng tiếp tục. Các dấu hiệu màu xanh lá cây không có đường bóng xuống được coi là nhiều tín hiệu, và các dấu hiệu màu đỏ không có đường bóng lên được coi là tín hiệu trống.

  2. Bộ lọc chỉ số siêu xu hướng: Hệ thống sử dụng chỉ số xu hướng siêu ((tỷ số mặc định: 3.0, chu kỳ ATR: 10) để xác nhận hướng xu hướng tiềm năng. Tín hiệu đầu vào phải phù hợp với hướng xu hướng siêu, điều này làm tăng độ tin cậy của tín hiệu và giảm giao dịch sai.

  3. Bộ lọc ADX (có thể chọn): Chỉ số định hướng trung bình được sử dụng để đánh giá cường độ của xu hướng, giao dịch chỉ được kích hoạt khi ADX vượt quá ngưỡng được chỉ định (bằng mặc định: 25), điều này giúp lọc các tín hiệu tiếng ồn trong thị trường chấn động hoặc ngang.

Hệ thống giao dịch có các quy tắc rõ ràng về nhập cảnh và xuất cảnh:

  • Kích hiệu vào cửa: Khi đáp ứng các điều kiện sau đây: ((1) Hắc Khen xanh không có đường bóng dưới (((thực hiện nhiều hơn) hoặc Hắc Khen đỏ không có đường bóng trên (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
  • Tín hiệu xuất phátCác giao dịch sẽ kết thúc khi có một sợi dây không bóng ở hướng ngược lại hoặc khi bất kỳ một trong các cơ chế dừng lỗ nào được kích hoạt.

Đặc điểm nổi bật nhất của chiến lược này là hệ thống dừng lỗ ba tầng sáng tạo của nó:

  1. ATR theo dõi dừngĐịnh vị dừng lỗ dựa trên biến động của thị trường (ATR) và khóa lợi nhuận theo xu hướng.
  2. Điểm dừng dao động: Sử dụng cấu trúc tự nhiên của thị trường ((thời điểm cao / thấp gần đây trong thời gian xem xét) để thiết lập điểm dừng lỗ, tôn trọng nhịp độ của thị trường.
  3. Bảo hiểm thiệt hạiMột mạng an toàn được thiết lập dựa trên tỷ lệ phần trăm của giá nhập, cung cấp sự bảo vệ vốn ngay lập tức, đặc biệt là khi vị trí dừng lỗ của điểm di chuyển có thể quá xa điểm nhập.

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

  1. Quản lý rủi ro đa tầngHệ thống dừng lỗ ba tầng cung cấp sự bảo vệ tài chính toàn diện, thích ứng với các điều kiện thị trường và tình huống rủi ro khác nhau, đây là ưu điểm đáng chú ý nhất của chiến lược này.

  2. Khả năng thích nghi caoTất cả các thành phần ((Supertrend, ADX) có thể được bật / tắt tùy thuộc vào điều kiện thị trường khác nhau, và các tham số cũng có thể được điều chỉnh, cho phép chiến lược có tính linh hoạt cao.

  3. Khả năng nắm bắt xu hướng mạnh mẽBằng cách kết hợp các tín hiệu thị giác rõ ràng của Hyke Achim, xác nhận siêu xu hướng và đánh giá cường độ xu hướng của ADX, chiến lược này có thể xác định hiệu quả các chuyển động xu hướng mạnh.

  4. Phản hồi trực quan rõ ràngChiến lược hiển thị trạng thái vị trí, giá vào và mức dừng hiện tại trên biểu đồ, cho phép thương nhân hiểu trực quan và theo dõi hiệu quả của chiến lược.

  5. Quản lý tài chính nội bộChiến lược này sử dụng phương pháp quản lý vị trí dựa trên tỷ lệ quyền lợi (tạm dịch: mặc định là 3%) để đảm bảo lỗ hổng rủi ro phù hợp với sự thay đổi quy mô tài khoản.

  6. Hệ thống giao dịch hoàn chỉnh: Cung cấp toàn bộ quy trình giao dịch từ tín hiệu vào đến quy tắc ra khỏi, không cần thêm quyết định hoặc chỉ số.

Rủi ro chiến lược

  1. Rủi ro quá ưu đãiChiến lược có nhiều tham số có thể điều chỉnh, điều này có thể dẫn đến vấn đề phù hợp với đường cong, tức là chiến lược hoạt động tốt trên dữ liệu lịch sử nhưng không hiệu quả trong giao dịch trong thời gian thực. Giải pháp là sử dụng dữ liệu lịch sử đủ dài để kiểm tra lại và kiểm tra sự ổn định của chiến lược trong các điều kiện thị trường khác nhau.

  2. Rủi ro đảo ngược xu hướngMặc dù có cơ chế dừng nhiều tầng, chiến lược này vẫn có thể phải đối mặt với sự rút lui lớn khi xu hướng mạnh đột ngột đảo ngược. Sự biến động cực đoan đột ngột của thị trường có thể dẫn đến việc dừng lỗ không được kích hoạt kịp thời, gây ra tổn thất vượt quá dự kiến. Giải pháp là xem xét tăng bộ lọc biến động hoặc thực hiện các quy tắc quản lý rủi ro nghiêm ngặt hơn.

  3. Độ nhạy tham sốCài đặt tham số khác nhau có thể dẫn đến kết quả khác nhau, đặc biệt là yếu tố siêu xu hướng và ADX. Điều này đòi hỏi các nhà giao dịch phải hiểu sâu về tác động của mỗi tham số và tìm ra điểm cân bằng phù hợp với môi trường thị trường cụ thể.

  4. Không hoạt động tốt trong môi trường biến động thấpTrong một thị trường có biến động thấp hoặc ngang, chiến lược này có thể tạo ra nhiều tín hiệu sai dẫn đến giao dịch “lắc”. Giải pháp là tạm dừng giao dịch trong môi trường như vậy hoặc thêm bộ lọc môi trường thị trường bổ sung.

  5. Rủi ro quản lý tài chínhQuản lý vị thế ở tỷ lệ cố định có thể không phù hợp với tất cả các môi trường thị trường và có thể cần phải giảm kích thước vị thế để kiểm soát rủi ro trong các thị trường có biến động cao.

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

  1. Tăng cơ chế thích ứng biến độngChiến lược hiện tại có thể được tối ưu hóa hơn nữa bằng cách giới thiệu bộ lọc biến động, chẳng hạn như chỉ số biến động lịch sử ((HV) hoặc biến động tiềm ẩn ((IV) để tự động điều chỉnh tham số trong các môi trường thị trường khác nhau. Điều này sẽ cho phép chiến lược duy trì hiệu suất ổn định trong cả thời gian biến động cao và thấp.

  2. Bộ lọc thời gian tích hợpXem xét thêm bộ lọc dựa trên thời gian để tránh giao dịch trong các khoảng thời gian có biến động thấp hơn hoặc xu hướng thị trường yếu hơn. Điều này đặc biệt hữu ích đối với giao dịch các giống cụ thể, vì các giống khác nhau thể hiện các đặc điểm hành vi khác nhau trong các khoảng thời gian khác nhau trong ngày.

  3. Giới thiệu tối ưu hóa học máy: Có thể sử dụng công nghệ học máy để tự động xác định các tổ hợp tham số tốt nhất thay vì phụ thuộc vào các thiết lập tham số tĩnh. Điều này có thể được thực hiện bằng cách phân tích các mô hình trong dữ liệu lịch sử để dự đoán các thiết lập tham số nào có thể hoạt động tốt nhất trong điều kiện thị trường cụ thể trong tương lai.

  4. Thêm bộ lọc thị trường liên quanTăng cường tín hiệu đầu vào bằng cách quan sát hành vi của thị trường hoặc chỉ số liên quan, ví dụ như xem xét xu hướng thị trường tổng thể hoặc sức mạnh của thị trường liên quan khi giao dịch một loại cụ thể.

  5. Tối ưu hóa hệ thống ngăn chặn thiệt hạiHệ thống dừng ba tầng hiện tại có thể được tối ưu hóa hơn nữa, chẳng hạn như điều chỉnh tỷ lệ dừng bảo hiểm dựa trên biến động động, hoặc sử dụng mức hỗ trợ / kháng cự để thiết lập chính xác điểm dừng dao động thay vì chỉ đơn giản là thời gian xem xét.

  6. Phân tích khối lượng giao dịch: Thêm bộ lọc khối lượng giao dịch trong quá trình xác nhận tín hiệu, đảm bảo rằng xu hướng giá được hỗ trợ bởi khối lượng giao dịch đủ để tăng độ tin cậy của tín hiệu.

Tóm tắt

Chiến lược theo dõi xu hướng của Heike Aashi là một hệ thống giao dịch phức tạp và toàn diện, tập trung vào việc nắm bắt cơ hội động lực trong xu hướng mạnh mẽ thông qua sự kết hợp độc đáo của biểu đồ Heike Aashi, chỉ số siêu xu hướng và bộ lọc ADX. Hệ thống dừng lỗ ba lớp của nó cung cấp quản lý rủi ro toàn diện, trong khi các thiết lập tham số có thể tùy chỉnh của nó cho phép nó thích ứng với nhiều điều kiện thị trường.

Ưu điểm chính của chiến lược này là tín hiệu thị giác rõ ràng, khả năng nhận biết xu hướng mạnh mẽ và cơ chế bảo vệ tiền toàn diện. Tuy nhiên, các nhà giao dịch nên nhận thức được những thách thức của việc tối ưu hóa các tham số và những hạn chế tiềm ẩn trong môi trường biến động thấp.

Chiến lược này có thể được tăng cường hơn nữa về tính ổn định và thích ứng bằng cách thực hiện các hướng tối ưu hóa được đề xuất, chẳng hạn như thêm cơ chế thích ứng biến động, tích hợp bộ lọc thời gian và phân tích khối lượng giao dịch. Cuối cùng, chiến lược theo dõi xu hướng của Heiken Achievement đại diện cho một cách cân bằng, kết hợp các tín hiệu rõ ràng của phân tích kỹ thuật và các nguyên tắc quản lý rủi ro có hệ thống, cung cấp một công cụ có giá trị cho các nhà giao dịch theo dõi xu hướng.

Mã nguồn chiến lược
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)


// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")

// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")

// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")

useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")

// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")

// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])

// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close

// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend

// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0   // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend

// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)

// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
    trade := 1
else if trade == 0 and diminus > diplus
    trade := -1
else if trade == 1 and diminus > diplus
    trade := -1
else if trade == -1 and diplus > diminus
    trade := 1
else
    trade := trade[1]

// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold

// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)

// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold

// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o

// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green   // Green for long/bullish
bearishColor = color.purple  // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)

// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)

shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)

exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed

// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)

// Position tracking
var int position = 0  // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na  // For ATR trailing stop
var float swingStopLevel = na  // For swing point stop
var float safetyNetStopLevel = na  // For safety net stop
var float highestSinceEntry = na  // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na   // For tracking lowest price since entry (for short positions)

// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false

// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false

// Handle entries and exits
if longCondition and (position <= 0)
    if position < 0
        exitShortAlert := true
        strategy.close("Short", comment="Exit Short")
        position := 0
    longAlert := true
    strategy.entry("Long", strategy.long, comment="Enter Long")
    position := 1
    entryPrice := real_close
    highestSinceEntry := real_close
    lowestSinceEntry := na
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingLow
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
        
if shortCondition and (position >= 0)
    if position > 0
        exitLongAlert := true
        strategy.close("Long", comment="Exit Long")
        position := 0
    shortAlert := true
    strategy.entry("Short", strategy.short, comment="Enter Short")
    position := -1
    entryPrice := real_close
    highestSinceEntry := na
    lowestSinceEntry := real_close
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingHigh
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)

if position > 0 and exitLongCondition
    exitLongAlert := true
    strategy.close("Long", comment="Exit Long Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    highestSinceEntry := na

if position < 0 and exitShortCondition
    exitShortAlert := true
    strategy.close("Short", comment="Exit Short Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    lowestSinceEntry := na

// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
    // For long positions, check if price drops below the swing low
    if position > 0 and real_low <= swingStopLevel
        strategy.close("Long", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the swing high
    else if position < 0 and real_high >= swingStopLevel
        strategy.close("Short", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
    // For long positions, check if price drops below the safety net level
    if position > 0 and real_low <= safetyNetStopLevel
        strategy.close("Long", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the safety net level
    else if position < 0 and real_high >= safetyNetStopLevel
        strategy.close("Short", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
    highestSinceEntry := math.max(highestSinceEntry, real_high)
    
if position < 0 and not na(lowestSinceEntry)
    lowestSinceEntry := math.min(lowestSinceEntry, real_low)

// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
    // Update trailing stop level for long positions
    if position > 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close - (atrValue * trailAtrMultiplier)
        // Only move the stop up, never down
        if trailStopNew > trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_low <= trailStopLevel
            strategy.close("Long", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            highestSinceEntry := na
            
    // Update trailing stop level for short positions
    else if position < 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close + (atrValue * trailAtrMultiplier)
        // Only move the stop down, never up
        if trailStopNew < trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_high >= trailStopLevel
            strategy.close("Short", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            lowestSinceEntry := na

// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)

// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)

// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")

// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")

// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
    positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
    entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
    atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
    swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
    safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
    supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
    positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
    positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)