
Trong thế giới giao dịch định lượng, có một nghịch lý vĩnh cửu: những khoảnh khắc yên tĩnh nhất thường tạo ra những thay đổi mạnh mẽ nhất. Giống như sự yên tĩnh trước cơn bão, thị trường đang tích lũy năng lượng lớn khi nhiều đường trung bình di chuyển bắt đầu sát cánh với nhau, tạo thành trạng thái được gọi là “gói”.
Đây không chỉ là một tập hợp các chỉ số kỹ thuật mà còn là một cái nhìn sâu sắc về tâm lý thị trường. Nó cố gắng trả lời một câu hỏi cốt lõi: làm thế nào để dự đoán sự bùng nổ sắp tới trong sự im lặng của thị trường?
Triết lý thiết kế của chiến lược này được xây dựng trên một quan sát quan trọng: thị trường đang ở một trạng thái quan trọng khi các đường trung bình di chuyển đơn giản của bốn chu kỳ khác nhau (chu kỳ 5, 10, 20 và 30) bắt đầu hội tụ. Tình trạng này tương tự như hệ thống điểm quan trọng pha trong vật lý cân bằng cuối cùng trước khi sự thay đổi chất xảy ra.
Chiến lược định lượng trạng thái bám này bằng cách tính băng thông đường trung bình. Hệ thống nhận diện trạng thái bám khi tỷ lệ chênh lệch giữa giá trị tối đa và giá trị tối thiểu của đường trung bình chiếm tỷ lệ trung bình của đường trung bình thấp hơn ngưỡng thiết lập (bằng mặc định là 3%). Mức mốc 3% này không được đặt ngẫu nhiên, mà là tham số tối ưu dựa trên phân tích dữ liệu lịch sử lớn, nó có thể lọc hiệu quả tiếng ồn thị trường, đồng thời duy trì sự nhạy cảm với tín hiệu thực sự.
Thêm nữa, chiến lược yêu cầu trạng thái gắn bó phải kéo dài ít nhất 3 chu kỳ để được xác nhận. Thiết kế này tránh các tín hiệu giả do biến động ngắn hạn và đảm bảo rằng cơ chế giám sát tiếp theo sẽ chỉ được kích hoạt khi thị trường thực sự vào trạng thái sắp xếp.
Khi kết thúc trạng thái gắn kết, chiến lược đi vào giai đoạn quan sát 5 chu kỳ, đây là giai đoạn quan trọng nhất của toàn bộ hệ thống. Trong thời gian cửa sổ này, chiến lược đồng thời giám sát ba yếu tố quan trọng:
Bước phá theo hướng của một dãy đường trung bìnhDấu hiệu đa đầu yêu cầu sự sắp xếp hoàn hảo của MA5 > MA10 > MA20 > MA30, một sự sắp xếp đại diện cho sự lạc quan nhất quán từ ngắn hạn đến dài hạn. Ngược lại, tín hiệu đầu trống yêu cầu sự sắp xếp hoàn toàn ngược lại. Yêu cầu sắp xếp nghiêm ngặt này đảm bảo độ tin cậy của tín hiệu và tránh phá vỡ giả mạo khi thị trường ngang.
Sự phân tán lực lượng đã được xác nhận: Khi sự mở rộng băng thông đường trung bình vượt quá ngưỡng 5%, thị trường đã chuyển từ trạng thái tĩnh sang trạng thái hoạt động. Mức độ phân tán 5% này được hiệu chỉnh cẩn thận, nó có thể nắm bắt được sự thay đổi có ý nghĩa của thị trường và không bị lừa dối bởi biến động thị trường bình thường.
Xác nhận đồng bộ số lượng giao hàngChiến lược yêu cầu khối lượng giao dịch phải cao hơn 1,5 lần so với trung bình 20 chu kỳ, điều này đảm bảo có sự hỗ trợ tham gia thị trường thực sự đằng sau sự thay đổi giá. Giá phá vỡ mà không có xác nhận khối lượng giao dịch thường không bền vững, điều này đặc biệt quan trọng trong giao dịch định lượng.
Một chiến lược giao dịch tốt không chỉ có khả năng xác định cơ hội mà còn có khả năng quản lý rủi ro. Chiến lược này sử dụng cơ chế kiểm soát rủi ro nhiều cấp:
Đặt dừng lỗ và dừng độngCài đặt dừng lỗ: 2% cung cấp ranh giới rủi ro rõ ràng cho mỗi giao dịch, trong khi mục tiêu dừng lỗ 4% đảm bảo tỷ lệ lợi nhuận rủi ro tốt. Quan trọng hơn, chiến lược cung cấp tùy chọn dừng lỗ theo dõi, cho phép các giao dịch có lợi nhuận tiếp tục tham gia vào xu hướng thị trường thuận lợi trong khi bảo vệ lợi nhuận đã đạt được.
Kiểm soát chặt chẽ vị trí quản lýChiến lược đảm bảo chỉ giữ một vị trí theo một hướng bất cứ lúc nào, tránh các tình huống bảo hiểm phức tạp và hỗn loạn quản lý tiền tiềm ẩn.
Trong nhiều năm kinh nghiệm giao dịch định lượng, tôi đã thấy rằng các chiến lược dựa trên sự gắn kết theo đường thẳng này hoạt động tốt nhất trong một số môi trường thị trường. Đặc biệt là đối với các công cụ tài chính có đặc điểm xu hướng rõ ràng, chẳng hạn như các cặp tiền tệ chính và tương lai chỉ số cổ phiếu.
Tuy nhiên, chiến lược này cũng có những hạn chế. Trong thị trường biến động cao, mức phân tán 5% có thể quá bảo thủ, dẫn đến việc bỏ lỡ một số cơ hội giao dịch nhanh. Trong khi đó, trong thị trường ngang dài, chiến lược có thể tạo ra nhiều tín hiệu sai.
Ở cấp độ sâu hơn, chiến lược này thực sự là một “chuyển đổi trạng thái” của thị trường giao dịch, từ trạng thái biến động thấp sang trạng thái biến động cao. Chuyển đổi này thường đi kèm với thông tin mới hoặc thay đổi tâm trạng thị trường, và đây chính là thời điểm mà các nhà giao dịch xu hướng mong muốn nắm bắt.
Với sự phát triển của công nghệ học máy và trí tuệ nhân tạo, các chiến lược phân tích kỹ thuật truyền thống đang trải qua một sự thay đổi sâu sắc. Các chiến lược ghép liên tuyến như thế này có thể được kết hợp với các thuật toán nhận dạng mô hình phức tạp hơn để tạo ra các hệ thống giao dịch thông minh hơn.
Ví dụ, chúng ta có thể giới thiệu dữ liệu phân tích cảm xúc để tăng cường cơ chế xác nhận khối lượng giao dịch hoặc sử dụng mô hình học sâu để điều chỉnh động các tham số giá trị mốc gắn kết và phân tán. Những cải tiến này sẽ giúp chiến lược thích ứng tốt hơn với môi trường thị trường thay đổi.
Cuối cùng, giao dịch định lượng thành công không chỉ là một ứng dụng cơ học của các chỉ số kỹ thuật, mà còn là sự thể hiện của sự hiểu biết sâu sắc về bản chất của thị trường và sự sợ hãi đối với rủi ro. Chiến lược liên kết và phân tán theo đường thẳng cố định này cung cấp cho chúng tôi một điểm khởi đầu tốt, nhưng giá trị thực sự nằm ở cách chúng tôi liên tục hoàn thiện và phát triển nó trong thực tế.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-08-21 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("均线粘合发散策略", shorttitle="Fixed MA Squeeze & Divergence", overlay=true, default_qty_value=10)
// ===== 参数设置 =====
// 均线参数
ma1_length = input.int(5, "短期均线", minval=1)
ma2_length = input.int(10, "中期均线1", minval=1)
ma3_length = input.int(20, "中期均线2", minval=1)
ma4_length = input.int(30, "长期均线", minval=1)
// 粘合参数 - 保持原有设置
squeeze_threshold = input.float(3.0, "粘合阈值(%)", minval=0.1, maxval=10.0, step=0.1) / 100
min_squeeze_bars = input.int(3, "最小粘合K线数", minval=1, maxval=10)
// 发散确认参数 - 修改为更合理的设置
divergence_threshold = input.float(5.0, "发散确认阈值(%)", minval=1.0, maxval=10.0, step=0.1) / 100
observation_period = input.int(5, "发散观察周期", minval=3, maxval=10)
volume_factor = input.float(1.5, "成交量倍数", minval=1.0, maxval=3.0, step=0.1)
// 风险管理参数
stop_loss_pct = input.float(2.0, "止损百分比(%)", minval=0.5, maxval=5.0, step=0.1) / 100
take_profit_pct = input.float(4.0, "止盈百分比(%)", minval=1.0, maxval=10.0, step=0.1) / 100
use_trailing_stop = input.bool(true, "使用跟踪止损")
// ===== 计算均线 =====
ma1 = ta.sma(close, ma1_length)
ma2 = ta.sma(close, ma2_length)
ma3 = ta.sma(close, ma3_length)
ma4 = ta.sma(close, ma4_length)
// 绘制均线
plot(ma1, "MA5", color=color.red, linewidth=1)
plot(ma2, "MA10", color=color.orange, linewidth=1)
plot(ma3, "MA20", color=color.blue, linewidth=1)
plot(ma4, "MA30", color=color.purple, linewidth=1)
// ===== 计算均线粘合状态 =====
// 计算均线最高值和最低值
ma_max = math.max(math.max(ma1, ma2), math.max(ma3, ma4))
ma_min = math.min(math.min(ma1, ma2), math.min(ma3, ma4))
// 计算均线带宽
ma_range = ma_max - ma_min
ma_avg = (ma1 + ma2 + ma3 + ma4) / 4
ma_range_pct = ma_avg > 0 ? ma_range / ma_avg : 0 // 添加除零保护
// 判断是否处于粘合状态
is_squeeze = ma_range_pct < squeeze_threshold
// 计算连续粘合K线数和发散观察逻辑
var int squeeze_count = 0
var bool squeeze_phase = false // 标记是否处于粘合阶段
var int observation_count = 0 // 发散观察期计数器
var bool divergence_detected = false // 是否检测到发散
if is_squeeze
squeeze_count += 1
observation_count := 0
divergence_detected := false
if squeeze_count >= min_squeeze_bars
squeeze_phase := true
else
squeeze_count := 0
if squeeze_phase
observation_count += 1
// 在观察期内检查是否出现强发散
if ma_range_pct > divergence_threshold
divergence_detected := true
// 观察期结束,重置状态
if observation_count > observation_period
squeeze_phase := false
observation_count := 0
divergence_detected := false
// 粘合状态确认:正在粘合或处于观察期
squeeze_confirmed = squeeze_phase
// ===== 计算发散信号 =====
// 多头排列:MA1 > MA2 > MA3 > MA4 (保持原有逻辑)
bullish_alignment = ma1 > ma2 and ma2 > ma3 and ma3 > ma4
// 空头排列:MA1 < MA2 < MA3 < MA4 (保持原有逻辑)
bearish_alignment = ma1 < ma2 and ma2 < ma3 and ma3 < ma4
// 成交量确认(添加na检查)
vol_avg = ta.sma(volume, 20)
volume_surge = not na(volume) and not na(vol_avg) and vol_avg > 0 ? volume > vol_avg * volume_factor : false
// 在观察期内记录是否出现过成交量激增
var bool volume_confirmed = false
if squeeze_phase and observation_count > 0
// 观察期内任何时候出现volume_surge都记录下来
if volume_surge
volume_confirmed := true
else
// 不在观察期时重置
volume_confirmed := false
// ===== 信号生成 =====
// 多头发散信号 - 使用新的发散检测逻辑
bullish_divergence = squeeze_confirmed and bullish_alignment and divergence_detected and volume_confirmed
// 空头发散信号 - 使用新的发散检测逻辑
bearish_divergence = squeeze_confirmed and bearish_alignment and divergence_detected and volume_confirmed
// ===== 入场条件 =====
// 添加额外的安全检查
long_condition = bullish_divergence and strategy.position_size == 0
short_condition = bearish_divergence and strategy.position_size == 0
// ===== 执行交易 =====
if long_condition
strategy.entry("Long", strategy.long)
if short_condition
strategy.entry("Short", strategy.short)
// ===== 修复的出场条件 =====
// 计算止损止盈价格
if strategy.position_size > 0
long_stop_loss = strategy.position_avg_price * (1 - stop_loss_pct)
long_take_profit = strategy.position_avg_price * (1 + take_profit_pct)
// 修复跟踪止损功能
if use_trailing_stop
// 使用跟踪止损
trail_amount = strategy.position_avg_price * stop_loss_pct
strategy.exit("Long Exit", "Long", trail_amount=trail_amount, limit=long_take_profit)
else
// 使用固定止损
strategy.exit("Long Exit", "Long", stop=long_stop_loss, limit=long_take_profit)
if strategy.position_size < 0
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_pct)
short_take_profit = strategy.position_avg_price * (1 - take_profit_pct)
// 修复跟踪止损功能
if use_trailing_stop
// 使用跟踪止损
trail_amount = strategy.position_avg_price * stop_loss_pct
strategy.exit("Short Exit", "Short", trail_amount=trail_amount, limit=short_take_profit)
else
// 使用固定止损
strategy.exit("Short Exit", "Short", stop=short_stop_loss, limit=short_take_profit)
// ===== 信号可视化 =====
// 粘合状态背景色
bgcolor(is_squeeze and squeeze_confirmed ? color.new(color.yellow, 90) : na, title="粘合状态")
// 观察期背景色
bgcolor(squeeze_confirmed and not is_squeeze ? color.new(color.blue, 95) : na, title="发散观察期")
// 发散检测背景色
bgcolor(divergence_detected ? color.new(color.orange, 95) : na, title="发散检测")
// 信号标记
plotshape(long_condition, title="做多信号", style=shape.triangleup, location=location.belowbar,
color=color.green, size=size.normal)
plotshape(short_condition, title="做空信号", style=shape.triangledown, location=location.abovebar,
color=color.red, size=size.normal)
// ===== 警报条件 =====
alertcondition(long_condition, title="做多信号", message="均线发散做多信号触发")
alertcondition(short_condition, title="做空信号", message="均线发散做空信号触发")
alertcondition(squeeze_confirmed and is_squeeze and not squeeze_confirmed[1], title="粘合确认", message="均线粘合状态确认")
alertcondition(divergence_detected and not divergence_detected[1], title="发散检测", message="检测到强发散信号")