Đây là một chiến lược giao dịch thông minh dựa trên Break of Structure (BOS) và xác nhận khối lượng. Chiến lược tạo ra tín hiệu giao dịch bằng cách phát hiện sự đột phá giá của mức cao hoặc thấp trước đó, kết hợp với xác nhận mở rộng khối lượng. Nó sử dụng nhiều cơ chế xác minh điều kiện, bao gồm các yêu cầu xác nhận liên tiếp và cài đặt lợi nhuận / dừng lỗ năng động, để tăng độ tin cậy giao dịch và khả năng kiểm soát rủi ro.
Logic cốt lõi bao gồm các yếu tố chính sau:
Đây là một hệ thống chiến lược kết hợp lý thuyết phân tích kỹ thuật cổ điển với các phương pháp giao dịch định lượng hiện đại. Thông qua xác minh nhiều điều kiện và kiểm soát rủi ro nghiêm ngặt, chiến lược thể hiện sự ổn định và độ tin cậy tốt. Mặc dù có những khía cạnh cần tối ưu hóa, thiết kế khuôn khổ tổng thể là hợp lý và có giá trị ứng dụng thực tế. Hiệu suất của chiến lược có thể được cải thiện hơn nữa thông qua các hướng tối ưu hóa được đề xuất.
/*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=5 strategy("BOS and Volume Strategy with Confirmation", overlay=true) // Parameters swingLength = input.int(20, title="Swing Length", minval=1) volumeMultiplier = input.float(1.1, title="Volume Multiplier", step=0.1) volumeSMA_length = input.int(10, title="Volume SMA Length", minval=1) takeProfitPercentage = input.float(0.02, title="Take Profit Percentage", step=0.01) stopLossPercentage = input.float(0.15, title="Stop Loss Percentage", step=0.01) // New parameter for stop loss atrLength = input.int(14, title="ATR Length") confirmationBars = input.int(2, title="Confirmation Bars", minval=1) // Calculate Swing Highs and Lows swingHigh = ta.highest(high, swingLength)[1] swingLow = ta.lowest(low, swingLength)[1] // Calculate Volume Moving Average volumeSMA = ta.sma(volume, volumeSMA_length) highVolume = volume > (volumeSMA * volumeMultiplier) // Break of Structure Detection with Confirmation var int bullishCount = 0 var int bearishCount = 0 if (close > swingHigh and highVolume) bullishCount := bullishCount + 1 bearishCount := 0 else if (close < swingLow and highVolume) bearishCount := bearishCount + 1 bullishCount := 0 else bullishCount := 0 bearishCount := 0 bullishBOSConfirmed = (bullishCount >= confirmationBars) bearishBOSConfirmed = (bearishCount >= confirmationBars) // Entry and Exit Conditions var float entryPrice = na // Declare entryPrice as a variable if (bullishBOSConfirmed and strategy.position_size <= 0) entryPrice := close // Use ':=' for assignment strategy.entry("Long", strategy.long) if (strategy.position_size > 0) // Calculate stop loss price stopLossPrice = entryPrice * (1 - stopLossPercentage) strategy.exit("Take Profit Long", from_entry="Long", limit=entryPrice * (1 + takeProfitPercentage), stop=stopLossPrice) if (bearishBOSConfirmed and strategy.position_size >= 0) entryPrice := close // Use ':=' for assignment strategy.entry("Short", strategy.short) if (strategy.position_size < 0) // Calculate stop loss price stopLossPrice = entryPrice * (1 + stopLossPercentage) strategy.exit("Take Profit Short", from_entry="Short", limit=entryPrice * (1 - takeProfitPercentage), stop=stopLossPrice) // Plot Swing Highs and Lows for Visualization plot(swingHigh, title="Swing High", color=color.green, linewidth=1) plot(swingLow, title="Swing Low", color=color.red, linewidth=1)