虽然我不认为自己是新手,但我会认为自己对Python缺乏经验。我是 MPLFinance 的新手。
我正在尝试在外汇金融图表上绘制交易入场点。我的基本图表运行正常。我的数据来自 DataFrame,它是通过 CSV 导入填充的。其中一列名为“Golden_Cross”的列包含单词“long”,这是我想用箭头绘制的信号。
我正在尝试模拟 mplfinance
documentation中的
percentB_belowzero
函数。我了解该函数的主要功能,但我不知道一些细节。例如price[date]
的意义是什么,previous
的用途是什么?这可能并不重要。下面的代码是我到目前为止所拥有的:
import pandas as pd
import mplfinance as mpf
import math
def go_long(df):
signal = [math.nan] * len(df)
print("len(df) = " + str(len(df)))
print("len(signal) = " + str(len(signal)))
for i in range(1, len(df)):
if df['Golden_Cross'].iloc[i] == "long":
signal.append(df['close'].iloc[i] * 0.99)
else:
signal.append(math.nan)
return signal
if __name__ == '__main__':
df = pd.read_csv('GBPUSD_MA_Crossover2.csv', index_col=0, parse_dates=True)
df.index.name = 'date'
long_signal = go_long(df)
apds = [ mpf.make_addplot(df[['fast_ma', 'slow_ma']], panel=0, title='GBPUSD'),
# mpf.make_addplot((df['dmi']),panel=1, title='DMI'),
mpf.make_addplot(long_signal, type = 'scatter', panel=0, markersize=200, marker='^')
]
mpf.plot(df, type= 'candle', tight_layout=True, datetime_format='%Y-%m-%d', volume=False, show_nontrading=False, addplot=apds)
当我运行上面的代码时,我得到以下堆栈跟踪(对格式感到抱歉):
> len(df) = 381 len(signal) = 381
> Traceback (most recent call last):
> File "/data/stuart/Projects/Python/BackTesting/Scratches/charting1.py",
> line 25, in <module>
> mpf.plot(df, type= 'candle', tight_layout=True, datetime_format='%Y-%m-%d', volume=False, show_nontrading=False,
> addplot=apds)
File
> "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/mplfinance/plotting.py",
> line 808, in plot
> ax = _addplot_columns(panid,panels,ydata,apdict,xdates,config,colcount)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/mplfinance/plotting.py",
> line 1139, in _addplot_columns
> ax.scatter(xdates, ydata, s=size, marker=mark, color=color, alpha=alpha, edgecolors=edgecolors, linewidths=linewidths,label=label)
>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File
> "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/matplotlib/__init__.py",
> line 1473, in inner
> return func(
> ^^^^^ File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/matplotlib/axes/_axes.py",
> line 4787, in scatter
> raise ValueError("x and y must be the same size") ValueError: x and y must be the same size
我不明白
ValueError: x and y must be the same size
的引用。我的 signal
列表和 df
数据框大小相同(请参阅打印语句输出)。
有人可以帮我让这段代码正确运行吗?
最诚挚的问候,斯图尔特M
我无法测试它,但我认为所有问题都在于你如何创建
signal
您应该创建空列表,然后在末尾附加新值。
signal = []
for i in range(...):
signal.append(...)
或者您必须创建具有预期大小的列表并使用索引来替换值
signal = [math.nan] * len(df)
for i in range(...):
signal[i] = ...
但是您将新值附加到现有项目中,以便您的列表有大小
2 * 381