【问题标题】:Most efficient way to re-plot candlestick_ohlc from mplfinance从 mplfinance 重新绘制烛台_ohlc 的最有效方法
【发布时间】:2021-06-21 11:22:59
【问题描述】:

我在 tkinter GUI 中有一个 pyplot 图,我正在尝试使用实时数据每秒从 mplfinance 更新 candlestick_ohlc 图。

mySubplot = myFigure.add_subplot(111)

然后每秒运行新数据

mySubplot.clear()
...
repeat all axis formatting 
...
candlestick_ohlc(mySubplot, myData.values)

当只有最近的蜡烛发生变化时,重新格式化我的轴并重新绘制每根蜡烛是非常缓慢的。

最有效的方法是什么?

【问题讨论】:

  • 你可能会发现this很有用

标签: python matplotlib tkinter candlestick-chart mplfinance


【解决方案1】:

我建议使用 new mplfinance API(mpf.plot() 而不是 candlestick_ohlc())。它在处理方面可能效率不高(尽管我怀疑它更有效)但在代码量方面肯定更有效您将不得不编写,因为新的 API 为您做了很多 matplotlib 格式化和其他工作。

我建议在新 API 中使用“外部轴模式”的动画支持功能。这将允许您与 tkinter 进行交互。有关 mplfinance 中动画的一般示例,请参阅 https://github.com/matplotlib/mplfinance/blob/master/markdown/animation.md 和其中的链接(例如 https://github.com/matplotlib/mplfinance/blob/master/examples/mpf_animation_demo2.py)。我认为您将能够将这些示例中的代码调整为使用 tkinter 执行相同操作所需的代码。

【讨论】:

  • 我对这个 (github.com/matplotlib/mplfinance/blob/master/examples/…) 示例以及 FuncAnimation 的工作原理感到困惑。在他们的 animate() 函数中,他们只是清除轴并重新绘制,就像我在 after(1000,updatetk) 循环中所做的一样。
  • 没错。这与您已经在做的非常相似。优点是您不必每次都重复所有格式和相关代码(而是在mpf.plot() 内部完成,因此您的代码可以简单得多。
  • 最终,如果您希望使代码在 CPU 周期方面更高效,您将不得不阅读 blitting 例如这里:matplotlib.org/stable/api/animation_api.html#funcanimation 和这里: matplotlib.org/stable/tutorials/advanced/blitting.html 个人认为,除非您有大量蜡烛(您希望避免每次都重新绘制,但可能仍需要定期绘制它们,具体取决于您允许绘制的大小)成长)。
  • 我每 1 秒只绘制 60 支蜡烛,但需要 300 毫秒才能清除并再次绘制,这似乎很长,让我的 tkinter 滞后。当我尝试使用.clear() 然后mpl.plot() 我的轴仍然被重置并且没有按照我想要的方式格式化。有没有办法在不清除轴格式的情况下清除蜡烛?
  • 我不明白,如果您每秒(1000 毫秒)绘制一次,为什么 300 毫秒的清除和重新绘制会导致延迟。另外,我必须查看您的完整代码才能更好地了解格式的情况。这不应该是一个问题。可能有一种方法可以只清除蜡烛,但这需要对 mplfinance 进行一些代码更改(但可能是简单的更改)。
【解决方案2】:

个人我不会使用 TkinterMPLfinance 来做到这一点!

这是因为:

  1. Tkinter 的帧速率很糟糕,就像我的意思是绝对糟糕一样,你会很幸运通过使用 while 循环不断更改图像来获得 5 fps。
  2. Tkinter 陈旧过时,没有很多其他流行的 GUI 库(如 Qt 和 GTK)所具有的有用功能。
  3. 当您经常使用 MPLfinance 制作图表时,MPLfinance 非常密集,而且制作图表的速度很慢,这会导致您的交易平台变慢。
  4. 您的应用程序的文件会很大。
  5. 数据不准确。

我会这样做以使其“实时”的方式是使用 cocurrent.futures 并行运行三个函数,一个函数将从 api 或通过网络抓取获取有关股票/货币/加密货币的数据(我不建议这样做,因为延迟和延迟会很高),第二个函数将用于制作烛台图,第三个函数将用于运行循环以保持 gui 并不断更新图形的图片变化。

对于 GUI,我可能会使用称为 pygame 的“游戏引擎”,因为它具有更高的 fps,因为它旨在制作游戏,但这会使应用程序变得密集,但会使 fps 更高。如果您在 tkinter 中执行此操作,您会看到随着图表的变化而闪烁,这真的很烦人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多