You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使双指标条件在指定K线范围内满足即触发交易策略?

双指标信号非同时触发时的回溯条件判断

我正在编写包含RSI和Supertrend(ATR)两个指标的交易脚本,问题是两个指标的信号无法在同一根K线同时触发(通常相差1-2根K线)。我的目标是:只要两个条件各自在过去x根K线内曾成立,整个条件语句即判定为真。

我尝试过使用ta.highest和[x]索引,但[x]仅能回溯单根K线,无法覆盖连续x根K线。最终希望实现双条件语句,当两个条件均在过去x根K线内满足时触发策略。


现有代码片段

RSI指标代码

//@version=5
indicator("RSI Indicator", overlay=true)

// Input parameters
rsiLength = input(14, "RSI Length")
overboughtLevel = input(70, "Overbought Level")
oversoldLevel = input(30, "Oversold Level")

// Calculate RSI
rsiValue = ta.rsi(close, rsiLength)

// Condition variables
longCondition = crossover(rsiValue, oversoldLevel)
shortCondition = crossunder(rsiValue, overboughtLevel)

Supertrend(ATR)指标代码

atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)

[supertrend, direction] = ta.supertrend(factor, atrPeriod)

原同步触发逻辑

if ta.change(direction) < 0 and longCondition
    strategy.entry("Long", strategy.long)

if ta.change(direction) > 0 and shortCondition
    strategy.entry("Short", strategy.short)

单条件回溯尝试

xBarsBack = ta.barssince(longCondition)

if xBarsBack < x 
   strategy.entry('long')

解决方案:双条件回溯判断实现

核心思路是分别跟踪两个条件最近一次触发的K线间隔,只要两者都在设定的回溯范围内,就触发开仓信号。以下是完整的策略代码:

//@version=5
strategy("双指标回溯触发策略", overlay=true)

// 自定义输入参数
rsiLength = input(14, "RSI周期")
overboughtLevel = input(70, "超买阈值")
oversoldLevel = input(30, "超卖阈值")
atrPeriod = input(10, "ATR周期")
factor = input.float(3.0, "Supertrend系数", step=0.01)
lookbackPeriod = input.int(2, "回溯K线数", minval=1) // 设定过去x根K线的范围

// 计算RSI信号
rsiValue = ta.rsi(close, rsiLength)
rsiLongSignal = ta.crossover(rsiValue, oversoldLevel)
rsiShortSignal = ta.crossunder(rsiValue, overboughtLevel)

// 计算Supertrend转向信号
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
stLongSignal = ta.change(direction) < 0 // 方向从空转多
stShortSignal = ta.change(direction) > 0 // 方向从多转空

// 回溯判断:两个信号是否都在过去lookbackPeriod根K线内触发过
validLong = ta.barssince(rsiLongSignal) <= lookbackPeriod and ta.barssince(stLongSignal) <= lookbackPeriod
validShort = ta.barssince(rsiShortSignal) <= lookbackPeriod and ta.barssince(stShortSignal) <= lookbackPeriod

// 策略开仓逻辑
if validLong
    strategy.entry("多单", strategy.long)

if validShort
    strategy.entry("空单", strategy.short)

// 可视化指标(可选)
plot(supertrend, color=direction == 1 ? color.green : color.red, title="Supertrend")
plot(rsiValue, "RSI", color=color.blue, display=display.data_window)
hline(overboughtLevel, "超买线", color=color.red)
hline(oversoldLevel, "超卖线", color=color.green)

关键逻辑说明

  • ta.barssince(condition):返回距离最近一次condition成立的K线数量,当前K线成立时返回0
  • lookbackPeriod:可自定义的回溯范围,比如设为2就代表过去2根K线内(含当前)的信号都有效
  • 逻辑与判断:只有RSI和Supertrend的对应信号都在回溯范围内触发过,才会生成开仓信号
  • 可选优化:如果需要避免重复开仓,可以添加strategy.risk.allow_entry_in(strategy.long)限制同一方向的开仓频率,或用ta.barssince(strategy.opentrades)过滤重复触发

内容的提问来源于stack exchange,提问作者rizzy ro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:44:58