我试图从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())