可变变量不能在 request.security() 中使用,但有时我们不得不使用它们。有解决方法吗? V5

Mutable Variables can not be used in request.security() but sometimes we are forced to use them. Is there a workaround? V5

我们有一个事件的布尔变量:

SomethingHappened = (high > close) and (low < high) // 

... 如果想限制在某个时间范围内,那么 request.security() 是我们的救星:

SomethingHappenedOnlyIn5Min = request.security(syminfo.tickerid, "5", SomethingHappened)

但是例如在以下情况下,我们的 SomethingHappened 事件只能 是可变变体:

//'n' is where our scope array starts from, if not in the current 0 offset
for ArrayOfOffsets = 0 to k
    SomethingHappenedInSeries := SomethingHappenedInSeries and/or SomethingHappened[n+ArrayOfOffsets]

在这种情况下,我们的 request.security(syminfo.tickerid, "5", SomethingHappenedInSeries) 函数将不起作用。有没有办法避免这个陷阱?

request.security() 不允许可变变量的原因是它们在脚本的计算过程中根据在脚本的全局范围内完成的计算而改变。例如,可变变量 a 可以在开始时为 0,然后根据主图表的 bar_index 突变为 a := 1

这在 request.security() 中行不通,因为传递给安全性的整个表达式是根据传递给它的 symbol/timeframe 单独计算的。您不能从 security() 请求 a,因为它明确绑定到您图表上当前打开的交易品种的上下文,因为变量会根据当前图表上计算的条件发生变化。

解决此问题的方法是使用 user-defined 函数。如果你把你需要的一切都包装在一个函数中,你可以将可变变量传递给 security() 并且它会正确地计算它们。这是因为函数是 self-contained,它可以在与图表上的主要交易品种没有任何联系的情况下提取并在 security().

内部计算

在你的情况下,这看起来像这样:

fun() =>
    SomethingHappened = (high > close) and (low < high) 
    SomethingHappenedInSeries = false
    for ArrayOfOffsets = 0 to k
        SomethingHappenedInSeries := SomethingHappenedInSeries and/or SomethingHappened[n+ArrayOfOffsets]
    SomethingHappenedInSeries
    
SomethingHappenedOnlyIn5Min = request.security(syminfo.tickerid, "5", fun())

只要你将一切包装在一个self-contained函数中,可以安全地提取到不同的上下文中,可变变量就可以在[=17中使用=].