关于request.security()返回对象副本及hRs2.s值异常的技术问询
问题解答
1. request.security() 返回的是对象副本吗?
是的,request.security() 返回的是传入对象的副本,而非原对象的引用。
普通函数传递对象时,Pine Script 采用引用传递,修改函数内的对象会直接影响原对象;但 request.security() 是跨时间框架/交易品种获取数据的特殊函数,它的执行逻辑是:
- 将传入的对象序列化后,发送到目标时间框架/品种的执行上下文
- 执行完指定函数(比如你的
f1(obj))后,将结果反序列化返回给主脚本上下文
这个序列化/反序列化过程会创建对象的独立副本,因此修改返回的对象不会影响原对象。
2. 为何 hRs2.s 在赋值前变为"333 hRs2 changed",且仅部分K线出现?
这是由 Pine Script 的逐K线执行模型和 request.security() 的执行特性共同导致的:
- Pine Script 会对每一根K线从头执行整个脚本,非
var声明的变量会在每根K线重新初始化;如果hRs2是用var声明的全局对象,它的状态会在K线间保留 request.security()的请求结果并非实时同步:在部分K线中,当主脚本还未完成当前K线的变量赋值时,之前K线中request.security()触发的函数执行可能会修改hRs2的状态(因为var变量跨K线保留)- 只有当目标时间框架/品种的K线数据更新时机与当前主脚本K线的执行时机重叠时,才会出现这种提前修改的情况,因此仅部分K线会触发该现象
你可以通过以下方式验证:
- 用
var声明独立的测试对象,分别在主脚本和request.security()的回调函数中修改,观察状态变化 - 在赋值前打印
hRs2的状态,确认修改发生的具体执行阶段
内容的提问来源于stack exchange,提问作者Moebius
相关产品推荐
相关产品推荐

