PineScript如何单次security调用执行多个指标函数节省调用额度
PineScript单次security调用执行多指标的优化方案
完全可以实现,通过聚合函数打包返回值的方式,就能把同一标的、同一周期下的多个指标计算合并到单次security调用中,大幅减少调用次数占用。
核心实现思路
同一标的、同一时间周期下的security调用,本质是在指定的K线上下文环境中执行传入的函数逻辑。只要把所有需要在该上下文运行的指标逻辑放到同一个函数中,一次性返回所有计算结果,就不需要拆分多次调用security。
具体写法
保留原有两个自定义指标函数不变,新增一个聚合包装函数,在内部调用两个指标并把所有结果打包返回:
// 原有自定义指标1 f_T1()=> // 自定义指标逻辑...... [a, b] // 原有自定义指标2 f_T2()=> // 另一套自定义指标逻辑...... [d,e,f] // 新增:聚合执行函数 f_getAllIndicatorRes() => [t1_a, t1_b] = f_T1() [t2_d, t2_e, t2_f] = f_T2() // 按固定顺序返回所有需要的结果 [t1_a, t1_b, t2_d, t2_e, t2_f]
之后只需要写一次security调用,接收聚合函数返回的全部结果即可:
// 单次security调用获取所有指标值,*仅占用1次调用额度* [_a, _b, _d, _e, _f] = security(_ticker, timeframe.period, f_getAllIndicatorRes())
注意事项
- 返回值顺序必须严格对应:聚合函数返回元组的字段顺序,必须和
security左侧接收变量的顺序完全一致,否则会出现取值错位,导致指标计算错误。 - 支持自定义参数:如果你的指标函数需要传入参数(比如周期长度、计算系数等),直接把参数加在聚合函数的入参里,内部调用子指标时透传即可,示例:
f_getAllIndicatorRes(t1Length, t2Length) => [t1_a, t1_b] = f_T1(t1Length) [t2_d, t2_e, t2_f] = f_T2(t2Length) [t1_a, t1_b, t2_d, t2_e, t2_f] // 调用时传入对应参数,可统一配置barmerge规则 [_a, _b, _d, _e, _f] = security(_ticker, timeframe.period, f_getAllIndicatorRes(14, 26), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
- 额外收益:统一调用
security可以避免多指标分开调用时,因为barmerge参数配置不一致导致的跨周期数据不对齐问题,减少逻辑bug。 - 额度优化效果:不管你在聚合函数里放多少个同标的同周期的指标逻辑,都只占用1次
security调用额度,能轻松规避40次的调用上限限制。
内容的提问来源于stack exchange,提问作者ALEUNG
相关产品推荐
相关产品推荐

