微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

安全函数返回“不能使用可变变量作为参数”

如何解决安全函数返回“不能使用可变变量作为参数”

我正在尝试创建一个筛选器,但 atm 收到上述代码行之一的错误 msg xsd:schema

错误的行是:Cannot use a mutable variable as an argument of the security function 所以我猜我的 c01 = security(s01,timeframe.period,condition) 是有缺陷的,但我看到类似的代码在工作,但无法找出问题所在。

顺便说一句,I did see this thread,但无法理解这在这里如何适用。

以下是(希望如此)代码的相关部分,如果您想查看和/或重复使用它,可以找到 the entire code here

感谢您的帮助!

condition

更新:

我已将我的条件更新为一个函数和我的安全函数,如下所示:

lookBack = input(title="Lookback",type=input.integer,defval=24,minval=2)
range = input(title="Upper & Lower Range %",defval=25,minval=10)

s01 = input('BINANCE:BTCUSDT',type=input.symbol)

highestHigh = highest(high,lookBack)
lowestLow = lowest(low,lookBack)
upperRange = highestHigh - ((highestHigh - lowestLow)/range) 
lowerRange = ((highestHigh - lowestLow)/range) + lowestLow
HighAboveUpperRange = high > upperRange
LowBelowLowerRange = low < lowerRange

occurrencesAbove = sum(HighAboveUpperRange ? 1 : 0,lookBack)

triggerA = occurrencesAboveFirstHalf >= 1 ? true : false
triggerB = crossunder(low,lowerRange)
condition = triggerA and triggerB

c01 = security(s01,condition)
scr_label := c01 ? scr_label + s01 + '\n' : scr_label

lab_l = label.new(
          bar_index,scr_label,color=color.gray,textcolor=color.black,style =  label.style_labeldown,yloc = yloc.price)

label.delete(lab_l[1])
plot(0,transp = 100)

虽然安全函数仍然返回 screenerFunc() => triggerA and triggerB and triggerC and triggerD security(s01,res,screenerFunc())

I have also updated the entire code here.

解决方法

您需要将整个触发算法(及其所有因变量)移动到函数内部。像这样:

trigger(range) =>

    lRange = 100/range

    highestHigh = highest(high,lookBack)
    lowestLow = lowest(low,lookBack)

    xAxisStartsAt = bar_index[lookBack]
    xAxisFinishesAt = bar_index
    upperLimit = highestHigh
    lowerLimit = lowestLow

    upperRange = highestHigh - ((highestHigh - lowestLow)/lRange) 
    lowerRange = ((highestHigh - lowestLow)/lRange) + lowestLow

    HighAboveUpperRange = high > upperRange
    LowBelowLowerRange = low < lowerRange

    occurrencesAboveTotal   = sum(HighAboveUpperRange ? 1 : 0,lookBack)
    occurrencesAboveSecondHalf = sum(HighAboveUpperRange ? 1 : 0,lookBack/2)
    occurrencesAboveFirstHalf  = occurrencesAboveTotal - occurrencesAboveSecondHalf

    occurrencesBelowTotal   = sum(LowBelowLowerRange ? 1 : 0,lookBack)
    occurrencesBelowSecondHalf = sum(LowBelowLowerRange ? 1 : 0,lookBack/2)
    occurrencesBelowFirstHalf  = occurrencesBelowTotal - occurrencesBelowSecondHalf

    triggerA = occurrencesAboveFirstHalf >= 1 ? true : false
    triggerB = occurrencesAboveSecondHalf >= 1 ? true : false
    triggerC = occurrencesBelowFirstHalf >= 1 ? true : false
    triggerD = crossunder(low,lowerRange)

    condition = triggerA and triggerB and triggerC and triggerD

c01 = security(s01,timeframe.period,trigger(range))

因为安全函数会读取您的整个函数,并且会根据您请求的时间范围和交易品种用适当的值替换上下文变量(如收盘价、低价等...)。您的布尔变量只是算法的结果,安全功能需要知道整个算法,以便它可以计算布尔值本身。

我测试了这个函数,它确实修复了可变错误,但由于我在函数内部移动了一些变量,它会在代码的其他部分产生一些错误,你可以自己轻松修复它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。