
Đây là một chiến lược giao dịch phá vỡ đa đầu dựa trên đường xu hướng động và xác nhận khối lượng giao dịch. Chiến lược này xác định các điểm cao quan trọng bằng cách theo dõi chuyển động giá trong thời gian thực và sử dụng các điểm này để xây dựng đường xu hướng.
Lý luận cốt lõi của chiến lược được xây dựng trên ba trụ cột chính: xây dựng đường xu hướng động, xác nhận khối lượng giao dịch và hệ thống quản lý rủi ro. Đầu tiên, chiến lược sử dụng hàm ta.pivothigh để nhận diện động điểm cao của giá và tính toán độ lệch và độ cắt dựa trên hai điểm cao gần đây nhất để xây dựng đường xu hướng lên trên. Thứ hai, chiến lược yêu cầu tín hiệu đầu vào phải đi kèm với khối lượng giao dịch cao hơn 1,5 lần so với trung bình 20 chu kỳ để đảm bảo tính hiệu quả của sự phá vỡ.
Đây là một chiến lược theo dõi xu hướng được thiết kế hợp lý, logic nghiêm ngặt. Với sự kết hợp của đường xu hướng động và xác nhận khối lượng giao dịch, và hệ thống quản lý rủi ro hoàn chỉnh, chiến lược có khả năng thích ứng và độ tin cậy tốt. Mặc dù có một số phụ thuộc vào thị trường, nhưng bằng hướng tối ưu hóa được đề xuất, chiến lược vẫn có nhiều chỗ để cải thiện.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Long Only Strategy with Dynamic Trend Lines, Fixed TP/SL, and Trailing SL+", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=10,
pyramiding=0, // Prevent multiple entries
calc_on_order_fills=true,
calc_on_every_tick=true)
// === Parameters ===
swingThreshold = input.int(5, title="Swing Detection Threshold")
tpPercent = input.float(2.0, title="Take Profit (%)")
slPercent = input.float(1.0, title="Stop Loss (%)")
trailPercent = input.float(1.0, title="Trailing Stop (%)")
volumeThresholdMultiplier = input.float(1.5, title="Volume Spike Threshold (x MA)")
// === Volume Indicator ===
avgVolume = ta.sma(volume, 20)
volumeSpike = volume > (avgVolume * volumeThresholdMultiplier)
// === Detect Swing High ===
isSwingHigh = ta.pivothigh(high, swingThreshold, swingThreshold)
// Variables to store swing highs
var float swingHigh1 = na
var float swingHigh2 = na
var int swingHighBar1 = na
var int swingHighBar2 = na
// Update swing highs
if (isSwingHigh)
swingHigh2 := swingHigh1
swingHighBar2 := swingHighBar1
swingHigh1 := high[swingThreshold]
swingHighBar1 := bar_index - swingThreshold
// === Calculate Upper Trend Line ===
var float upperSlope = na
var float upperIntercept = na
// Calculate slope and intercept for upper trend line if there are two swing highs
if (not na(swingHigh1) and not na(swingHigh2))
deltaX = swingHighBar1 - swingHighBar2
if (deltaX != 0)
upperSlope := (swingHigh1 - swingHigh2) / deltaX
upperIntercept := swingHigh1 - (upperSlope * swingHighBar1)
else
upperSlope := 0
upperIntercept := swingHigh1
// Calculate trend line price for the current bar
var float upperTrendPrice = na
if (not na(upperSlope) and not na(upperIntercept))
upperTrendPrice := upperSlope * bar_index + upperIntercept
// Calculate trend line price for the previous bar
var float upperTrendPrice_prev = na
if (not na(upperSlope) and not na(upperIntercept))
upperTrendPrice_prev := upperSlope * (bar_index - 1) + upperIntercept
// === Buy Condition Based on Trend Line Breakout ===
// Buy Signal: Price breaks above Upper Trend Line with volume spike
breakoutBuyCondition = (not na(upperTrendPrice)) and
(close > upperTrendPrice) and
(not na(upperTrendPrice_prev)) and
(close[1] <= upperTrendPrice_prev) and
volumeSpike
// === Manage Single Position ===
// Calculate Take Profit and Stop Loss levels based on percentage
longTakeProfit = close * (1 + tpPercent / 100)
longStopLoss = close * (1 - slPercent / 100)
// Calculate Trailing Stop as trail_offset (in price)
trail_offset = close * (trailPercent / 100)
// Execute Trade with Single Position Management
if (breakoutBuyCondition)
// Close existing short position if any
if (strategy.position_size < 0)
strategy.close("Sell")
// Open long position
strategy.entry("Buy", strategy.long)
// Set Take Profit, Stop Loss, and Trailing Stop Loss for long position
strategy.exit("Take Profit Buy", from_entry="Buy", limit=longTakeProfit, stop=longStopLoss, trail_offset=trail_offset)
// Plot Buy Signal
plotshape(breakoutBuyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")