
Dalam dunia perdagangan kuantitatif, terdapat paradoks yang kekal: momen yang paling tenang sering melahirkan perubahan yang paling teruk. Seperti ketenangan sebelum ribut, pasaran sedang mengumpul tenaga yang besar apabila pelbagai purata bergerak mula berdekatan antara satu sama lain, membentuk apa yang dipanggil keadaan “paduan”.
Ini bukan sekadar gabungan petunjuk teknikal, tetapi ia adalah satu pandangan yang mendalam mengenai psikologi pasaran. Ia cuba menjawab soalan utama: bagaimana untuk meramalkan letupan yang akan datang dalam keheningan pasaran?
Falsafah reka bentuk strategi ini dibina di atas pemerhatian penting: pasaran berada dalam keadaan kritikal ketika purata bergerak sederhana dari empat kitaran yang berbeza (kitaran 5, 10, 20, 30) mula berkumpul. Keadaan ini menyerupai sistem titik kritikal fasa dalam fizik, keseimbangan terakhir sebelum perubahan sifat berlaku.
Strategi untuk mengkuantifikasikan keadaan melekat ini dengan mengira lebar jalur rata-rata. Sistem mengenal pasti keadaan melekat apabila peratusan perbezaan antara nilai maksimum dan minimum garis rata-rata adalah kurang daripada nilai ambang yang ditetapkan (default 3%) 3. Nilai ambang 3% ini tidak ditetapkan secara rawak, tetapi berdasarkan analisis data sejarah yang besar, parameter terbaik yang dapat menyaring bunyi pasaran dengan berkesan sambil mengekalkan kepekaan terhadap isyarat sebenar.
Lebih menarik lagi, strategi ini memerlukan keadaan melekat untuk berlangsung sekurang-kurangnya 3 kitaran untuk disahkan. Reka bentuk ini mengelakkan isyarat palsu yang disebabkan oleh turun naik jangka pendek dan memastikan mekanisme pemantauan seterusnya akan diaktifkan hanya apabila pasaran benar-benar memasuki keadaan penyusunan.
Apabila keadaan melekat berakhir, strategi memasuki tempoh pemerhatian lima kitaran, yang merupakan tahap paling kritikal dalam keseluruhan sistem. Dalam tempoh tetingkap ini, strategi memantau tiga elemen penting pada masa yang sama:
Penembusan arah dalam susunan garis rataSinyal bermulut memerlukan susunan sempurna MA5 > MA10 > MA20 > MA30, yang mewakili sentimen yang konsisten dari jangka pendek ke jangka panjang. Sebaliknya, isyarat kepala kosong memerlukan susunan yang bertentangan.
Pengesahan pelepasan kuasa: Apabila peluasan jalur rata-rata melebihi 5%, ia menunjukkan bahawa pasaran telah beralih dari keadaan diam ke keadaan aktif. Nilai terhad penyebaran 5% ini dikalibrasi dengan teliti, ia dapat menangkap perubahan pasaran yang bermakna dan tidak disesatkan oleh turun naik pasaran yang normal.
Pengesahan bersamaStrategi memerlukan jumlah transaksi mestilah melebihi 1.5 kali ganda daripada purata 20 kitaran, yang memastikan bahawa terdapat sokongan penyertaan pasaran yang sebenar di belakang perubahan harga. Penembusan harga tanpa pengesahan jumlah transaksi sering tidak dapat dikekalkan, yang sangat penting dalam perdagangan kuantitatif.
Strategi dagangan yang baik bukan sahaja dapat mengenal pasti peluang, tetapi juga dapat menguruskan risiko. Strategi ini menggunakan mekanisme kawalan risiko bertingkat:
Penangguhan tetap dan penangguhan dinamikTetapan stop loss: 2% memberikan had risiko yang jelas untuk setiap perdagangan, manakala sasaran stop loss 4% memastikan nisbah keuntungan risiko yang baik. Lebih penting lagi, strategi ini memberikan pilihan untuk menjejaki stop loss, yang membolehkan perdagangan yang menguntungkan untuk terus mengambil bahagian dalam trend pasaran yang menguntungkan sambil melindungi keuntungan yang diperoleh.
Kawalan ketat untuk pengurusan lokasiStrategi memastikan bahawa hanya satu arah kedudukan yang dipegang pada bila-bila masa, mengelakkan keadaan perlindungan yang rumit dan potensi kekacauan pengurusan dana.
Dalam pengalaman berdagang kuantitatif saya selama bertahun-tahun, saya dapati bahawa strategi yang berasaskan pengekatan garis rata ini sangat baik dalam keadaan pasaran tertentu. Terutama pada instrumen kewangan yang mempunyai ciri trend yang jelas, seperti pasangan mata wang utama dan niaga hadapan indeks saham.
Walau bagaimanapun, strategi ini mempunyai batasan. Dalam pasaran yang berfluktuasi dengan frekuensi tinggi, margin penyebaran 5% mungkin terlalu konservatif, menyebabkan kehilangan beberapa peluang perdagangan cepat.
Pada tahap yang lebih mendalam, strategi ini sebenarnya adalah “perubahan keadaan” pasaran perdagangan dari keadaan turun naik rendah ke keadaan turun naik tinggi. Pertukaran ini sering disertai dengan masuknya maklumat baru atau perubahan dalam sentimen pasaran, dan inilah saat yang paling ingin ditangkap oleh pedagang trend.
Dengan perkembangan pembelajaran mesin dan teknologi kecerdasan buatan, strategi analisis teknikal tradisional mengalami perubahan yang mendalam. Strategi perpaduan sejajar seperti ini mungkin akan digabungkan dengan algoritma pengenalan corak yang lebih kompleks untuk membentuk sistem perdagangan yang lebih pintar.
Sebagai contoh, kita boleh memperkenalkan data analisis emosi untuk meningkatkan mekanisme pengesahan jumlah transaksi, atau menggunakan model pembelajaran mendalam untuk menyesuaikan parameter nilai tebing secara dinamik untuk pengikatan dan penyebaran. Peningkatan ini akan membolehkan strategi lebih sesuai dengan keadaan pasaran yang berubah-ubah.
Akhirnya, kejayaan dagangan kuantitatif adalah lebih daripada sekadar penggunaan mekanikal petunjuk teknikal, ia adalah pemahaman yang mendalam tentang sifat pasaran dan rasa takut terhadap risiko. Strategi perpaduan dan penyebaran yang tetap ini memberikan kita titik permulaan yang baik, tetapi nilai sebenar adalah bagaimana kita terus menyempurnakan dan mengembangkannya dalam amalan.
/*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="检测到强发散信号")