如何解决安全函数返回“不能使用可变变量作为参数”
我正在尝试创建一个筛选器,但 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 举报,一经查实,本站将立刻删除。