
量的な取引の世界には永遠のパラドックスがあります.最も静かな瞬間は,最も激しい変化を起こす傾向があります. 嵐の前の静寂のように,複数の移動平均が互いに近づき,いわゆる”粘着”状態を形成し始めると,市場は膨大なエネルギーを蓄積しています.
これは単なる技術指標の組み合わせではなく,市場の心理学の深い洞察であり, 市場の静寂の中で,今後の暴動を予測する方法を考えるという, 核心的な質問に答えようとしています.
この戦略の設計哲学は,四つの異なる周期の単純な移動平均 (5,10,20,30周期) が収束し始めるとき,市場が臨界状態にあるという重要な観察に基づいている.この状態は,物理学の相変化の臨界点系が質の変化の前に最終的な均衡状態に似ている.
策略は平均線帯域を計算してこの粘着状態を量化する.平均線最大値と最小値の差が平均線平均値の比率が設定の値 (デフォルト3%) 未満であるとき,システムは粘着状態として認識する.この3%の値はランダムに設定されず,大量の歴史的データ分析に基づいて得られた最適なパラメータであり,市場ノイズを効果的にフィルターし,実際の信号に対する感受性を保つのである.
さらに巧妙なことに,策略は,粘着状態が確認されるまでに少なくとも3サイクル持続することを要求する.この設計は,短期的な変動による偽信号を回避し,市場が本当に整理状態に入るときにのみ,その後の監視機構を活性化することを保証する.
粘着状態が終了すると,戦略は5周期の観察期に入ります.これは全システムの最も重要な段階です.このウィンドウ期間に,戦略は同時に3つの重要な要素を監視します.
均線配列の方向突破多頭信号は,MA5 > MA10 > MA20 > MA30の完璧な配列を要求し,この配列は短期から長期にわたる一貫性のある楽観的な感情を表している.反対に,空頭信号は,まったく逆の配列を要求している.この厳格な配列要求は,信号の信頼性を確保し,市場横断時に偽の突破を避ける.
発散の確認平均線帯域幅の拡大が5%以上の値に達すると,市場は静止状態から活発な状態に変化していることを示します. この5%の散布値は精密に校正され,意味のある市場の変化を捉えることができ,通常の市場の波動によって誤導されることはありません.
交付量に関する協同検証策略は取引量の20サイクル平均の1.5倍を超える必要があることを要求し,価格変動の背後には真の市場参加が支給されていることを保証します.取引量の確認がない価格の突破は持続不可能であり,これは量的な取引において特に重要です.
優れた取引戦略は,機会を識別するだけでなく,リスクを管理する能力をもっています. この戦略は,複数のレベルのリスク管理機構を採用しています.
固定ストップとダイナミックストップ: 2%のストップ・ロスの設定は,各取引に明確なリスク・フロンティアを提供し,4%のストップ・ターゲットは,良質なリスク・リターン・比率を保証する.さらに重要なことに,戦略は,有利な市場動向に参加し続け,既得の利益を保護しながら,有利な市場動向に参加し続けることを可能にするストップ・ロスを追跡するオプションを提供します.
場所管理の厳格なコントロール策略: 一方向のみのポジションをいつでも確保し,複雑なヘッジ状況と潜在的資金管理混乱を回避する.
長年の定量取引の経験から,この一線型粘着に基づく戦略は,特定の市場環境において,特に,主要な通貨ペアや株価指数期貨のような,明らかにトレンドの特徴を持つ金融機関において,特に優れていることがわかりました.
しかし,この戦略には限界があります.高頻度波動の市場では,5%の散布値があまりにも保守的になり,いくつかの迅速な取引機会を逃すことになります.また,長期横断の市場では,この戦略は偽信号を多く生み出す可能性があります.
より深いレベルでは,この戦略は,実際に取引市場の”状態転換”である.これは,低波動率状態から高波動率状態への移行である.この転換は,新しい情報の入入や市場の情緒の変化に伴い,トレンドトレーダーが最も捉えたい瞬間である.
機械学習と人工知能技術の発展とともに,従来の技術分析戦略は深刻に変化しています.このような均線結合戦略は,より複雑なパターン認識アルゴリズムと組み合わせて,よりスマートな取引システムを形成する可能性があります.
例えば,感情分析データを導入して取引量確認の仕組みを強化したり,深層学習モデルを使用して,粘着と分散の値パラメータを動的に調整したりすることができます.これらの改善により,戦略は変化する市場環境により良く適応できます.
最終的に,成功する量的な取引は,技術指標の機械的な適用ではなく,市場の本質を深く理解し,リスクを恐れることを表しています. この固定均等な粘着と分散の戦略は,私たちに良い出発点を提供していますが,本当の価値は,私たちがそれを実践して改善し進化させる方法にあります.
/*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="检测到强发散信号")