如何在COM事件发生时更新自定义图形项(在pyqtgraph中)?

2024-09-29 23:19:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个程序,实时接收原油期货的每一个交易信息。基本上,OnReceiveRealData在执行事务并调用real_get方法时执行。该方法收集当前时间、价格和成交量数据,并据此编制词典。有更多的方法可以从这个实时流数据生成OHLC格式的数据,但我的问题是,每当调用real_get方法时,如何更新自定义图形项(烛台图)?在

class COM_Receiver(QAxWidget):
    def __init__(self):
        super().__init__()
        self._create_com_instance()

        self.list_items = ['CLF18']

        self.OnReceiveRealData.connect(self.real_get)
        self.OnEventConnect.connect(self._event_connect)

    def _create_com_instance(self):
        self.setControl("KFOPENAPI.KFOpenAPICtrl.1")

    def _event_connect(self, err_code):
        if err_code == 0:
            print("connected")
            self.real_set()
        else:
            print("disconnected")
        self.login_event_loop.exit()

    def connect(self):
        self.dynamicCall("CommConnect(1)")
        self.login_event_loop = QEventLoop()                                   
        self.login_event_loop.exec_()

    def real_set(self):
        self.dynamicCall("SetInputValue(str, str)", "itemCode", ';'.join(self.list_items))
        ret = self.dynamicCall("CommRqData(str, str, str, str)", "itemCurrent", "opt10005", "", "1001")

    def real_get(self, code, realtype, realdata):
        if realtype == 'itemCurrent':
            eventTime = ( datetime.utcnow() + timedelta(hours=2) )
            currentPrice = self.dynamicCall("GetCommRealData(str, int)", "itemCurrent", 140)
            currentVolume = self.dynamicCall("GetCommRealData(str, int)", "itemCurrent", 15)

            dic_current = {'eventTime':eventTime, 'currentPrice':currentPrice, 'currentVolume':currentVolume}  

            self.make_ohlc(self.plt, dic_current)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    c = COM_Receiver()
    c.connect()

    sys.exit(app.exec_())

我参考了本文(The fastest way to add a new data bar with pyqtgraph)并意识到只要收到新数据,就可以更新candlesticks,而无需删除和创建CandlestickItem()实例(这就是我现在所做的,它会消耗大量资源)。在

我尝试创建一个CandlestickItem()实例,并在文章中用set_data方法更新它,但是它不能很好地工作,除非我单击图表(plt=pg.绘图()). 也就是说,如果我离开程序大约10分钟,图表不会显示任何差异,但一旦我单击图表,它会立即显示最近10分钟内所有新的烛台。我希望它能实时显示新的烛台,即使我没有连续点击图表。在

每当real_get方法被COM_Receiver类中的OnReceiveRealData事件调用时,如何更新自定义图形项?我认为item.set_data(data=dic_current)应该运行在real_get方法中,但是我目前所做的并没有达到我预期的效果。在

下面的源代码是文章中烛台示例的全部来源。在

^{pr2}$

Tags: 数据方法selfeventdatagetdefconnect

热门问题