将一个循环从脚本转换为Python



我试图从Pinescript转换Python中的此公式(WMA移动平均线)for循环,但for i to x不存在。我尝试了for i in range(x),但似乎没有返回相同的结果。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

首先,不要重新分配内置名称!

sum是一个内置函数,用于计算数列的和。list也是,它是一个类构造函数。

例如:

sum(range(10))返回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自动加1。

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

最后,你没有得到相同结果的原因是Python使用从零开始的索引和范围排除停止。

我不知道松树的脚本,但从你写的,from x to y必须包括y

例如,pine脚本中的0 to 10将给出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]

为什么?因为在您指定的范围内恰好有10个数字。

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

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

删除- 1后的y在范围!

固定代码:

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())

最新更新