【问题标题】:How to build an array or collection如何构建数组或集合
【发布时间】:2020-05-10 14:15:51
【问题描述】:

我想构建一个包含几个最后高点的集合,并像在数组中一样访问所有这些高点。 我怎么做?我的代码如下所示:

var float lastHigh = 0
if (highfound)
    lastHigh := high

现在我试试这个:

x := lastHigh[3]

... 但 x 只是最后一个 lastHigh 值(就像它会是 lastHigh[1])。 所以 lastHigh 只是一个“平面”变量,对吧?我怎样才能收集不止一个最后的高点?

【问题讨论】:

  • pine-script 还不支持数组和类似的数据结构。
  • 我知道,pine 中还没有数组。但是必须有解决上述问题的方法..?
  • 只有两种解决方法,afaik:将变量和代码相乘,或者像 RicardoSantos 所做的那样使用伪数组here
  • 或者告诉我们您的最终目标是什么,那么也许还有其他解决方案可以解决您的问题。
  • 我只想检查实际柱线的高点是否高于图表上确定的所有最低(例如 5 个)枢轴高点!

标签: arrays collections series pine-script


【解决方案1】:

假设您的 highfound 函数(未在原始问题中演示)的结果为 false 或 true,您的代码应该可以通过从 x 变量中删除 : 来工作:

x = lastHigh[3]

以下对我来说效果很好:

//@version=4
study("My Script")

var float lastHigh = 0
if (close>open)
    lastHigh := high

x = lastHigh[3]
plot(x, color=color.red)

【讨论】:

  • 谢谢。这不是我真正要寻找的,因为“lastHigh[3]”给了我不完全是倒数第三的最后一个高点(在图表上的某处被确定)......我只是得到了“lastHigh”变量 3 个柱的值以前(例如,也可能是倒数第二的高点)。但是感谢您的贡献! :) 也许我尝试这样解决我的问题。
  • 哦,对不起,我误解了你的问题。我看上面已经解决了。感谢您投票:)
【解决方案2】:

我想出了下一个方法:

//@version=4
study("Three last highs", overlay=true)

// here goes the logic for finding the high
// NOTE: if you are updating this function,
// then it should return either new value for the array or n/a. 
// Because the non-n/a value will be added to the array and the oldest removed
getNewHighOrNa() =>
    pivothigh(high, 3, 3)

newHigh = getNewHighOrNa()




// ======= Array lifecicle =========
ARRAY_LENGTH = 5

arrayCell = label(na)
if bar_index < ARRAY_LENGTH
    arrayCell := label.new(0, 0)
    label.set_y(arrayCell, 0)
else
    if na(newHigh)
        val = label.get_y(arrayCell[1])
        for i = 2 to ARRAY_LENGTH
            v = label.get_y(arrayCell[i])
            label.set_y(arrayCell[i-1], v)
        arrayCell := arrayCell[ARRAY_LENGTH]
        label.set_y(arrayCell, val)
    else
        arrayCell := arrayCell[ARRAY_LENGTH]
        label.set_y(arrayCell, newHigh)
// ==================================

// Array getter by index. Note, that numeration is right to left
// so 0 is the last bar (current) and 1 it's a left to current bar
get(index) => label.get_y(arrayCell[index])

// example of using of the array for calculation average of all elements of the array
mean() =>
    sum = 0.0
    for i = 0 to ARRAY_LENGTH - 1
        sum := sum + get(i) / ARRAY_LENGTH
    sum
plot(mean(), title="Mean", color=color.green)

// example of finding of max value in the array
max_high() =>
    max = get(0)
    for i = 1 to ARRAY_LENGTH - 1
        v = get(i)
        if v > max
            max := v
    max
plot(max_high(), title="MAX", color=color.red)


// the rest is just checking that the code works:
plot(get(0))
plot(get(1))
plot(get(2))
plot(get(3))
plot(get(4))

// mark the bars where we found new highs
plotshape(not na(newHigh), style=shape.flag)

我试图让它变得更容易,但由于松树的限制,没有处理它。但是这段代码有效,你得到了 3 个最后的局部高点,并且可以迭代它们。希望我的问题是正确的。

【讨论】:

  • 好的...谢谢,我去看看。我要做的是简单地计算最后 5 个枢轴高点的最大值,一个枢轴高点简单地由内置函数识别:pivothigh(high, 3, 3)
  • 我已经进行了更改。请注意,有关于如何使用“数组”的评论。此外,我添加了平均值计算和最大值查找示例,以展示如何使用带有循环的数组和使用它的一般逻辑。请记住,使用图纸存在限制 - 它们可能会破坏阵列,因此最好不要将它们与阵列一起使用。如果您需要数组中的更多值(我想最多允许 50 个) - 您只需将变量 ARRAY_LENGTH 更改为数组的新长度。
  • 看起来很棒!谢谢! :-) 我唯一不满意的是,你用每一个没有新高的柱子来移动数组元素。所以当有一个新的高点时,你不一定要扔掉第一个高点(这是最久以前发现的),它可能是第三个或任何其他高点(因为在此之前阵列中的所有高点都有移位)。但我真的很喜欢这个概念! :-) 而且我发现只需进行微小的更改即可纠正该行为(仅在添加新元素时将所有数组元素移动一个位置,这样最旧的元素才会真正丢失)。非常感谢!!
  • 这是一段了不起的代码,米歇尔。多么巧妙!尊重。
猜你喜欢
  • 2015-01-20
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 2013-10-06
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多