
マルチタイムフレームクロス確認型ランダム相対強弱指標戦略は,ランダム相対強弱指標 ((Stochastic RSI) が異なる時間フレームで交差するシグナル特性を巧妙に組み合わせ,平均真波幅 ((ATR) フィルターで市場が十分な波動性を確保する総合的な取引システムである.この戦略の核心思想は,短い時間フレーム (5分) を介して初期シグナルを捕捉し,長い時間フレーム (15分) を利用して確認し,取引シグナルの信頼性と正確性を向上させることである.また,この戦略は,シグナル冷却機構を設計し,短時間で頻繁な取引を回避し,過剰取引のリスクを効果的に軽減する.
この戦略の動作は,最初の信号の誘発,複数の時間枠の確認,波動率のフィルタリング,信号の冷却システムという4つのコアメカニズムに基づいています.
初期信号のトリガー:
複数の時間枠の確認機構:
ATR波動率フィルター機構:
信号冷却システム:
策略は,交叉反転の方法でポジションを管理します.つまり,多信号が発生すると,既にある空のポジションをクリアして多ポジションを確立します.空の信号が発生すると,既にある多ポジションをクリアして多ポジションを確立します.
多層のフィルタリングシステム: 異なる時間枠のシグナル確認とATRの変動率のフィルタリングを組み合わせることで,システムは偽のシグナルを大幅に削減し,取引の質を向上させます. 多層の検証機構は,最も有利な市場条件でのみ入場を保証し,不必要な取引の頻度を低下させます.
適応力がある戦略パラメータは,RSI周期,ランダムな指数平衡値,シグナルトリガー値などの高度にカスタマイズ可能であり,異なる市場環境と個人リスクの好みに合わせて最適化調整を行うことができます.
波動率を感知する能力ATRフィルターにより,戦略は市場の波動状態を賢明に認識し,十分な波動性の条件下でのみ取引し,集積市場での小さな波動によって生じる無効信号を回避します.
過剰取引の保護: 信号冷却機構は,強制的な待機期間によって同方向の取引の頻度を制限する革新的な設計であり,短時間でシステムに過剰な取引を防止し,手数料のコストと滑り点の損失を削減します.
論理が明確で透明です戦略の各構成要素には明確な機能と目的があり,複雑な難解なブラックボックスアルゴリズムがないため,トレーダーはシステムの動作を完全に理解し,操作の自信を高めます.
信号の遅延: 複数層の確認メカニズムは,信号の質を向上させる一方で,不可避的に信号の遅延を増加させる.特に,急速に変化する市場では,15分間の時間枠の確認を待つことは,最適なエントリーポイントを逃すか,不利な位置でエントリーを引き起こす可能性があります.
パラメータ感度戦略の効果は,ストキャスティックRSIの周期,超値の超値の超値,確認の待機ウィンドウなどのパラメータの設定に大きく依存しています. 不適切なパラメータの設定は,有効な信号を逃すか,偽の信号を過剰に発生させる可能性があります.
明確な停止メカニズムがない戦略は主に逆転信号に頼ってリスクを管理し,明確なストップ・ロスの戦略はありません. 極端な市場条件では,大幅な空飛躍や一方向の急速な動きなど,大きな損失を引き起こす可能性があります.
周期は互いに影響する多時間枠戦略では,各時間周期の指標が相互に影響し,時には複雑な関係が形成されます.例えば,特定の市場条件下では,5分と15分のストキャスティックRSIは,長時間一貫した方向を維持し,システムの反転信号を逃す可能性があります.
ATRの値引き設定の課題ATRフィルターの値設定には2つの難点がある.高すぎると有効な取引機会が逃れ,低すぎると低波動環境における偽信号を効果的にフィルターできない.
ダイナミック・ストップ・ダメージ・ストップ・メカニズム:
strategy.exit()命令は,ATR倍数に基づくストップを設定します.strategy.exit("long_exit", "LE", stop=entry_price - current_atr_value * 2)。トレンドフィルターを追加:
trend_direction = request.security(syminfo.tickerid, "240", ta.ema(close, 200) < ta.ema(close, 50) ? -1 : 1)取引方向のフィルター条件として動態参数最適化:
dynamic_overbought = 70 + math.min(15, current_atr_value / 2)。強化信号確認メカニズム:
bb_condition = (close - ta.sma(close, 20)) / (ta.stdev(close, 20) * 2)価格と平均値の偏差を評価するために用いられる.資金管理の最適化:
position_size = strategy.initial_capital * 0.01 * (recent_win_rate * 2)。多時間枠のクロス確認型ランダム型比較的強い指標戦略は,多層の信号確認とフィルタリング機構によって取引品質を効果的に向上させ,偽信号のリスクを低減する巧妙に設計された取引システムである.この戦略は,波動性の高い市場環境に特に適しており,ATRフィルターにより,低波動の市場で無効信号が過剰に発生することを避け,信号冷却機構は,過剰取引の問題を効果的に制御している.
この戦略の最大の利点は,その論理的明晰さ,パラメータの調整性,適応性の強さで,異なる取引品種と市場環境に適応できるようにするものである.しかし,明確な停止メカニズムが欠如し,信号の遅延が存在する可能性があるため,トレーダーは,実際のアプリケーションで,追加のリスク管理措置を追加し,特定の取引品種と個人のリスク好みに応じてパラメータを最適化すべきである.
この戦略は,ダイナミック・ストップ・ローズ・メカニズム,トレンド・フィルター,資金管理の最適化などの推奨された最適化措置を導入することで,さらに安定性と収益性を高め,より包括的で信頼性の高い取引システムになる見込みである.
/*backtest
start: 2025-05-04 00:00:00
end: 2025-06-03 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Archertoria
//@version=6
strategy("System 0530 - Stoch RSI Strategy with ATR filter")
// --- 原始指标输入参数 ---
g_stoch = "Stochastic RSI 参数"
rsi_len = input.int(14, "RSI 周期", minval=1, group=g_stoch)
stoch_rsi_len = input.int(14, "Stochastic of RSI 周期 (K Period for Stoch)", minval=1, group=g_stoch)
stoch_k_smooth = input.int(3, "Stochastic %K 平滑 (D Period for Stoch)", minval=1, group=g_stoch)
stoch_d_smooth = input.int(3, "Stochastic %D 平滑 (Smoothing for final D)", minval=1, group=g_stoch)
g_signal = "信号触发与确认参数"
stoch_5min_k_long_trigger = input.float(30.0, "5分钟 Stoch K 做多触发水平 (K需 ≤ 此值)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="5分钟图上,K线向上交叉D线时,当时的K值必须小于或等于此设定值,才会启动做多信号等待。")
stoch_5min_k_short_trigger = input.float(70.0, "5分钟 Stoch K 做空触发水平 (K需 ≥ 此值)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="5分钟图上,K线向下交叉D线时,当时的K值必须大于或等于此设定值,才会启动做空信号等待。")
stoch_15min_long_entry_level = input.int(40, "15分钟 Stoch K 做多确认阈值 (K需低于此值)", minval=0, maxval=100, group=g_signal, tooltip="15分钟图上,最终确认做多时,15分钟K线值需低于此设定值。")
stoch_15min_short_entry_level = input.int(60, "15分钟 Stoch K 做空确认阈值 (K需高于此值)", minval=0, maxval=100, group=g_signal, tooltip="15分钟图上,最终确认做空时,15分钟K线值需高于此设定值。")
wait_window_5min_bars = input.int(5, "等待15分钟信号的K线数 (5分钟图)", minval=1, group=g_signal, tooltip="5分钟信号发出后,在接下来的N根5分钟K线内等待15分钟信号确认。")
g_repeat_filter = "重复信号过滤设置"
use_signal_cooldown_filter = input.bool(true, title="启用重复信号过滤器", group=g_repeat_filter, tooltip="过滤掉短时间内同向的重复信号。")
min_bars_between_signals = input.int(18, title="同向信号最小间隔K线数", minval=1, group=g_repeat_filter, tooltip="一个信号发出后,至少等待这么多根K线才会发出下一个同向信号。")
// --- 策略特定输入参数 ---
g_strategy = "策略参数"
leverage_multiplier = input.float(1.0, "杠杆倍数 (仅影响理论头寸大小)", minval=1.0, step=0.1, group=g_strategy, tooltip="注意:TradingView策略本身不直接模拟保证金账户的杠杆爆仓。此杠杆用于计算理论头寸大小。实际杠杆效果需在支持杠杆的经纪商处体现。")
// --- ATR波动率过滤器参数 --- (止盈止损参数组已删除)
g_volatility = "波动率过滤器参数 (ATR)"
use_atr_filter = input.bool(true, "启用ATR波动率过滤器", group=g_volatility, tooltip="勾选以启用ATR过滤器。")
atr_period = input.int(14, "ATR计算周期", minval=1, group=g_volatility)
min_atr_value_ticks = input.float(10, "ATR最小跳动点数阈值", minval=0, step=1, group=g_volatility, tooltip="ATR值(以合约最小跳动点数为单位)必须大于等于此阈值才允许开仓。例如,如果最小跳动点是0.1,这里填10,则要求ATR至少为1.0。0表示不基于此项过滤。")
// --- 函数: 计算 Stochastic RSI ---
getStochasticRSI(src, rsiLen, stochLen, kSmooth, dSmooth) =>
rsi_val = ta.rsi(src, rsiLen)
stoch_rsi_k_raw = ta.stoch(rsi_val, rsi_val, rsi_val, stochLen)
stoch_rsi_k = ta.sma(stoch_rsi_k_raw, kSmooth)
stoch_rsi_d = ta.sma(stoch_rsi_k, dSmooth)
[stoch_rsi_k, stoch_rsi_d]
// --- 时间序列数据获取与Stochastic RSI计算 ---
[stoch_k_15min_val, stoch_d_15min_val] = request.security(syminfo.tickerid, "15", getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth), lookahead=barmerge.lookahead_off)
[stoch_k_5min_val, stoch_d_5min_val] = getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth)
// --- ATR 计算 ---
current_atr_value = ta.atr(atr_period)
atr_condition_met = not use_atr_filter or (min_atr_value_ticks == 0) or (current_atr_value / syminfo.mintick >= min_atr_value_ticks)
// --- 信号逻辑状态变量 ---
var bool waiting_for_15m_long_confirm = false
var bool waiting_for_15m_short_confirm = false
var int bars_elapsed_in_wait_state = 0
var int last_long_signal_bar_idx = -min_bars_between_signals
var int last_short_signal_bar_idx = -min_bars_between_signals
// --- 检测5分钟Stochastic RSI交叉事件 ---
bool stoch_5min_crossed_up_prev_bar = ta.crossover(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool stoch_5min_crossed_down_prev_bar = ta.crossunder(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool condition_5min_k_level_for_long_trigger = stoch_k_5min_val[1] <= stoch_5min_k_long_trigger
bool condition_5min_k_level_for_short_trigger = stoch_k_5min_val[1] >= stoch_5min_k_short_trigger
// --- 管理等待状态和容错期 ---
if (stoch_5min_crossed_up_prev_bar and condition_5min_k_level_for_long_trigger)
can_trigger_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
if (can_trigger_new_long)
waiting_for_15m_long_confirm := true
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 1
else
if (waiting_for_15m_long_confirm or waiting_for_15m_short_confirm)
bars_elapsed_in_wait_state := 1
else if (stoch_5min_crossed_down_prev_bar and condition_5min_k_level_for_short_trigger)
can_trigger_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
if (can_trigger_new_short)
waiting_for_15m_short_confirm := true
waiting_for_15m_long_confirm := false
bars_elapsed_in_wait_state := 1
else
if (waiting_for_15m_long_confirm or waiting_for_15m_short_confirm)
bars_elapsed_in_wait_state := 1
else if (waiting_for_15m_long_confirm or waiting_for_15m_short_confirm)
bars_elapsed_in_wait_state += 1
if (bars_elapsed_in_wait_state > wait_window_5min_bars)
waiting_for_15m_long_confirm := false
waiting_for_15m_short_confirm := false
// bars_elapsed_in_wait_state := 0 // Optional reset
// --- 15分钟Stochastic RSI确认条件 ---
bool confirm_15min_long_stoch_kd_cond = stoch_k_15min_val >= stoch_d_15min_val
bool confirm_15min_short_stoch_kd_cond = stoch_k_15min_val <= stoch_d_15min_val
bool filter_15min_stoch_level_long = stoch_k_15min_val < stoch_15min_long_entry_level
bool filter_15min_stoch_level_short = stoch_k_15min_val > stoch_15min_short_entry_level
// --- 主要信号判断 (用于策略逻辑) ---
entry_long_signal = false
entry_short_signal = false
if (waiting_for_15m_long_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
if (confirm_15min_long_stoch_kd_cond and filter_15min_stoch_level_long)
can_confirm_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
if (can_confirm_new_long)
if (atr_condition_met) // ATR 过滤器检查
entry_long_signal := true
last_long_signal_bar_idx := bar_index
waiting_for_15m_long_confirm := false
bars_elapsed_in_wait_state := 0
else
waiting_for_15m_long_confirm := false
bars_elapsed_in_wait_state := 0
if (waiting_for_15m_short_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
if (confirm_15min_short_stoch_kd_cond and filter_15min_stoch_level_short)
can_confirm_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
if (can_confirm_new_short)
if (atr_condition_met) // ATR 过滤器检查
entry_short_signal := true
last_short_signal_bar_idx := bar_index
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 0
else
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 0
// --- 策略执行逻辑 ---
if (entry_long_signal)
strategy.entry("LE", strategy.long, comment="long entry")
if (entry_short_signal)
strategy.entry("SE", strategy.short, comment="short entry")
// --- 绘图 ---
plotshape(entry_long_signal, title="做多信号点", location=location.belowbar, color=color.new(color.green,0), style=shape.triangleup, size=size.small)
plotshape(entry_short_signal, title="做空信号点", location=location.abovebar, color=color.new(color.red,0), style=shape.triangledown, size=size.small)