
Chiến lược này là chiến lược đột phá xu hướng dựa trên VWAP (Giá trung bình có trọng số theo khối lượng) và các kênh độ lệch chuẩn. Nó xây dựng một phạm vi biến động giá động bằng cách tính toán VWAP và các kênh độ lệch chuẩn trên và dưới để nắm bắt cơ hội giao dịch khi giá tăng. Chiến lược này chủ yếu dựa vào các tín hiệu đột phá của dải độ lệch chuẩn để giao dịch và đặt mục tiêu lợi nhuận cũng như khoảng thời gian đặt lệnh để kiểm soát rủi ro.
Đây là chiến lược giao dịch định lượng kết hợp các nguyên tắc thống kê và phân tích kỹ thuật. Thông qua sự phối hợp của VWAP và dải độ lệch chuẩn, một hệ thống giao dịch tương đối đáng tin cậy được xây dựng. Ưu điểm cốt lõi của chiến lược này nằm ở cơ sở thống kê khoa học và cơ chế kiểm soát rủi ro hoàn hảo, nhưng vẫn cần liên tục tối ưu hóa các thông số và logic giao dịch trong các ứng dụng thực tế.
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("VWAP Stdev Bands Strategy (Long Only)", overlay=true)
// Standard Deviation Inputs
devUp1 = input.float(1.28, title="Stdev above (1)")
devDn1 = input.float(1.28, title="Stdev below (1)")
// Show Options
showPrevVWAP = input(false, title="Show previous VWAP close?")
profitTarget = input.float(2, title="Profit Target ($)", minval=0) // Profit target for closing orders
gapMinutes = input.int(15, title="Gap before new order (minutes)", minval=0) // Gap for placing new orders
// VWAP Calculation
var float vwapsum = na
var float volumesum = na
var float v2sum = na
var float prevwap = na // Track the previous VWAP
var float lastEntryPrice = na // Track the last entry price
var int lastEntryTime = na // Track the time of the last entry
start = request.security(syminfo.tickerid, "D", time)
newSession = ta.change(start)
vwapsum := newSession ? hl2 * volume : vwapsum[1] + hl2 * volume
volumesum := newSession ? volume : volumesum[1] + volume
v2sum := newSession ? volume * hl2 * hl2 : v2sum[1] + volume * hl2 * hl2
myvwap = vwapsum / volumesum
dev = math.sqrt(math.max(v2sum / volumesum - myvwap * myvwap, 0))
// Calculate Upper and Lower Bands
lowerBand1 = myvwap - devDn1 * dev
upperBand1 = myvwap + devUp1 * dev
// Plot VWAP and Bands with specified colors
plot(myvwap, style=plot.style_line, title="VWAP", color=color.green, linewidth=1)
plot(upperBand1, style=plot.style_line, title="VWAP Upper (1)", color=color.blue, linewidth=1)
plot(lowerBand1, style=plot.style_line, title="VWAP Lower (1)", color=color.red, linewidth=1)
// Trading Logic (Long Only)
longCondition = close < lowerBand1 and close[1] >= lowerBand1 // Price crosses below the lower band
// Get the current time in minutes
currentTime = timestamp("GMT-0", year(timenow), month(timenow), dayofmonth(timenow), hour(timenow), minute(timenow))
// Check if it's time to place a new order based on gap
canPlaceNewOrder = na(lastEntryTime) or (currentTime - lastEntryTime) >= gapMinutes * 60 * 1000
// Close condition based on profit target
if (strategy.position_size > 0)
if (close - lastEntryPrice >= profitTarget)
strategy.close("B")
lastEntryTime := na // Reset last entry time after closing
// Execute Long Entry
if (longCondition and canPlaceNewOrder)
strategy.entry("B", strategy.long)
lastEntryPrice := close // Store the entry price
lastEntryTime := currentTime // Update the last entry time
// Add label for the entry
label.new(bar_index, close, "B", style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small)
// Optional: Plot previous VWAP for reference
prevwap := newSession ? myvwap[1] : prevwap[1]
plot(showPrevVWAP ? prevwap : na, style=plot.style_circles, color=close > prevwap ? color.green : color.red)