
다중 시간 프레임 크로스 확인형 무작위 상대적으로 약한 지표 전략은 무작위 상대적으로 강한 지표 ((Stochastic RSI) 의 다양한 시간 프레임의 신호 교차 특성을 교묘하게 결합하고 평균 실제 파장 ((ATR) 필터를 추가하여 시장이 충분한 변동성을 보장하는 통합 거래 시스템입니다. 이 전략의 핵심 아이디어는 짧은 시간 프레임 (5분) 을 통해 초기 신호를 캡처하고 긴 시간 프레임 (15분) 을 사용하여 확인하여 거래 신호의 신뢰성과 정확성을 향상시키는 것입니다.
이 전략의 작동은 4개의 핵심 메커니즘에 기반한다: 초기 신호 트리거, 다중 시간 프레임 확인, 진동율 필터링 및 신호 냉각 시스템.
초기 신호 트리거:
다중 시간 프레임 확인 메커니즘:
ATR 변동률 필터링 장치:
신호 냉각 시스템:
전략은 교차 역전 방식으로 포지션을 관리합니다. 즉, 다중 신호가 발생하면 이미 존재하는 모든 공백 포지션을 제거하고 다중 포지션을 만듭니다.
다단계 필터링 시스템다양한 시간 프레임의 신호 확인과 ATR 변동율 필터링을 결합하여 시스템이 가짜 신호를 크게 줄이고 거래의 질을 향상시킵니다. 다단계 검증 메커니즘은 가장 유리한 시장 조건에서만 입장을 보장하고 불필요한 거래 빈도를 감소시킵니다.
적응력전략의 매개 변수는 RSI 주기, 무작위 지표 평형값, 신호 트리거 하위값 등과 같이 고도로 사용자 정의 할 수 있습니다. 이는 거래자가 다른 시장 환경과 개인 위험 선호도에 따라 최적의 조정을 할 수 있도록합니다.
변동률 감지 능력ATR 필터를 통해, 전략은 시장의 변동 상태를 지능적으로 인식할 수 있으며, 충분한 변동성이있는 조건에서만 거래하며, 정형화 시장에서 작은 변동으로 인해 발생하는 무효 신호를 피합니다.
과도한 거래 보호: 신호 냉각 메커니즘은 의무적인 대기 기간을 통해 일방 거래의 빈도를 제한하는 혁신적인 디자인으로, 시스템에서 짧은 시간에 너무 많은 거래가 발생하지 않도록 방지하고, 수수료 비용과 슬라이드 포인트 손실을 줄입니다.
논리적으로 명확하고 투명합니다.전략의 각 구성 요소는 명확한 기능과 목적이 있으며, 복잡한 블랙 박스 알고리즘이 없습니다. 거래자는 시스템의 작동 방식을 완전히 이해할 수 있도록 해줍니다.
신호 지연성: 다단계 확인 메커니즘은 신호 품질을 향상시키지만, 신호의 지연성을 필연적으로 증가시킵니다. 특히 빠르게 변하는 시장에서 15분 시간 프레임의 확인을 기다리는 것은 최적의 입구 지점을 놓치거나 불리한 입구로 입구 할 수 있습니다.
매개변수 민감도이 전략의 효과는 스토카스틱 RSI의 주기, 오버 바이 오버 시드, 확인 대기 창 등과 같은 파라미터 설정에 크게 의존합니다. 부적절한 파라미터 설정은 유효한 신호를 놓치거나 너무 많은 가짜 신호를 생성 할 수 있습니다.
명확한 차단 장치의 부재전략은 주로 역전 신호에 의존하여 위험을 관리하며, 명확한 스톱 손실 전략이 없습니다. 급격한 폭락이나 단방향 급격한 상황과 같은 극단적인 시장 조건에서는 큰 손실이 발생할 수 있습니다.
주기적 상호작용다중 시간 프레임 전략에서, 각 시간 주기의 지표는 서로 영향을 미치며, 때로는 복잡한 관계를 형성한다. 예를 들어, 특정 시장 조건에서, 5 분과 15 분의 Stochastic RSI는 오랫동안 일관된 방향으로 유지될 수 있으며, 이로 인해 시스템이 역전 신호를 놓치게 된다.
ATR 값 설정 도전ATR 필터의 임계값 설정에는 두 가지 난관이 있습니다. 너무 높으면 유효한 거래 기회를 놓치게 되고, 너무 낮으면 낮은 변동 환경에서 가짜 신호를 효과적으로 필터링 할 수 없습니다.
동적 중지 손해 차단 장치:
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)