我做了一个程序,实时接收原油期货的每一个交易信息。基本上,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}$
目前没有回答
相关问题 更多 >
编程相关推荐