将循环从 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())
我正在尝试将此公式(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())