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

使用request.security动态调用自定义函数时syminfo.tickerid失效的问题

问题原因与解决方法

问题根源

request.security() 的第三个参数是在你请求的目标标的/时间框架的上下文中执行的:

  • 你在 sec1 的判断里直接调用 syminfo.tickerid,拿到的是目标标的(示例中的 BITSTAMP:BTCUSD),而非当前图表的标的(BITSTAMP:ETHUSD),导致判断条件永远为假,始终执行 func2(),最终两条线都是EMA30。
  • 你示例中 sec2 的逻辑看似正常,其实是逻辑误区:如果直接在security内部用 timeframe.period,取到的是目标周期(60),而非当前图表的周期(30),只是巧合适配了你的测试场景,正确逻辑同样需要提前提取当前上下文变量。

解决方法

提前将当前图表上下文的关键变量(标的tickerid、周期)赋值给独立变量,再在 request.security() 的参数中使用这些变量,避免直接在security内部调用上下文相关的内置变量。

修改后的示例代码

//@version=5
indicator("security, cust-func, ticker-id", "", true)

// 提前提取当前图表的标的ID和周期
current_ticker = syminfo.tickerid
current_timeframe = timeframe.period

func1() => ta.ema(close, 3)
func2() => ta.ema(close, 30)

// 使用提前定义的变量判断当前图表标的
sec1 = request.security('BITSTAMP:BTCUSD', '60', str.upper(current_ticker) == 'BITSTAMP:ETHUSD' ? func1() : func2()) 
// 使用提前定义的变量判断当前图表周期
sec2 = request.security('BITSTAMP:BTCUSD', '60', current_timeframe == '30' ? func1() : func2()) 

plot1b = plot(sec1, color=color.red)
plot2b = plot(sec2, color=color.green)

补充说明

request.security() 的核心特性就是切换执行上下文到目标标的/周期,所以所有在第三个参数中调用的 syminfo.*、timeframe.* 等内置变量,都会指向目标上下文的值,而非当前图表的。如果需要基于当前图表的逻辑动态选择函数,必须先提取当前上下文的变量再传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:13:15