“参考长度 max_bars_back”错误的问题
Posted
技术标签:
【中文标题】“参考长度 max_bars_back”错误的问题【英文标题】:Problems with "referencing lengths max_bars_back" error 【发布时间】:2021-04-01 06:21:05 【问题描述】:我目前正在编写一个新脚本,但会遇到一些奇怪的行为,具体取决于我目前正在处理的股票或指数。 我的新脚本似乎在某些股票上运行良好,但在其他股票、指数或外汇对上抛出以下错误:
Pine 无法确定系列的参考长度。尝试在研究或策略函数中使用 max_bars_back
我已经阅读了 Pine 文档中的条目,还尝试将“max_bars_back”添加到研究中,但没有任何结果。
因此,出于演示目的,我分解了我的脚本,现在有一个版本会在每只股票上引发此错误。
代码如下:
//@version=4
study("***_Test", overlay = true, max_bars_back=100)
var int loopRange = 0
var int trendState = 2
var bool firstBreak = true
var float hp_last = low
var float hp_current = high
float tempHighest = 0
int tempHighPosition = 0
var bool waitForConfirmation = false
float source = close // Used Price
for i = loopRange to 0
if ( source[i] > tempHighest )
tempHighest := source[i]
tempHighPosition := i
if ( source > hp_current )
waitForConfirmation := true
hp_current := source
if ( waitForConfirmation )
if ( firstBreak )
firstBreak := false
if ( trendState == 1 )
trendState := 2
else
trendState := 0
hp_last := hp_current[1]
if ( tempHighPosition > 3 )
loopRange := 3
waitForConfirmation := false
firstBreak := true
loopRange := loopRange + 1
color trendLineColor = color.green
if ( trendState == 0 )
trendLineColor := color.green
else if ( trendState == 1 )
trendLineColor := color.red
else
trendLineColor := color.silver
// Plot trendline
plot(source, color = trendLineColor)
如果我删除第一个 for 循环或行:
if ( trendState == 1 )
trendState := 2
else
trendState := 0
不会发生错误。
我认为该错误意味着我尝试越界访问数据,但我看不到确切的位置... 你们中有人知道是什么线导致了这种行为吗?
【问题讨论】:
您能否编辑您的问题并解释您要达到的目标?我认为这将使社区能够帮助您。另外,我认为您使用 for 循环以错误的方式解决了您的问题。 感谢您的回答,我将更多信息放在下面作为安德烈回答下的评论。但我可能会在这里添加我使用 for 循环的原因。我想寻找新的高点,并将它们用作价值区域,并估计市场是否处于区间或上升趋势中。我不使用最高/最低方法,因为我不希望上升趋势中的每根新蜡烛都出现“突破”。我只想要上升趋势结束时的新高点,所以当一定数量的蜡烛收盘价低于左右的新高点时。出于这个原因,我使用循环来获得不仅是高点 值,但也是它在 loopRange 中的位置。 loopRange 始终是新高点的最后一个高点,并在新高点确认后更新 【参考方案1】:问题出在这里:
for i = loopRange to 0
if ( source[i] > tempHighest )
tempHighest := source[i]
tempHighPosition := i
...
loopRange := loopRange + 1
您浏览每个柱上的所有可用历史记录以找到最高价。这是低效的,并且会给您错误“引用系列的长度”。如果您描述了脚本的最终目标,我们可以提供更有效的解决方法。
【讨论】:
嗨 Born 和 Andrey,我想找出给定范围内的最高和最低值,并定期调整(大部分时间约为 10-50 根蜡烛)我知道我可以使用最高/最低的方法,但我想要一个不使用这些方法的解决方案。我不明白为什么这个循环会产生问题,我从 0 的循环范围开始(所以只有 1 次迭代),而不是只有从不超过历史蜡烛的正值。我什至在研究中添加了“max_bars_back=100”以避免出现问题。最奇怪的是,我的原始脚本适用于某些股票,但会产生错误 其他股票。因此,如果循环访问的次数超过历史蜡烛,它不应该适用于所有股票,而且不仅在指数或外汇对上失败......当我从 0 开始增加 loopRange 时,我应该无法访问数据界限还是我忽略了什么?如您所见,在最后一个高点之后形成 3 根较低的蜡烛后,我调整了循环范围。所以我的参考在过去应该永远不会高于约 50 根蜡烛,并且总是从最后一个高点的第一根蜡烛开始 我可以在这里发布我的整个脚本,但上次我做了类似的事情,人们抱怨代码太长,我应该隔离和分解代码,以便更容易看到问题.So my reference should be never higher than ~50 candles
- 如果是这样,您可以这样解决问题:loopRange := min(loopRange + 1, 50)
max_bars_back = 150
表示引擎所有系列(有历史)变量和对象的历史最大长度最多有 150 个历史值。如果您未指定 max_bars_back
值,引擎会尝试在前 200-300 个柱上分别检测每个系列变量的最大历史长度。如果您在第 1000 根柱之后引用更多历史记录,则会发生“引用长度 max_bars_back”错误。【参考方案2】:
你可以试试下面的代码,而不是循环
解决方案 1:
tempHighest = highest(source, loopRange)
tempHighPosition = highestbars(source, loopRange)
但是,这些内置函数也可能会循环。以下代码不会循环
解决方案 2:
var tempHighest = 0.0
var tempHighPosition = 0
if (source > tempHighest)
tempHighest := source
tempHighPosition := 0
else
tempHighPosition := tempHighPosition + 1
【讨论】:
以上是关于“参考长度 max_bars_back”错误的问题的主要内容,如果未能解决你的问题,请参考以下文章