繁体   English   中英

如何在 PineScript 中获取带有时间序列切片的数组?

[英]How to get an array with a timeseries slice in PineScript?

我在Pinescript中有以下代码,我基本上是在尝试将时间序列分割成一个数组,以便在NextFunction中使用。

使用直接用array.from实例化的数组时, NextFunction可以正常工作。 但是当由LoadArray实例化时,它不起作用。 为什么会这样? 如何将LoadArray变成与 NextFunction 兼容的NextFunction

Ps.: NextFunction使用矩阵来执行它的计算。

LoadArray(series, length) =>
    res = array.new_float(length)
    for i = length - 1 to 0
        array.set(res, i, series[i])
    res := res

NextFunction(y) =>
    ...
    ...

y = LoadArray(close, 5)
y2 = array.from(1212.3, 1211.6, 1212.7, 1214.8, 1216.1)

res1 = NextFunction(y2) // works alright
res2 = NextFunction(y) // does not work

我预计生成的 arrays yy2将相等并且在NextFunction中以完全相同的方式运行。 但出于任何原因,他们没有这样做。

我尝试使用History Referencing但没有成功。


更新 27 - 12 - 2022

我愿意执行的功能仍然无法正常工作。 所以我决定公开整个脚本,以便更好地理解为什么LoadArrayALoadArrayC无法生成有效的coef数组。

var global_print_counter = array.new_int()
array.push(global_print_counter, 0)

print(txt = "") => 
    if txt != "" and barstate.islast
        int print_counter = array.get(global_print_counter, 0)
        printLabel = label.new(x=bar_index, y=high - print_counter*7500, textcolor=color.white, color=color.black, text=txt)
        array.set(global_print_counter, 0, print_counter + 1)

//@version=5
indicator(title="LoadArray Test", shorttitle="LT", format=format.volume)

PowerSummation(vector0, power0, vector1, power1) =>
    var accumulator = 0.0
    for i = 0 to array.size(vector0) - 1
        accumulator += math.pow(array.get(vector0, i), power0)*math.pow(array.get(vector1, i), power1)
    accumulator := accumulator

GetCoefficients(x, y) =>
    int n = array.size(x)
    var coefficients = array.from(1.0, 1.0, 1.0)
    var A = matrix.new<float>(3, 3, 0)
    var idv = array.new_float(array.size(x), 1)

    float ex1 = PowerSummation(x, 1, idv, 0)
    float ex2 = PowerSummation(x, 2, idv, 0)
    float ex3 = PowerSummation(x, 3, idv, 0)
    float ex4 = PowerSummation(x, 4, idv, 0)
    var ex = array.from(ex1, ex2, ex3, ex4)

    matrix.set(A, 0, 0, n)
    matrix.set(A, 0, 1, ex1)
    matrix.set(A, 0, 2, ex2)
    matrix.set(A, 1, 0, ex1)
    matrix.set(A, 1, 1, ex2)
    matrix.set(A, 1, 2, ex3)
    matrix.set(A, 2, 0, ex2)
    matrix.set(A, 2, 1, ex3)
    matrix.set(A, 2, 2, ex4)

    var B = matrix.new<float>(3, 1, 0)

    float b3 = PowerSummation(x, 2, y, 1)
    float b2 = PowerSummation(x, 1, y, 1)
    float b1 = PowerSummation(idv, 0, y, 1)    

    matrix.set(B, 0, 0, b1)
    matrix.set(B, 1, 0, b2)
    matrix.set(B, 2, 0, b3)
    
    var invA = matrix.inv(A)
    var X = matrix.mult(invA, B)
    coefficients := array.from(matrix.get(X, 0, 0), matrix.get(X, 1, 0), matrix.get(X, 2, 0))

LoadArrayA(series, length) =>
    res = array.new_float(length)
    for i = length - 1 to 0
        array.set(res, i, series[i])
    res := res

LoadArrayB(series, length) =>
    res = array.from(1219.23, 1219.54, 1220.57, 1221.2, 1221.01)
    res := res

LoadArrayC(series, length) => 
    res = array.new_float() 
    for i = length - 1 to 0 
        array.unshift(res, series[i]) 
    res := res

Linspace(length) =>
    res = array.new_float(length)
    for i = 0 to array.size(res) - 1
        array.set(res, i, i)
    res := res
    
x = Linspace(5)
y = LoadArrayB(close, 5) // works
// y = LoadArrayA(close, 5) // does not produce valid coef
// y = LoadArrayC(close, 5) // does not produce valid coef

coef = GetCoefficients(x, y)
print(str.tostring(coef))

这两个 arrays 不包含相同类型的变量。
y2 (array.from) 包含 float 类型
y (LoadArray) 包含一个系列浮点类型,因为 [x] 返回一系列值(参见https://www.tradingview.com/pine-script-reference/v5/#op_[]
您的 NextFunction 似乎只适用于 float。

切换到以下LoadArray实现应该可以修复它。

LoadArray(series, length) =>
    res = array.new<float>(length, series)
    res := res

你能改变吗

LoadArray(series, length) =>
    res = array.new_float(length)
    for i = length - 1 to 0
        array.set(res, i, series[i])

到:

LoadArray(series, length) => 
    res = array.new_float() 
    for i = length - 1 to 0 
        array.unshift(res, series[i]) 

使用第一种技术,您将用相同的副本填充数组,设置它们将设置所有,您将获得的唯一结果来自上一次迭代。

如果这不起作用,我们真的需要更多信息☺️

@fikira12 在https 上发布的答案://t.me/PineCodersQA

您需要防止na值,这些值在系列具有足够的历史记录可供参考之前就已进入早期柱的计算中。 您可以等到图表上处理的柱数大于您的长度,或者您可以使用nz()替换na值。 可以尝试一个包含nz()的修改函数,如下所示:

PowerSummation(vector0, power0, vector1, power1) => 
    var accumulator = 0.0 
    for i = 0 to array.size(vector0) - 1 
        accumulator += math.pow(nz(array.get(vector0, i)), power0)*math.pow(nz(array.get(vector1, i)), power1) 
    accumulator := accumulator

干杯,祝你编码好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM