使用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
相关产品推荐
相关产品推荐

