“参考长度 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”错误的问题的主要内容,如果未能解决你的问题,请参考以下文章

400错误 是前端的问题 还是服务器

Tomcat 问题 求救!错误如下:

VBS 错误 处理 问题

vs2022出现错误的警告,谁能解决一下这个编译器问题(代码无问题)?

NSIS Error错误问题

从请求返回字符串时出现错误错误 80020101 的 ajax 问题