使用 mplfinance 绘图函数用 SMA 200 绘制 OHLC 蜡烛图

问题描述

我正在使用 mplfinance 绘图函数来绘制一个交易品种的 OHLC 烛台图。 OHLC 数据的时间范围为 2 分钟。此外,我正在同一图表上绘制 sma 20 周期和 sma 200 周期。由于 sma200,图表上显示的蜡烛数量非常大(几乎两天的 2 分钟蜡烛)

由于移动平均线是由绘图函数在内部计算的,所以我必须将两天的 2 分钟蜡烛图传递给绘图函数,以便我可以获得 sma200 的一些数据点。烛台图表保存为 png 文件。现在因为图表上显示了大约 300 根蜡烛(也显示了 sma20 和 sma200 线),所以蜡烛显示得不是很清楚。

有没有办法限制在图表上显示的蜡烛数量。如果我将数据帧切片为 30 根蜡烛,那么由于蜡烛数量不足,在这种情况下将不会计算 sma200。我需要的是具有完整数据集的 sma200,但只显示固定数量的蜡烛或固定持续时间的图表,就像过去一小时的蜡烛数据一样。

 mpf.plot(df,type='candle',style='charles',title=title,ylabel='Price',ylabel_lower='Shares \nTraded',mav=(20,200),savefig=file)

解决方法

我建议您计算自己的移动平均线,并使用 mpf.make_addplot() 绘制它。这将允许您根据一分钟或两分钟的蜡烛图计算移动平均线,同时绘制五分钟或十分钟的蜡烛图。例如:

# calculate mav values
mav20  = twominute_df['Close'].rolling( 20).mean()
mav200 = twominute_df['Close'].rolling(200).mean()

# resample:
resample_ohlcmap = {'Open'  :'first','High'  :'max','Low'   :'min','Close' :'last','Volume':'sum'
                   }

tenminute_df = twominute_df.resample('10T').agg(resample_ohlcmap)

# plot ten-minute candles with two-minute mavs:

apmavs = [ mpf.make_addplot(mav20),mpf.make_addplot(mav200) ]

mpf.plot(tenminute_df,type='candle',style='charles',title=title,ylabel='Price',ylabel_lower='Shares \nTraded',addplot=apmavs,savefig=file)

参考文献:

,

感谢丹尼尔的帮助。我现在可以用 sma 20 和 200 绘制 60 根蜡烛图。

好吧,我不需要重新采样,因为我的图表时间范围和移动平均时间范围是相同的。

请找到我的代码片段。

# get list of close prices from symbol_docs. symbol_docs contain 2 min OHLC.
close_list = list(map(lambda a: a['close'],symbol_docs))

# sma20 and 200 calculated using ta-lib 
sma20 = sma(close_list,20)
sma200 = sma(close_list,200)  

# call to plot_chart function
plot_chart('TCS',symbol_docs,sma20,sma200)  

def plot_chart(symbol,docs,sma200):
  df = pd.DataFrame(docs)
  df = df.set_index(['time'])
  df.rename(columns={'open': 'Open','close': 'Close','high': 'High','low': 'Low'},inplace=True)
  title = symbol.upper() + ' - 2min'
  file = saved_chart_image_abs_path + symbol + '.png'

  df['sma20'] = sma20
  df['sma200'] = sma200

  df_sliced = df[-60:]
  apmavs = [mpf.make_addplot(df_sliced['sma20']),mpf.make_addplot(df_sliced['sma200'])]

  mpf.plot(df_sliced,savefig=file)
  telegram_message_sender.send_document(file)
  os.remove(file)

下图作为我的电报群的文档发送:)

TCS - 2min