
이 전략은 ATR (평균 실물 파도) 적응적 스톱로스 관리와 ADX (평균 방향 지수) 방향 필터링 기능을 결합한 정교하게 설계된 브레이크 트레이딩 시스템이다. 전략은 N주기 고/저점 브레이크 확인 후 거래에 진입하며, 장기 RMA (Rolling Moving Average) 트렌드 필터를 참조하여 주 트렌드와 일관성을 보장한다. 이 시스템은 2단계 스톱로스 논리를 채택한다.
이 전략의 핵심 원칙은 가격의 역사적인 지지를 통과하는 저항점을 결합한 트렌드 확인과 방향 강도 필터링의 통합 판단 시스템에 기반합니다.
브레이크 신호 생성N주기 (기본 96) 고/저점을 브레이크 레퍼런스 포인트로 사용해서, 가격이 상반기 고를 넘어서 상승 추세에 있을 때, 다중 헤드 신호를 트리거; 가격이 상반기 저점을 넘어서 하향 추세에 있을 때, 공중 헤드 신호를 트리거.
트렌드 필터: 더 긴 주기 (기본 960) 의 RMA 평균선을 트렌드 판단의 근거로 사용하며, RMA 위쪽의 가격은 상승 추세로 간주하고, RMA 아래쪽의 가격은 하향 추세로 간주하여 거래 방향이 주 트렌드와 일치하도록 한다.
ADX 방향 강도 필터: 현재 시장의 방향성 강도를 계산하고 ADX가 설정된 임계값보다 크도록 요구하며, 상승 단계에 있으며, 방향성이 불분명한 시장 환경을 필터링한다.
2단계 상쇄장치:
장치 철회: 트래킹 스톱로스 활성화 후, 다중 헤드 최고 가격 / 공허 최저 가격을 기록하고, 가격이 극한 지점에서 회수 설정 ATR 배수를 초과 할 때 (다중 헤드 기본값 13배, 공허 기본값 4배) 상쇄 포지션을 중지합니다.
자율적 위험 관리: ATR 지표를 통해 스톱 포지션을 동적으로 조정하여 전략이 다양한 변동률 환경에서 위험을 효과적으로 제어 할 수 있습니다. ATR은 변동률 지표로서 시장의 실제 변동에 따라 스톱 거리를 자동으로 조정할 수 있으며, 고정 점수 스톱이 다양한 시장 조건에서 너무 넓거나 너무 좁다는 문제를 피합니다.
다단계 위험 제어이 전략은 초기 중지와 추적 중지와 결합 된 쌍방향 중지 논리를 채택하여 초기 위험을 통제 할 수 있도록 보장하고 수익이 확대 된 후 수익을 잠금하고 추세를 충분히 발전시킬 수있는 공간을 제공합니다. 이러한 중지 구조는 큰 추세 상황을 포착하는 데 특히 적합합니다.
방향 확인 필터: ADX 지표 필터링을 통해 시장이 충분한 방향성을 갖추고 있고 방향성이 강화되고 있다고 요구합니다[1]), 명백한 추세가 없는 평형 시장에서 자주 거래되는 것을 효과적으로 피하고, 가짜 돌파구로 인한 손실을 줄인다.
동향 일관성 보장: 장기 주기 RMA 평균선을 트렌드 필터로 사용하여, 주 트렌드 방향에서만 거래하는 것을 보장하고, 역기능을 피하여 거래 성공률과 자금 효율성을 향상시킵니다.
지능형 정지 장치: 반전 차단 기능을 철회하여 가격의 큰 변동 후 회전이 발생했을 때 수익을 적시에 잠금하여 수익의 과도한 회전을 방지합니다. 특히 변동률의 급격한 확장을 포착하는 데 적합합니다.
시각적 감시전략은 차트에 명확하게 입력 가격, 각종 스톱 라인, 브레이크 레벨 및 트렌드 배경 색상을 표시하여 거래자가 전략 실행 상태와 핵심 가격을 직관적으로 모니터링 할 수 있습니다.
가짜 침입 위험: ADX 필터링과 트렌드 확인을 사용함에도 불구하고, 시장에서 가짜 돌파구가 발생할 수 있습니다. 특히 중요한 보도 발표 또는 급격한 유동성 변화시. 해결 방법은 ADX 경계를 적절히 높이는 것입니다. 또는 돌파구 확인 요구 사항을 추가하는 것입니다.
매개변수 민감도: 전략 성능은 파라미터 설정에 민감하며, 특히 ATR 주기, 곱하기 및 돌파 주기 선택. 다양한 시장 환경에서 최적의 파라미터는 큰 차이가 있을 수 있다.
제휴 지연을 추적하는 방법급격한 역전 시, 트래킹 스톱은 가격 변화를 따라잡지 못할 수 있으며, 이는 이미 얻은 이익의 일부를 반납하게 됩니다. 높은 변동성 환경에서 ATR 배수를 동적으로 조정하거나 단기 동력 지표와 함께 조기 경고 가능한 트렌드 반전을 고려할 수 있습니다.
긴 주기적 추세 필터링 후퇴: 장기 주기 RMA 평균선을 트렌드 필터로 사용하는 것은 트렌드 전환점 근처에서 놓친 신호를 유발하거나 잘못된 신호를 발생시킬 수 있다. 해결책은 다주기 트렌드 확인을 도입하거나 더 민감한 중기기간의 트렌드 지표를 보조 판단으로 결합하는 것이다.
“아직도 너무 일찍 탈퇴했다”: 강한 추세에서, 철회 차단 장치는 조기 탈퇴를 초래할 수 있지만 여전히 계속 발전하는 추세이다. 추세 강도에 따라 역동적으로 철회 차단 값을 조정하거나, 변동률 변화에 따라 철회 배수를 조정하는 것을 고려할 수 있다.
적응된 변수 체계: 시장의 변동률과 트렌드 강도에 따라 적응 변수 조정 메커니즘을 구축하여 ATR 배수, ADX 하위값 및 회수 배수를 현재 시장 환경에 따라 자동으로 최적화 할 수 있습니다. 예를 들어, 낮은 변동 환경에서 ATR 배수를 줄이고 높은 변동 환경에서 ATR 배수를 증가시킵니다. 강한 경향에서 회수 배수를 높이고 약한 경향에서 회수 배수를 감소시킵니다.
다중 시간 프레임 확인다중 시간 프레임 분석을 도입하여 상위 시간 프레임의 트렌드 방향이 거래 방향과 일치하도록 요구하며, 상위 시간 프레임의 지지 저항 지점을 의사 결정 참조에 포함하여 돌파 신호의 신뢰성을 향상시킵니다.
스마트 입학 최적화: 분량 입구 메커니즘을 구현하여, 초기 침입 신호가 발동된 후 부분적으로 입구하고, 침입이 추가로 확인된 후 입장을 높여서, 가짜 침입으로 인한 위험을 줄이고 실제 침입 상황을 놓치지 않도록 보장한다.
변동률 감지 정지: 변동률 변화에 기반한 지능형 정지 시스템을 개발하고, 변동률이 갑자기 확대되면 더 엄격한 철회 정지 조건을 설정하고, 변동률이 안정될 때 가격 조정 공간을 더 많이 부여하여 정지 결정을 시장의 실제 상태에 더 적합하게합니다.
기계 학습 강화: 기계 학습 알고리즘을 도입하여 역사적 돌파구 패턴을 분석하여 높은 성공률의 돌파구를 식별하고 이에 따라 전략 매개 변수를 동적으로 조정하거나 돌파구 품질 점수 시스템을 설정하여 높은 품질의 돌파구 신호 거래를 우선적으로 선택하십시오.
거래 비용 최적화: 다양한 거래 품종의 유동성 특성 및 거래 비용 구조에 맞게 입시 시점과 주문 유형을 최적화합니다. 예를 들어, 낮은 유동성 환경에서 시장 가격을 대신하여 제한 가격을 사용하거나, 높은 변동성 환경에서 추적 제한 가격을 사용하여 입시합니다.
감정 지표 통합: 시장 감정 지표와 결합하여 (예: 변동률 지수, 시장 폭 지표 등) 보조 의사 결정 참조로, 극단적 인 감정 환경에서 전략 파라미터를 조정하거나 거래를 중단하여 비합리적 인 시장 환경에서 불필요한 손실을 피하십시오.
높은 정밀도의 ATR 추적 스톱 브레이크 전략과 ADX 방향 필터링 시스템은 기술 분석의 여러 핵심 사고를 결합한 통합 거래 시스템이다. 트렌드 브레이크를 통해 트렌드 시작점을 포착하고, 트렌드 필터링과 방향 강도를 사용하여 신호 품질을 향상시키고, 적응적 인 위험 관리 및 다단계 스톱 브레이크 메커니즘을 통해 전체적인 자금 관리를 구현한다.
이 전략의 가장 큰 장점은 다양한 시장 환경에 대한 적응성과 완벽한 위험 관리 프레임워크입니다. ATR 지표로 구현된 역동적인 위험 조정으로 인해 전략은 다양한 변동률 환경에서 상대적으로 일관된 위험 노출 수준을 유지할 수 있으며, 쌍단계 중단 및 철회 차단 메커니즘은 자금 보호와 이익 극대화를 고려한 균형 잡힌 솔루션을 제공합니다.
전략에는 파라미터 민감성 및 스톱 로드 지연성 등에 대한 위험이 있지만, 제안된 최적화 방향, 특히 적응된 파라미터 시스템 및 다중 시간 프레임 확인을 통해 이러한 위험을 효과적으로 제어 할 수 있습니다. 기계 학습 및 감정 지표 분석의 추가 도입은 전략의 안정성과 장기 수익 잠재력을 크게 향상시킬 것으로 예상됩니다.
이 전략은 양적 거래자에게는 개인의 위험 선호와 시장 관점에 따라 유연하게 조정 및 확장 할 수있는 견고한 프레임 워크를 제공하며 이론적 깊이와 실용적 가치를 겸비한 거래 시스템입니다.
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy('YTPBTC1HATRSSADX',
overlay=true,
initial_capital=10000,
commission_value=0.1,
default_qty_value=100,
default_qty_type=strategy.percent_of_equity,
margin_long=10,
margin_short=10,
pyramiding=1)
// ==================== 输入参数 ====================
atr_length = input.int(48, 'ATR周期', minval=1, step=12)
atr_mult_1 = input.float(1.0, 'ATR初始止损乘数', minval=0.1, step=0.1)
atr_mult_2 = input.float(9.0, 'ATR追踪止损乘数', minval=0.1)
// 追踪激活倍数
profit_atr_mult = input.float(3.0, 'ATR追踪激活倍数', minval=0.5, step=0.5)
// 固定回撤止盈设置
long_pullback_atr = input.float(13, '多头回撤止盈倍数', minval=0, step=1)
short_pullback_atr = input.float(4, '空头回撤止盈倍数', minval=0, step=1)
breakout_period = input.int(96, title='突破周期', minval=1, step=24)
rma_length = input.int(500, 'RMA趋势过滤周期', minval=1, step=96)
// ADX设置
enable_adx_filter = input.bool(true, '启用ADX过滤')
adx_length = atr_length//input.int(48, 'ADX周期', minval=1, step=12)
adx_threshold = input.float(12, "ADX阈值", minval=1)
use_breakeven = true // 启动追踪时是否先保本止损
// ==================== ATR计算 ====================
atr_value = ta.atr(atr_length)
// ==================== ADX指标计算 ====================
// 真实波幅计算
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))),
math.abs(low - nz(close[1])))
// 方向性移动计算
dm_plus = high - nz(high[1]) > nz(low[1]) - low ? math.max(high - nz(high[1]), 0) : 0
dm_minus = nz(low[1]) - low > high - nz(high[1]) ? math.max(nz(low[1]) - low, 0) : 0
// ADX计算
var float sm_tr = na
var float sm_dm_plus = na
var float sm_dm_minus = na
sm_tr := nz(sm_tr[1]) - nz(sm_tr[1]) / adx_length + tr
sm_dm_plus := nz(sm_dm_plus[1]) - nz(sm_dm_plus[1]) / adx_length + dm_plus
sm_dm_minus := nz(sm_dm_minus[1]) - nz(sm_dm_minus[1]) / adx_length + dm_minus
di_plus = sm_dm_plus / sm_tr * 100
di_minus = sm_dm_minus / sm_tr * 100
dx = math.abs(di_plus - di_minus) / (di_plus + di_minus) * 100
adx = ta.sma(dx, adx_length)
// ==================== 趋势过滤 ====================
rma_trend = ta.rma(close, rma_length)
plot(rma_trend, title='RMA趋势线', color=color.black, linewidth=2)
trend_long = close > rma_trend
trend_short = close < rma_trend
// ==================== 突破信号 ====================
// 获取过去N根K线的最高高点和最低低点(避免未来数据)
highest_high = ta.highest(high, breakout_period)[1]
lowest_low = ta.lowest(low, breakout_period)[1]
// 入场条件 - 修改ADX条件,要求ADX上升
adx_condition = not enable_adx_filter or (adx >= adx_threshold and adx > adx[1])
long_condition = close > highest_high and trend_long and strategy.position_size == 0 and adx_condition
short_condition = close < lowest_low and trend_short and strategy.position_size == 0 and adx_condition
// ==================== 入场执行 ====================
if long_condition
strategy.entry('Long', strategy.long)
if short_condition
strategy.entry('Short', strategy.short)
// ==================== ATR止损系统 ====================
// 止损状态变量
var float long_stop_initial = na // 第一段初始止损
var float long_stop_trail = na // 第二段追踪止损
var bool long_trail_active = false
var float short_stop_initial = na // 第一段初始止损
var float short_stop_trail = na // 第二段追踪止损
var bool short_trail_active = false
// 回撤止盈变量
var float long_highest = na // 多头最高价记录
var float short_lowest = na // 空头最低价记录
// ==================== 多头止损计算 ====================
if strategy.position_size > 0
// 新开多头仓位
if strategy.position_size[1] <= 0
long_stop_initial := strategy.position_avg_price - atr_value * atr_mult_1
long_stop_trail := na
long_trail_active := false
long_highest := na // 重置最高价记录
else
// 计算当前浮动盈亏
float current_profit = close - strategy.position_avg_price
// 检查是否激活追踪止损
if not long_trail_active and current_profit >= atr_value * profit_atr_mult
long_trail_active := true
long_highest := high // 开始记录最高价
// 保本处理
if use_breakeven
long_stop_trail := strategy.position_avg_price
else
long_stop_trail := close - atr_value * atr_mult_2
// 更新追踪止损和最高价记录
if long_trail_active
// 更新最高价记录
long_highest := math.max(long_highest, high)
// 传统追踪止损更新
float new_stop = close - atr_value * atr_mult_2
long_stop_trail := math.max(long_stop_trail, new_stop)
// ==================== 空头止损计算 ====================
if strategy.position_size < 0
// 新开空头仓位
if strategy.position_size[1] >= 0
short_stop_initial := strategy.position_avg_price + atr_value * atr_mult_1
short_stop_trail := na
short_trail_active := false
short_lowest := na // 重置最低价记录
else
// 计算当前浮动盈亏
float current_profit = strategy.position_avg_price - close
// 检查是否激活追踪止损
if not short_trail_active and current_profit >= atr_value * profit_atr_mult
short_trail_active := true
short_lowest := low // 开始记录最低价
// 保本处理
if use_breakeven
short_stop_trail := strategy.position_avg_price
else
short_stop_trail := close + atr_value * atr_mult_2
// 更新追踪止损和最低价记录
if short_trail_active
// 更新最低价记录
short_lowest := math.min(short_lowest, low)
// 传统追踪止损更新
float new_stop = close + atr_value * atr_mult_2
short_stop_trail := math.min(short_stop_trail, new_stop)
// ==================== 止损执行 ====================
// 第一段止损:收盘价止损(未激活追踪时)
if strategy.position_size > 0 and not long_trail_active
// 检查收盘价是否触及初始止损线
if close <= long_stop_initial
strategy.close('Long', comment='初始止损')
if strategy.position_size < 0 and not short_trail_active
// 检查收盘价是否触及初始止损线
if close >= short_stop_initial
strategy.close('Short', comment='初始止损')
// 第二段止损:实时止损(激活追踪后)
if strategy.position_size > 0 and long_trail_active
strategy.exit('Long Trail Stop', from_entry='Long', stop=long_stop_trail)
if strategy.position_size < 0 and short_trail_active
strategy.exit('Short Trail Stop', from_entry='Short', stop=short_stop_trail)
// 动态回撤止盈检查
if strategy.position_size > 0 and long_trail_active and not na(long_highest)
// 计算从最高点回撤幅度
pullback_amount = long_highest - close
pullback_threshold = atr_value * long_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Long', comment='回撤止盈')
if strategy.position_size < 0 and short_trail_active and not na(short_lowest)
// 计算从最低点反弹幅度
pullback_amount = close - short_lowest
pullback_threshold = atr_value * short_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Short', comment='回撤止盈')
// ==================== 变量重置 ====================
if strategy.position_size[1] != 0 and strategy.position_size == 0
long_stop_initial := na
long_stop_trail := na
long_trail_active := false
short_stop_initial := na
short_stop_trail := na
short_trail_active := false
// 重置回撤止盈变量
long_highest := na
short_lowest := na
// ==================== 图表绘制 ====================
plot(strategy.position_avg_price, color=color.new(color.yellow, 44), title="入场均价", linewidth=1)
plot(long_stop_initial, color=color.new(color.blue, 44), title='多头初始止损线', linewidth=1)
plot(short_stop_initial, color=color.new(color.blue, 44), title='空头初始止损线', linewidth=1)
plot(long_stop_trail, color=color.new(color.fuchsia, 44), title='多头追踪止损线', linewidth=1)
plot(short_stop_trail, color=color.new(color.fuchsia, 44), title='空头追踪止损线', linewidth=1)
// 最高/最低价记录线
plot(long_highest, color=color.new(color.green, 70), title='多头最高价', linewidth=1, style=plot.style_stepline)
plot(short_lowest, color=color.new(color.red, 70), title='空头最低价', linewidth=1, style=plot.style_stepline)
// 绘制突破线
plot(highest_high, color=color.new(color.green, 70), title='突破上线')
plot(lowest_low, color=color.new(color.red, 70), title='突破下线')
// 背景颜色显示趋势
bgcolor(trend_long ? color.new(color.green, 95) : trend_short ? color.new(color.red, 95) : na, title="趋势背景")
// ==================== 信息显示 ====================
// 在图表上显示当前策略信息
base_rows = enable_adx_filter ? 3 : 2
var table info_table = table.new(position.top_right, 2, base_rows, bgcolor=color.white, border_width=1)
var int row_index = 0
row_index := 0 // 重置行索引
table.cell(info_table, 0, row_index, "ATR周期", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(atr_length), text_color=color.black, text_size=size.small)
row_index := row_index + 1
// 只在启用ADX时显示
if enable_adx_filter
table.cell(info_table, 0, row_index, "ADX", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(math.round(adx, 1)), text_color=color.black, text_size=size.small)
row_index := row_index + 1
table.cell(info_table, 0, row_index, "追踪倍数", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(profit_atr_mult), text_color=color.black, text_size=size.small)