
Chiến lược giao dịch số lượng đột phá của khung thời gian cao là một hệ thống giao dịch dựa trên sự đột phá của khung thời gian cao (WMA) và phần trăm để xây dựng khu vực giao dịch. Chiến lược này tạo ra tín hiệu đầu vào bằng cách xác định khi nào giá sẽ phá vỡ đường dẫn hoặc đường dẫn, và áp dụng thiết lập thu nhập và dừng lỗ để quản lý rủi ro.
Nguyên tắc cơ bản của chiến lược này là sử dụng đường trung bình di chuyển có trọng lượng của khung thời gian cao để xây dựng các khu vực hoạt động giá. Các bước thực hiện cụ thể sau đây:
Chiến lược sử dụng các yếu tố trực quan như thay đổi màu nền, đồ họa tùy chỉnh và dấu nhập / thoát, cho phép các nhà giao dịch nhận diện trực quan khoảng giao dịch và tình trạng thị trường hiện tại. Ngoài ra, chiến lược cũng hiển thị sự thay đổi phần trăm của vị trí hiện tại và áp dụng nhân tố nhân số (định nghĩa mặc định 20) để làm nổi bật sự thay đổi giá.
Một phân tích sâu hơn về mã của chiến lược này cho thấy những ưu điểm đáng chú ý sau:
Bộ lọc khung thời gian caoBằng cách sử dụng đường trung bình di chuyển có trọng lượng trên khung thời gian cao hơn, chiến lược có thể loại bỏ hiệu quả tiếng ồn thị trường ngắn hạn, nắm bắt chuyển động giá có ý nghĩa hơn và giảm tín hiệu sai lệch.
Khu vực giao dịch độngChiến lược xây dựng các vùng giao dịch dựa trên điểm trung bình giá và tỷ lệ phần trăm động, có thể thích ứng với các điều kiện và biến động khác nhau của thị trường, tránh các giới hạn của mức hỗ trợ / kháng cự cố định.
Quy tắc nhập cảnh và xuất cảnh rõ ràngChiến lược cung cấp các tín hiệu nhập cảnh rõ ràng (để phá vỡ lên / xuống đường ray) và các quy tắc thoát ra (để ngăn chặn và dừng hàng loạt), loại bỏ chủ quan trong quyết định giao dịch.
Tích hợp quản lý rủi roMột hệ thống giao dịch hoàn chỉnh với hệ thống dừng lỗ và ngăn chặn lô hàng được xây dựng giúp bảo vệ vốn và khóa lợi nhuận.
Phản hồi trực quanChiến lược cung cấp các yếu tố hình ảnh phong phú, bao gồm màu nền giữa các phân đoạn giao dịch, thẻ thay đổi tỷ lệ phần trăm và dấu nhập / thoát, giúp các nhà giao dịch đánh giá nhanh chóng tình trạng thị trường.
Cài đặt tham số linh hoạt: Người dùng có thể điều chỉnh nhiều tham số tùy theo sở thích cá nhân và các điều kiện thị trường khác nhau, bao gồm khung thời gian, chu kỳ trung bình di chuyển, tỷ lệ phần trăm, mức dừng / dừng và yếu tố hình ảnh.
Phương thức phối hợp đa khung thời gianChiến lược này kết hợp chất lượng tín hiệu của khung thời gian cao với độ chính xác của khung thời gian hiện tại để thực hiện phối hợp nhiều khung thời gian.
Mặc dù có nhiều lợi thế, chiến lược này cũng có những rủi ro tiềm ẩn như sau:
Bỏ qua tín hiệu giảĐể giảm nguy cơ này, bạn có thể xem xét thêm các cơ chế xác nhận, chẳng hạn như yêu cầu giá duy trì một thời gian sau khi phá vỡ, hoặc xác nhận kết hợp với các chỉ số khác.
Không phù hợp với thị trường biến động caoTrong thị trường biến động mạnh, giá có thể thường xuyên vượt qua ranh giới phân đoạn, dẫn đến quá nhiều giao dịch và tổn thất tiềm ẩn. Trong trường hợp này, tỷ lệ phân đoạn có thể được tăng hoặc chuyển sang khung thời gian cao hơn.
Không đủ linh hoạt cho Stop Loss/Stop Stop % cố định: Sự biến động của thị trường thay đổi theo thời gian, tỷ lệ dừng / dừng cố định có thể không phải lúc nào cũng là tối ưu. Bạn có thể cân nhắc việc điều chỉnh mức dừng / dừng động dựa trên các chỉ số biến động (như ATR).
Độ nhạy tham sốHiệu suất chiến lược có thể rất nhạy cảm với các thiết lập tham số, chẳng hạn như chu kỳ WMA, tỷ lệ khoảng và tỷ lệ dừng / dừng. Việc kiểm tra lại lịch sử đầy đủ và tối ưu hóa tham số là cần thiết.
Rủi ro quá ưu đãiLưu ý: Quá phù hợp với dữ liệu lịch sử cụ thể có thể dẫn đến hiệu suất kém trong tương lai. Nó được khuyến nghị để kiểm tra lại trên nhiều thị trường và thời gian, và giữ cho các tham số tương đối ổn định.
Khả năng thích ứng với sự thay đổi xu hướng thị trường: Chiến lược này không điều chỉnh phân đoạn của nó theo xu hướng thị trường mới sau khi phá vỡ phân đoạn, điều này có thể dẫn đến tín hiệu sai trong thị trường có xu hướng mạnh. Bạn có thể xem xét thêm bộ lọc xu hướng hoặc phân đoạn điều chỉnh động.
Dựa trên phân tích sâu về mã, chiến lược này có thể được tối ưu hóa theo một số hướng sau:
Thêm cơ chế xác nhận đột pháĐể giảm bớt sự phá vỡ giả mạo, bạn có thể thêm các điều kiện xác nhận bổ sung, chẳng hạn như yêu cầu giá đóng cửa sau khi phá vỡ, xác nhận khối lượng giao dịch hoặc xác nhận chéo bằng các chỉ số kỹ thuật khác (như RSI, MACD).
Cài đặt dừng động: Thay thế dừng phần trăm cố định bằng dừng động dựa trên biến động của thị trường, chẳng hạn như sử dụng ATR (trung bình phạm vi thực) để đặt mức dừng để chiến lược thích ứng tốt hơn với các điều kiện thị trường khác nhau.
Thêm bộ lọc xu hướng: Thêm thành phần nhận dạng xu hướng, chẳng hạn như đường trung bình di chuyển dài hạn hoặc chỉ số ADX, để điều chỉnh hành vi giao dịch trong thị trường có xu hướng mạnh, chẳng hạn như chỉ làm nhiều hơn trong xu hướng tăng và chỉ làm rỗng trong xu hướng giảm.
Tối ưu hóa thời gian nhập họcChiến lược hiện tại là vào ngay khi giá vừa vượt qua ranh giới phân vùng, bạn có thể xem xét chờ gọi lại hoặc xác nhận hình thức cụ thể để cải thiện chất lượng thời gian vào.
Thêm mô-đun quản lý tài chính: Để tính toán kích thước vị trí phức tạp hơn, kích thước vị trí được điều chỉnh động dựa trên quy mô tài khoản, biến động thị trường và rủi ro giao dịch hiện tại, thay vì sử dụng vị trí cố định.
Thêm bộ lọc trạng thái thị trườngNhận biết trạng thái của thị trường (ví dụ như xu hướng, dao động hoặc biến động cao) và điều chỉnh các tham số chiến lược hoặc tạm dừng giao dịch theo các trạng thái thị trường khác nhau.
Triển khai các tham số thích ứng: cho phép các tham số quan trọng như tỷ lệ phân đoạn, chu kỳ WMA tự động điều chỉnh dựa trên biến động lịch sử hoặc các đặc điểm thị trường khác, cải thiện khả năng thích ứng của chiến lược.
Tích hợp tín hiệu khung thời gian đaWMA không chỉ sử dụng các khung thời gian cao để xây dựng các phân đoạn, mà còn có thể phân tích hành vi giá cả và các chỉ số trên nhiều khung thời gian, cho phép phân tích thị trường và quyết định giao dịch toàn diện hơn.
Chiến lược giao dịch định lượng đột phá giữa các khung thời gian cao có trọng số chuyển động trung bình là một hệ thống giao dịch có cấu trúc tốt, được xây dựng để nắm bắt cơ hội phá vỡ giá bằng cách kết hợp các khung thời gian cao có trọng số chuyển động trung bình và các khung động. Ưu điểm của chiến lược là khả năng lọc khung thời gian cao, quy tắc giao dịch rõ ràng, cơ chế quản lý rủi ro được xây dựng và phản hồi trực quan phong phú. Tuy nhiên, nó cũng đối mặt với những thách thức như phá vỡ tín hiệu sai, nhạy cảm tham số và thích ứng với thị trườ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ác cơ chế xác nhận đột phá, thiết lập dừng lỗ động, lọc xu hướng và tham số tự thích ứng, bạn có thể tăng cường thêm sự ổn định và khả năng sinh lợi của chiến lược. Quan trọng nhất là, các nhà giao dịch nên hiểu đầy đủ các nguyên tắc của chiến lược và thực hiện quá trình phản hồi lịch sử đầy đủ, điều chỉnh các tham số theo thị trường cụ thể và sở thích rủi ro cá nhân để phát huy đầy đủ tiềm năng của chiến lược.
Chiến lược dựa trên đợt phá vỡ này phù hợp với các nhà giao dịch trung và dài hạn, đặc biệt là những nhà giao dịch tìm cách nắm bắt các đợt phá vỡ giá quan trọng trong khi vẫn giữ được sự kiểm soát rủi ro. Với sự tối ưu hóa và điều chỉnh liên tục, chiến lược này có thể trở thành một vũ khí mạnh mẽ trong hộp công cụ của các nhà giao dịch.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-05-25 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy('ZONE FLOW', overlay=true)
// Input parameters
src = close
src1 = open
src2 = low
src3 = high
Min = input(60, title='Minimum Period')
len = timeframe.isintraday and timeframe.multiplier >= 1 ? Min / timeframe.multiplier * 7 : timeframe.isintraday and timeframe.multiplier < 60 ? 60 / timeframe.multiplier * 24 * 7 : 7
c1 = ta.wma(src, len)
o1 = ta.wma(src1, len)
l1 = ta.wma(src2, len)
h1 = ta.wma(src3, len)
HTF = input.timeframe('M', title='Higher Time Frame')
ti = ta.change(time(HTF)) != 0
c = fixnan(ti ? c1 : na)
o = fixnan(ti ? o1 : na)
h = fixnan(ti ? h1 : na)
l = fixnan(ti ? l1 : na)
// Calculating mid-point
m = (h + l) / 2
// Calculating ratio lines
ratio = input.float(0.1, title='% ratio', minval=0.001, maxval=10)
r1 = m * ratio
u = m + r1
d = m - r1
// Take profit settings
takeProfitPercentage1 = input.float(10.0, title='Take Profit 1 (%)', minval=0.1, maxval=100.0) / 100
takeProfitQuantity1 = input.float(50.0, title='Take Profit 1 Quantity (%)', minval=0.1, maxval=100.0) / 100
takeProfitPercentage2 = input.float(20.0, title='Take Profit 2 (%)', minval=0.1, maxval=100.0) / 100
takeProfitQuantity2 = input.float(50.0, title='Take Profit 2 Quantity (%)', minval=0.1, maxval=100.0) / 100
// Stop loss settings
stopLossPercentage = input.float(5.0, title='Stop Loss (%)', minval=0.1, maxval=100.0) / 100
// Number of bars to extend lines
extensionBars = input.int(5, title='Number of Bars to Extend Lines', minval=1)
// Number of bars to offset the percentage label
percentOffsetBars = input.int(25, title='Number of Bars to Offset Percentage Label', minval=1)
// Input for multiplying the percentage change
multiplierFactor = input.int(20, title='Multiplier for Percentage Change', minval=1)
// Input for background colors
bgColor1 = input(color.new(color.blue, 90), title='Background Color 1')
bgColor2 = input(color.new(color.orange, 90), title='Background Color 2')
// Plot high, low, and ratio lines
ppo = plot(u, color=color.new(color.blue, 0), title='Upper Line (Resistance)', style=plot.style_stepline)
ppc = plot(d, color=color.new(color.orange, 0), title='Lower Line (Support)', style=plot.style_stepline)
plot(u, color=color.new(color.blue, 0), title='Upper Line (Resistance)', style=plot.style_circles, linewidth=2)
plot(d, color=color.new(color.orange, 0), title='Lower Line (Support)', style=plot.style_circles, linewidth=2)
// Fill the background between ratio lines with two different colors
fill(ppo, ppc, color=bgColor1)
// Calculate mid-point for background color switching
midPoint = (u + d) / 2
bgColorSwitch = close >= midPoint ? bgColor1 : bgColor2
fill(ppo, ppc, color=bgColorSwitch, transp=90)
// Initialize variables for lines and labels
var line tp1Line = na
var line tp2Line = na
var line stopLossLine = na
var line entryLine = na
var label tp1Label = na
var label tp2Label = na
var label stopLossLabel = na
var label entryLabel = na
var label percentLabel = na
// Variable to store the entry bar index
var int entryBarIndexLong = na
var int entryBarIndexShort = na
// Function to delete old labels and lines
deleteOldLinesAndLabels() =>
if not na(tp1Line)
line.delete(tp1Line)
if not na(tp2Line)
line.delete(tp2Line)
if not na(stopLossLine)
line.delete(stopLossLine)
if not na(entryLine)
line.delete(entryLine)
if not na(tp1Label)
label.delete(tp1Label)
if not na(tp2Label)
label.delete(tp2Label)
if not na(stopLossLabel)
label.delete(stopLossLabel)
if not na(entryLabel)
label.delete(entryLabel)
if not na(percentLabel)
label.delete(percentLabel)
// Strategy logic
longCondition = ta.crossover(close, u)
shortCondition = ta.crossunder(close, d)
if longCondition
strategy.entry('Long', strategy.long)
entryBarIndexLong := bar_index
entryBarIndexLong
if shortCondition
strategy.entry('Short', strategy.short)
entryBarIndexShort := bar_index
entryBarIndexShort
// Calculate take profit and stop loss levels for long positions
if strategy.position_size > 0 // Check if there's an open long position
takeProfitLevelLong1 = strategy.position_avg_price * (1 + takeProfitPercentage1)
takeProfitLevelLong2 = strategy.position_avg_price * (1 + takeProfitPercentage2)
stopLossLevelLong = strategy.position_avg_price * (1 - stopLossPercentage)
entryPrice = strategy.position_avg_price
// Delete existing lines and labels if they exist
deleteOldLinesAndLabels()
// Exit a portion of the position at each take profit level
strategy.exit('TP1', 'Long', limit=takeProfitLevelLong1, qty=strategy.position_size * takeProfitQuantity1)
strategy.exit('TP2', 'Long', limit=takeProfitLevelLong2, qty=strategy.position_size * takeProfitQuantity2)
strategy.exit('Stop Loss', 'Long', stop=stopLossLevelLong)
// Display percentage change from entry price
percentChange = (close - strategy.position_avg_price) / strategy.position_avg_price * 100
percentMultiplied = percentChange * multiplierFactor
percentColor = percentChange >= 0 ? color.green : color.red
// Update label position to follow price line with larger text size
percentLabel := label.new(x=bar_index + percentOffsetBars, y=close, text=str.tostring(percentMultiplied, format.percent) + '%', color=percentColor, textcolor=color.white, size=size.large, style=label.style_label_down)
percentLabel
if strategy.position_size < 0 // Check if there's an open short position
takeProfitLevelShort1 = strategy.position_avg_price * (1 - takeProfitPercentage1)
takeProfitLevelShort2 = strategy.position_avg_price * (1 - takeProfitPercentage2)
stopLossLevelShort = strategy.position_avg_price * (1 + stopLossPercentage)
entryPrice = strategy.position_avg_price
// Delete existing lines and labels if they exist
deleteOldLinesAndLabels()
// Exit a portion of the position at each take profit level
strategy.exit('TP1', 'Short', limit=takeProfitLevelShort1, qty=strategy.position_size * takeProfitQuantity1)
strategy.exit('TP2', 'Short', limit=takeProfitLevelShort2, qty=strategy.position_size * takeProfitQuantity2)
strategy.exit('Stop Loss', 'Short', stop=stopLossLevelShort)
// Display percentage change from entry price
percentChange = (strategy.position_avg_price - close) / strategy.position_avg_price * 100
percentMultiplied = percentChange * multiplierFactor
percentColor = percentChange >= 0 ? color.green : color.red
// Update label position to follow price line with larger text size
percentLabel := label.new(x=bar_index + percentOffsetBars, y=close, text=str.tostring(percentMultiplied, format.percent) + '%', color=percentColor, textcolor=color.white, size=size.large, style=label.style_label_down)
percentLabel
// Add buy and sell signals with shapes
plotshape(series=longCondition, title='Buy Signal', location=location.belowbar, color=color.new(color.green, 0), style=shape.labelup, text='.')
plotshape(series=shortCondition, title='Sell Signal', location=location.abovebar, color=color.new(color.red, 0), style=shape.labeldown, text='.')
// Remove old labels when they go out of scope
if bar_index % 50 == 0
deleteOldLinesAndLabels()
// Define colors for candles based on background color
candleColorBull = bgColorSwitch // Use background color for bullish candles
candleColorBear = bgColorSwitch // Use background color for bearish candles
borderColorBull = color.black // Border color for bullish candles
borderColorBear = color.black // Border color for bearish candles
// Plot candles with custom colors
plotcandle(open, high, low, close, color=close >= open ? candleColorBull : candleColorBear, bordercolor=close >= open ? borderColorBull : borderColorBear, wickcolor=color.gray)