【问题标题】:Iterator in loop is considered a series form?循环中的迭代器被认为是系列形式?
【发布时间】:2020-12-10 07:10:15
【问题描述】:

pine 脚本中似乎有一个错误破坏了我编写的指标。以前(在 ~Oct2020 之前),我有一个指标,它使用 ema 函数在 for 循环内进行了一些计算。现在,当我尝试添加脚本时,Pine Script 会引发错误:

添加到图表操作失败,原因:第 21 行:无法调用 'ema' 参数(系列[浮点],系列[整数]);可用的重载: ema(series[float], integer) => series[float]

这是我正在尝试运行的示例:

//@version=4
study("My Script")
emastep = 5
emashort = 5
thisema = 0.0
emanum = 10
lastema = ema(close, emashort)
for i = 1 to emanum
    thisema := ema(close, round(i*emastep))
plot(thisema)

问题似乎是ema(close, round(i*emastep)) 部分中的“i”。有趣的是 pine 脚本手册 (https://www.tradingview.com/pine-script-docs/en/v4/language/Expressions_declarations_and_statements.html#for-statement) 中的示例脚本现在也抛出了同样的错误。上述链接中的以下示例不起作用:

//@version=4
study("RMA in for loop")
sum = 0.0
for i = 1 to 2
    sum := sum + rma(close, i)
plot(sum)

关于如何解决这个问题的任何想法? for 循环中的 i 不应该是系列形式,对吧?

【问题讨论】:

    标签: pine-script


    【解决方案1】:

    正如我所怀疑的,引发错误的错误与for 循环中的i 迭代器有关。如果我创建自己的迭代器并使用它,一切正常。这是我想出的解决方案:

    //@version=4
    study("My Script")
    emastep = 5
    emashort = 5
    thisema = 0.0
    emanum = 10
    lastema = ema(close, emashort)
    iter = 1
    for i = 1 to emanum
        thisema := ema(close, round(iter*emastep))
        iter := iter + 1 
    plot(thisema)
    

    希望这对其他人有所帮助。

    【讨论】:

    • 不错的解决方案!我很惊讶它的工作原理,因为你的 iter 变量也是一个可变变量。很好的发现:) 我赞成你的解决方案。
    【解决方案2】:

    多个松木函数支持dynamic length arguments.
    但是,rma() 不是其中之一。

    这个函数从不接受动态参数长度,在 Pine 的 v3 中也不接受。
    仅仅因为它在 v3 中没有抛出错误并不意味着计算是正确的。
    此示例计算 v3 中的 rma,一次在循环中,一次使用固定值,但两者都应生成 rma(close, 15)

    //@version=3
    study("RMA fixed length vs variable length")
    
    sum = 0.0
    i = 0
    
    for i = 1 to 15
        sum := rma(close, i)
    
    plot(rma(close, 15), color=green)
    plot(sum, color=red)
    

    两者都应该返回长度为 15 的 rma,但结果却大不相同(=不正确),因为使用了不受支持的可变长度输入。

    rma() 的参考手册显示了如何在函数中计算 rma 的示例。
    您可以在代码中使用它作为解决方法。

    //@version=4
    study("RMA in for loop")
    
    // Built-in RMA
    plot(rma(close, 15), color=color.green)
    
    // The same on pine
    pine_rma(src, length) =>
        alpha = 1/length
        sum = 0.0
        sum := na(sum[1]) ? sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1])
    
    plot(pine_rma(close, 15), color=color.red)
    
    
    // Your code with built-in rma(), this will NOT work
    // sum = 0.0
    // for i = 1 to 2
    //     sum := sum + rma(close, i)
    
    // plot(sum, color.blue)
    
    
    // Your code with pine_rma(), this will work
    sum = 0.0
    for i = 1 to 2
        sum := sum + pine_rma(close, i)
    
    plot(sum, color.blue)
    

    请注意此代码中的红线和绿线是如何相同(重叠)的。
    这证明了pine_rma() 的结果与内置的rma() 相同,但具有接受可变变量作为输入的额外优势,这会导致蓝线,如您所愿。

    【讨论】:

    • 感谢您的指点。我想有些东西改变了,因为循环中的i 迭代器不应该是动态的,而是静态的。实际上,我想出了一个解决方法,详情如下。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2016-06-20
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多