[英]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 y
和y2
将相等并且在NextFunction
中以完全相同的方式运行。 但出于任何原因,他们没有这样做。
我尝试使用History Referencing但没有成功。
更新 27 - 12 - 2022
我愿意执行的功能仍然无法正常工作。 所以我决定公开整个脚本,以便更好地理解为什么LoadArrayA
和LoadArrayC
无法生成有效的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.