将循环从 Pine Script 转换为 Python

Conver a loop from Pinescript to Python

我正在尝试将此公式(WMA 移动平均线)转换为 Python 中的循环,来自 Pinescript 但是 for i to x 不存在。我尝试了 for i in range(x) 但似乎 return 没有相同的结果。 to 到底是什么意思? Pinescript 的文档表示 from i to x 但我没有在 Python

中找到等效项
pine_wma(x, y) =>
    norm = 0.0
    sum  = 0.0
    for i = 0 to y - 1
       weight = (y - i) * y
       norm := norm + weight
       sum := sum + x[i] * weight
    sum / norm

plot(pine_wma(close, 15))

Python代码:

import pandas as pd

dataframe = pd.read_csv('dataframe.csv')
  
def formula_wma(x, y):
    list = []
    norm = 0.0
    sum = 0.0
    i = 0
    for i in range(y - 1):
        weight = (y - i) * y
        norm   = norm + weight
        sum    = sum + x[i] * weight
        _wma = sum / norm
        list.append(_wma)
        i += 1
    return list  

wma_slow   = formula_wma(dataframe['close'],45)
dataframe['wma_slow']   = pd.Series(wma_slow, index=dataframe.index[:len(wma_slow)])

print(dataframe['wma_slow'].to_string())

输出:

0       317.328133
[Skipping lines]
39      317.589010
40      317.449259
41      317.421662
42      317.378052
43      317.328133
44             NaN
45             NaN
[Skipping Lines]
2999           NaN
3000           NaN

首先,不要重新分配 built-in 名称!

sum 是一个 built-in 函数,用于计算数字序列的总和。 list也是如此,它是一个class构造函数。

例如:

sum(range(10)) returns 45.

以上等同于:

numbers = (0,1,2,3,4,5,6,7,8,9)
s = 0
for i in numbers: s += i

其次,不要在循环内增加用于循环的变量,除非你有充分的理由这样做。

循环结束时的 i += 1 没有任何作用,for 循环自动将名称重新分配给序列中的下一项,在这种情况下下一项递增 1,因此 i 自动递增。

此外,如果在该行之后有任何使用 i 的内容,它们将中断。

最后,您没有得到相同结果的原因是 Python 使用 zero-based 索引并且范围不包括停止点。

我不知道 pine 脚本,但是从你写的内容来看,from x to y 必须包括 y

例如 0 to 10 在 pine 脚本中会给你 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

但使用 range(10):

print(list(range(10)))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

为什么?因为你指定的范围内刚好有十个数字。

在第一个例子中,实际上有十一个数字。如果你懂数学,等差数列中的项数就是最大项与最小项之差除以增量加一。

那么如何解决你的问题呢?

删除范围内 y 之后的 - 1!

固定码:

import pandas as pd

dataframe = pd.read_csv('dataframe.csv')
  
def formula_wma(x, y):
    lst = []
    norm = 0.0
    sum_ = 0.0
    i = 0
    for i in range(y):
        weight = (y - i) * y
        norm   = norm + weight
        sum_   = sum_ + x[i] * weight
        _wma = sum_ / norm
        lst.append(_wma)
    return lst  

wma_slow   = formula_wma(dataframe['close'],45)
dataframe['wma_slow']   = pd.Series(wma_slow, index=dataframe.index[:len(wma_slow)])

print(dataframe['wma_slow'].to_string())