
양적 거래의 세계에는 영원한 모순이 있습니다. 가장 조용한 순간이 가장 급격한 변화를 낳습니다. 폭풍우가 오기 전의 평화와 마찬가지로, 여러 이동 평균이 서로 붙어있는 것을 시작하면, “접착” 상태가 형성됩니다.
이것은 단지 기술적인 지표들의 조합이 아니라, 시장 심리학에 대한 깊은 통찰력입니다. 그것은 핵심적인 질문에 답하려고 합니다. 시장의 침묵 속에서 다가오는 폭동을 어떻게 예측할 수 있을까요?
이 전략의 설계 철학은 하나의 핵심적인 관찰에 기반을 두고 있다: 4개의 서로 다른 주기들의 간단한 이동 평균이 (5, 10, 20, 30주기) 수렴하기 시작했을 때, 시장은 한 가지 위기상태에 있다. 이 상태는 물리학에서 변하는 위기점 시스템이 질적인 변화가 일어나기 전의 마지막 균형과 비슷하다.
전략은 평균선 대역폭을 계산하여 이러한 접착 상태를 정량화한다. 평균선 최대값과 최소값의 차이는 평균선 평균값의 비율이 설정된 스레드값 (설정값 3%) 보다 낮을 때, 시스템은 접착 상태로 인식한다. 이 3% 스레드값은 임의로 설정된 것이 아니라, 많은 역사적 데이터 분석을 바탕으로 얻은 최적의 파라미터가므로, 시장 소음을 효과적으로 필터링하면서 실제 신호에 대한 민감성을 유지한다.
더욱 정교한 것은, 전략은 집착 상태가 확인되기 위해 최소 3 회 동안 지속되어야 한다고 요구한다. 이 디자인은 단기 변동으로 인한 가짜 신호를 피하고, 시장이 실제로 정리 상태에 들어갔을 때만 후속 모니터링 메커니즘이 활성화되도록 보장한다.
접착 상태가 끝나면, 전략은 5주간의 관찰 기간에 들어갑니다. 이것은 전체 시스템에서 가장 중요한 단계입니다. 이 창 기간 동안, 전략은 동시에 세 가지 중요한 요소를 모니터링합니다.
평선 배열의 방향적 돌파구다중 헤드 신호는 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="检测到强发散信号")