我制定了一个程序,实时接收原油期货的每一笔交易信息。基本上,OnReceiveRealData
在执行事务时执行并调用real_get
方法。在该方法中,收集当前时间,价格和体积数据并用它们制作字典。有更多方法可以从这个实时流数据中制作OHLC格式数据,但我的问题是如何{strong>更新自定义图形项(烛台图),只要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),并意识到我可以更新烛台,而无需在收到新数据时删除并创建CandlestickItem()
实例(这就是我现在的做法,它消耗了一个很多资源)。
我尝试制作一个CandlestickItem()实例并使用文章中的set_data
方法进行更新,但是,除非我点击图表,否则它不会很好地显示更新的烛台( plt = pg.plot())。也就是说,如果我离开程序大约10分钟,图表并没有显示任何差异,但是一旦我点击图表,它会立即显示最后10分钟的所有新烛台。我希望它能够实时显示新的烛台,即使我没有连续点击图表。
如果real_get
类中的OnReceiveRealData
事件调用了COM_Receiver
方法,我怎样才能更新自定义图形项?我认为item.set_data(data=dic_current)
应该以{{1}}方式运行,但到目前为止我所尝试的并不像我期望的那样工作。
以下来源是该文章中烛台示例的全部来源。
real_get