
この戦略は,ATR (平均リアル波幅) の自己適応ストップ管理とADX (平均方向指数) の方向フィルタリング機能を組み合わせた精巧に設計された突破取引システムである.この戦略は,Nサイクル高点/低点の突破を確認した後に取引に入ると,長期RMA (ローリング移動平均線) のトレンドフィルターは,主動トレンドと一致することを保証する.このシステムは,二段階のストップロズロジックを採用している.
この戦略の核心となる原則は,価格が歴史的なサポートの抵抗点を突破し,トレンド確認と方向の強さのフィルタリングを組み合わせた総合的な判断システムに基づいています.
突破信号生成: N周期 ((デフォルト96)) の高点/低点を突破基準として使用し,価格収束が前期高点を突破して上昇傾向にあるとき,多頭信号を触発し;価格収束が前期低点を突破して下降傾向にあるとき,空頭信号を触発する.
トレンドフィルター: 長期周期 ((デフォルト960) のRMA平均線をトレンド判断基準として使用し,RMA上部の価格は上昇傾向として,RMA下部の価格は下降傾向として見られ,取引方向が主動傾向と一致することを確保する.
ADX方向の強度フィルター: 現在の市場の方向性の強さを計算して ((ADX指数),そしてADXが設定された値 ((デフォルト12) よりも大きく,上昇段階にあることを要求し,方向性の不明確な市場環境をフィルターする.
2段階のストップ・メカニズム:
停止装置の撤回: ストップを追跡した後に,多頭最高価格/空頭最低価格を記録し,価格が極限点から引き下がって設定されたATR倍数 (多頭デフォルトの13倍,空頭デフォルトの4倍) を上回ったときに,ストップを平準化します.
リスク管理に適応する:ATR指数によるストップポジションの動的調整により,戦略が異なる波動率環境においてもリスクを効果的に制御できるようにする.ATRは波動率指数として,市場の実際の波動状況に応じてストップ距離を自動的に調整できるため,固定ポイントストップが異なる市場条件で過幅または過狭になる問題を回避する.
多層のリスク管理戦略は,初期ストップとストップ追跡を組み合わせた二重のストップロジックを採用し,初期リスクが制御可能であることを保証するとともに,収益が拡大した後に利益をロックし,トレンドに十分な発展の余地を与えることができます. このストップ構造は,大きなトレンドの状況を捕捉するのに特に適しています.
方向確認フィルター:ADX指標のフィルタリングにより,市場が十分な方向性を要求し,方向性が強化されている ((ADX>下落とADX>ADX[[1]),明らかなトレンドのない整合市場での頻繁な取引を効果的に回避し,偽突破による損失を減らす.
トレンド一致性保証長期RMA平均線をトレンドフィルターとして使用し,主要トレンドの方向のみで取引することを保証し,逆行操作を避け,取引成功率と資金効率を向上させる.
スマートストップ利回り防止機能の撤回により,価格の大幅な変動の後,利回りが発生したときに利益を早期にロックし,利潤の過剰な回転を回避し,特に変動率の突然の拡大を捕捉するのに適しています.
視覚的な監視戦略は,入場価格,各種のストップライン,破局レベル,トレンドの背景の色をグラフで明確に標識し,トレーダーが戦略の動作状態とキー価格を直視的に監視できるようにします.
偽の突破の危険性:ADXフィルターとトレンド確認を使用しているにもかかわらず,市場では偽の突破が発生することがあります. 特に重要なニュースリリースや流動性の突然の変化の際に. 解決策は,ADXの値を適切に上昇させたり,突破確認の要求を増やすこと,例えば,突破後に継続的な複数のKラインを突破レベル上/下で維持することを要求することです.
パラメータ感度戦略性能はパラメータ設定,特にATR周期,倍数,および突破周期の選択に敏感である.異なる市場環境で最適なパラメータには大きな違いがある可能性がある.異なる市場環境で歴史的回帰を使用してパラメータの安定性を検証することを推奨し,自己適応のパラメータ調整メカニズムを実施することを検討する.
ストップダメージの落とし穴を追跡する: 急激な市場逆転の際,ストップ・ロスを追跡することは価格の変化に及ばず,既得利益の一部を返済する可能性があります. 高波動性のある環境でATR倍数を動的に調整するか,短期的な動態指標と組み合わせて早期に警告する可能性のあるトレンドの逆転を考慮することができます.
長期トレンドのフィルタリングが遅れている: 長期周期RMA平均線をトレンドフィルターとして使用すると,トレンド転換点の近くでミス信号または誤信号を生成する可能性があります. 解決策は,多周期的なトレンド確認を導入するか,より敏感な中短期トレンド指標を補助判断として組み合わせることです.
撤回 早期退出: 強いトレンドでは,撤回停止メカニズムが,未熟な退出が続く傾向を引き起こす可能性がある. 傾向の強度に応じて,撤回値の動的調整を考慮するか,変動率の変化に合わせて,撤回倍数を自律的に調整することを考えることができます.
適応パラメータシステム:市場の波動率とトレンドの強度に基づく自適性パラメータ調整メカニズムを構築し,ATR倍数,ADX値,および撤回倍数を現在の市場環境に応じて自動的に最適化できるようにする.例えば,低波動環境でATR倍数を減らして,高波動環境でATR倍数を増加させる.強い傾向で撤回倍数を上げ,弱い傾向で撤回倍数を減らす.
複数時間枠確認複数の時間枠分析を導入し,より高い時間枠のトレンド方向が取引方向と一致することを要求し,より高い時間枠のサポートレジスタンス点を意思決定参照に含め,突破信号の信頼性を向上させる.
スマートエントリー最適化: 集団入場の仕組みを導入し,最初の突破信号が発覚した後に部分入場し,突破がさらに確認された後に加仓し,偽突破によるリスクを軽減し,実際の突破の状況を逃さないようにする.
波動率感知停止:波動率の変化に基づくスマートストップシステムを開発し,波動率が突然拡大した後により厳しい撤回ストップ条件を設定し,波動率が安定したときに価格により大きな調整スペースを与え,ストップ決定を市場の実際の状態により適合させる.
機械学習の強化: 機械学習アルゴリズムを導入し,歴史的突破パターンを分析し,高い成功率の突破の特徴の組み合わせを識別し,それに基づいて戦略パラメータを動的に調整するか,突破品質評価システムを設定し,高品質の突破信号取引を優先します.
取引コストの最適化:異なる取引品種の流動性特性と取引コスト構造に合わせて,入場タイミングと注文タイプを最適化します.例えば,低流動性の環境で市場価格の代わりに限値シートを使用するか,または高い変動性の環境で追跡限値シート (Trailing Limit Order) を使用して入場します.
感情指標の統合: 市場情緒指標 (例えば波動率指数,市場幅度指数など) と組み合わせて,意思決定の補助的参考として,極端な感情的な環境で戦略パラメータを調整するか,非合理的な市場環境で不必要な損失を避けるために取引を一時停止する.
高精度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)