class ContractManager(QtWidgets.QWidget): """合约管理组件""" signal = QtCore.Signal(type(Event())) # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent): """Constructor""" super(ContractManager, self).__init__(parent=parent) self.eventEngine = eventEngine self.mainEngine = mainEngine self.parent = parent self.initUi() # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.lineSymbol = QtWidgets.QLineEdit(u'rb1805') self.pushButton = QtWidgets.QPushButton(u'订阅合约') self.pushButton.clicked.connect(self.symbolTextSelect) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.lineSymbol) hbox.addWidget(self.pushButton) hbox.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox) self.setLayout(vbox) def symbolTextSelect(self): self.symbolText = self.lineSymbol.text() print(self.symbolText) if self.symbolText: self.parent.loadKlineData(str(self.symbolText))
class CtaStrategyManager(QtWidgets.QGroupBox): """策略管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, ctaEngine, eventEngine, name, parent=None): """Constructor""" super(CtaStrategyManager, self).__init__(parent) self.ctaEngine = ctaEngine self.eventEngine = eventEngine self.name = name self.initUi() self.updateMonitor() self.registerEvent() #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setTitle(self.name) self.paramMonitor = CtaValueMonitor(self) self.varMonitor = CtaValueMonitor(self) height = 65 self.paramMonitor.setFixedHeight(height) self.varMonitor.setFixedHeight(height) buttonInit = QtWidgets.QPushButton(text.INIT) buttonStart = QtWidgets.QPushButton(text.START) buttonStop = QtWidgets.QPushButton(text.STOP) buttonInit.clicked.connect(self.init) buttonStart.clicked.connect(self.start) buttonStop.clicked.connect(self.stop) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(buttonInit) hbox1.addWidget(buttonStart) hbox1.addWidget(buttonStop) hbox1.addStretch() hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(self.paramMonitor) hbox3 = QtWidgets.QHBoxLayout() hbox3.addWidget(self.varMonitor) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) self.setLayout(vbox) #---------------------------------------------------------------------- def updateMonitor(self): """显示策略最新状态""" paramDict = self.ctaEngine.getStrategyParam(self.name) if paramDict: self.paramMonitor.updateData(paramDict) varDict = self.ctaEngine.getStrategyVar(self.name) if varDict: self.varMonitor.updateData(varDict) #---------------------------------------------------------------------- def updateVar(self, event): """更新策略变量""" data = event.dict_['data'] self.varMonitor.updateData(data) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateVar) self.eventEngine.register(EVENT_CTA_STRATEGY+self.name, self.signal.emit) #---------------------------------------------------------------------- def init(self): """初始化策略""" self.ctaEngine.initStrategy(self.name) #---------------------------------------------------------------------- def start(self): """启动策略""" self.ctaEngine.startStrategy(self.name) #---------------------------------------------------------------------- def stop(self): """停止策略""" self.ctaEngine.stopStrategy(self.name)
class CtaEngineManager(QtWidgets.QWidget): """CTA引擎管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, ctaEngine, eventEngine, parent=None): """Constructor""" super(CtaEngineManager, self).__init__(parent) self.ctaEngine = ctaEngine self.eventEngine = eventEngine self.strategyLoaded = False self.initUi() self.registerEvent() # 记录日志 self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED) #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(text.CTA_STRATEGY) # 按钮 loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY) initAllButton = QtWidgets.QPushButton(text.INIT_ALL) startAllButton = QtWidgets.QPushButton(text.START_ALL) stopAllButton = QtWidgets.QPushButton(text.STOP_ALL) loadButton.clicked.connect(self.load) initAllButton.clicked.connect(self.initAll) startAllButton.clicked.connect(self.startAll) stopAllButton.clicked.connect(self.stopAll) # 滚动区域,放置所有的CtaStrategyManager self.scrollArea = QtWidgets.QScrollArea() self.scrollArea.setWidgetResizable(True) # CTA组件的日志监控 self.ctaLogMonitor = QtWidgets.QTextEdit() self.ctaLogMonitor.setReadOnly(True) self.ctaLogMonitor.setMaximumHeight(200) # 设置布局 hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(loadButton) hbox2.addWidget(initAllButton) hbox2.addWidget(startAllButton) hbox2.addWidget(stopAllButton) hbox2.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox2) vbox.addWidget(self.scrollArea) vbox.addWidget(self.ctaLogMonitor) self.setLayout(vbox) #---------------------------------------------------------------------- def initStrategyManager(self): """初始化策略管理组件界面""" w = QtWidgets.QWidget() vbox = QtWidgets.QVBoxLayout() l = self.ctaEngine.getStrategyNames() for name in l: strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name) vbox.addWidget(strategyManager) vbox.addStretch() w.setLayout(vbox) self.scrollArea.setWidget(w) #---------------------------------------------------------------------- def initAll(self): """全部初始化""" self.ctaEngine.initAll() #---------------------------------------------------------------------- def startAll(self): """全部启动""" self.ctaEngine.startAll() #---------------------------------------------------------------------- def stopAll(self): """全部停止""" self.ctaEngine.stopAll() #---------------------------------------------------------------------- def load(self): """加载策略""" if not self.strategyLoaded: self.ctaEngine.loadSetting() self.initStrategyManager() self.strategyLoaded = True self.ctaEngine.writeCtaLog(text.STRATEGY_LOADED) #---------------------------------------------------------------------- def updateCtaLog(self, event): """更新CTA相关日志""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.ctaLogMonitor.append(content) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateCtaLog) self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
class CmaStrategyManager(QtWidgets.QGroupBox): """策略管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, cmaEngine, eventEngine, name, parent=None): """Constructor""" super(CmaStrategyManager, self).__init__(parent) self.cmaEngine = cmaEngine self.eventEngine = eventEngine self.name = name self.initUi() self.updateMonitor() self.registerEvent() #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setTitle(self.name) self.paramMonitor = CmaValueMonitor(self) # 参数监控 self.varMonitor = CmaValueMonitor(self) # 变量监控 height = 80 self.paramMonitor.setFixedHeight(height) self.varMonitor.setFixedHeight(height) buttonInit = QtWidgets.QPushButton(text.INIT) buttonStart = QtWidgets.QPushButton(text.START) buttonStop = QtWidgets.QPushButton(text.STOP) buttonInitForce = QtWidgets.QPushButton(text.FORCEINIT) buttonInit.clicked.connect(self.init) buttonStart.clicked.connect(self.start) buttonStop.clicked.connect(self.stop) buttonInitForce.clicked.connect(self.initForce) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(buttonInit) hbox1.addWidget(buttonStart) hbox1.addWidget(buttonStop) hbox1.addWidget(buttonInitForce) hbox1.addStretch() hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(self.paramMonitor) hbox3 = QtWidgets.QHBoxLayout() hbox3.addWidget(self.varMonitor) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) self.setLayout(vbox) #---------------------------------------------------------------------- def updateMonitor(self, event=None): """显示策略最新状态""" # 获取策略的参数目录 paramDict = self.cmaEngine.getStrategyParam(self.name) if paramDict: self.paramMonitor.updateData(paramDict) # 获取策略的变量目录 varDict = self.cmaEngine.getStrategyVar(self.name) if varDict: self.varMonitor.updateData(varDict) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" # 绑定事件的更新函数为updateMonitor self.signal.connect(self.updateMonitor) # 注册事件 self.eventEngine.register(EVENT_CTA_STRATEGY+self.name, self.signal.emit) #---------------------------------------------------------------------- def init(self): """初始化策略""" self.cmaEngine.initStrategy(self.name) def initForce(self): """强制初始化策略""" self.cmaEngine.initStrategy(self.name, force = True) #---------------------------------------------------------------------- def start(self): """启动策略""" self.cmaEngine.startStrategy(self.name) #---------------------------------------------------------------------- def stop(self): """停止策略""" self.cmaEngine.stopStrategy(self.name)
class CmaEngineManager(QtWidgets.QWidget): """CTA引擎管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, cmaEngine, eventEngine, parent=None): """Constructor""" super(CmaEngineManager, self).__init__(parent) self.cmaEngine = cmaEngine self.eventEngine = eventEngine self.strategyLoaded = False self.initUi() self.registerEvent() # 记录日志 self.cmaEngine.writeCtaLog(text.CMA_ENGINE_STARTED) #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'Cross Market Arbitrage') # 按钮 loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY) initAllButton = QtWidgets.QPushButton(text.INIT_ALL) startAllButton = QtWidgets.QPushButton(text.START_ALL) stopAllButton = QtWidgets.QPushButton(text.STOP_ALL) savePositionButton = QtWidgets.QPushButton(text.SAVE_POSITION_DATA) loadButton.clicked.connect(self.load) initAllButton.clicked.connect(self.initAll) startAllButton.clicked.connect(self.startAll) stopAllButton.clicked.connect(self.stopAll) # 滚动区域,放置所有的CtaStrategyManager self.scrollArea = QtWidgets.QScrollArea() self.scrollArea.setWidgetResizable(True) # CTA组件的日志监控 self.cmaLogMonitor = QtWidgets.QTextEdit() self.cmaLogMonitor.setReadOnly(True) self.cmaLogMonitor.setMaximumHeight(200) # 设置布局 hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(loadButton) hbox2.addWidget(initAllButton) hbox2.addWidget(startAllButton) hbox2.addWidget(stopAllButton) hbox2.addWidget(savePositionButton) hbox2.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox2) vbox.addWidget(self.scrollArea) vbox.addWidget(self.cmaLogMonitor) self.setLayout(vbox) # ---------------------------------------------------------------------- def initStrategyManager(self): """初始化策略管理组件界面""" w = QtWidgets.QWidget() vbox = QtWidgets.QVBoxLayout() for name in self.cmaEngine.strategyDict.keys(): # 为每一个策略实例,创建对应的管理组件实例 strategyManager = CmaStrategyManager(self.cmaEngine, self.eventEngine, name) vbox.addWidget(strategyManager) sleep(0.2) vbox.addStretch() w.setLayout(vbox) self.scrollArea.setWidget(w) # ---------------------------------------------------------------------- def initAll(self): """全部初始化""" for name in self.cmaEngine.strategyDict.keys(): self.cmaEngine.initStrategy(name) # ---------------------------------------------------------------------- def startAll(self): """全部启动""" for name in self.cmaEngine.strategyDict.keys(): self.cmaEngine.startStrategy(name) # ---------------------------------------------------------------------- def stopAll(self): """全部停止""" for name in self.cmaEngine.strategyDict.keys(): self.cmaEngine.stopStrategy(name) # ---------------------------------------------------------------------- def load(self): """加载策略""" if not self.strategyLoaded: try: self.cmaEngine.loadSetting() self.initStrategyManager() self.strategyLoaded = True self.cmaEngine.writeCtaLog(text.STRATEGY_LOADED) except Exception as ex: self.cmaEngine.writeCtaError(str(ex)) traceback.print_exc() # ---------------------------------------------------------------------- def updateCtaLog(self, event): """更新CTA相关日志""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.cmaLogMonitor.append(content) # ---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateCtaLog) self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
class RpcServerMonitor(QtWidgets.QWidget): #RPC服务端监控容器组件 #1)连接服务端,gw名称, #2)连接状态;操作:停止服务端,停止gw连接,启动gw连接) #3)CtaEngineMonitorWidget #4)RpcEventLogMonitor Warning\Error\Nofification\Critical Log signal = QtCore.Signal(type(Event())) # ---------------------------------------------------------------------- def __init__(self, name, req_addr, sub_addr, sub_topics, parent=None): """Constructor""" super(RpcServerMonitor, self).__init__(parent) self.name = name # rpc Gateway Name self.reqAddress = req_addr # Request/Response Port self.pubAddress = sub_addr # Subscribe Port self.subscribeTopics = sub_topics # subscribe Topics # 创建事件引擎 self.eventEngine = EventEngine2() self.rpc_client = None self.mainEngine = None self.server_info_monitor = None self.initUi() # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" # 1) 服务端级别按钮, btnConnectRpcServer = QtWidgets.QPushButton(u'Connect {0}'.format( self.name)) btnActivateGateWayConnection = QtWidgets.QPushButton(u'activate CTP') btnDeactivateGateway = QtWidgets.QPushButton(u'Deactivate CTP') btnQryStatus = QtWidgets.QPushButton(u'Qry Status') btnConnectRpcServer.clicked.connect(self.connect_rpc_server) btnActivateGateWayConnection.clicked.connect( self.activate_gateway_connection) btnDeactivateGateway.clicked.connect( self.deactivate_gateway_connection) btnQryStatus.clicked.connect(self.qryStatus) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(btnConnectRpcServer) hbox1.addWidget(btnActivateGateWayConnection) hbox1.addWidget(btnDeactivateGateway) hbox1.addWidget(btnQryStatus) self.chkCritical = QtWidgets.QCheckBox('Critical') self.chkCritical.setChecked(True) self.chkError = QtWidgets.QCheckBox('Error') self.chkError.setChecked(True) self.chkWarning = QtWidgets.QCheckBox('Warning') self.chkWarning.setChecked(True) self.chkCtaLog = QtWidgets.QCheckBox('CtaLog') self.chkCtaLog.setChecked(True) self.chkTicks = QtWidgets.QCheckBox('Ticks') self.chkTicks.setChecked(False) self.chkSignal = QtWidgets.QCheckBox('Signal') self.chkSignal.setChecked(True) hbox1.addWidget(self.chkCritical) hbox1.addWidget(self.chkError) hbox1.addWidget(self.chkWarning) hbox1.addWidget(self.chkCtaLog) hbox1.addWidget(self.chkTicks) hbox1.addWidget(self.chkSignal) hbox1.addStretch() self.server_info_monitor = ServerInfoWidget() # 滚动区域,放置所有的CtaStrategyManager self.scrollArea = QtWidgets.QScrollArea() self.scrollArea.setWidgetResizable(True) # 2)服务端策略监控widget self.ctaMonitor = CtaEngineMonitorWidget(self) # 参数监控 self.ctaMonitor.setMinimumHeight(200) #self.ctaMonitor.setMinimumWidth(800) hbox2 = QtWidgets.QVBoxLayout() hbox2.addWidget(self.ctaMonitor) self.scrollArea.setLayout(hbox2) # 服务端日志监控widget self.logMonitor = QtWidgets.QTextEdit() self.logMonitor.setReadOnly(True) self.logMonitor.setMaximumHeight(200) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addWidget(self.server_info_monitor) # 添加服务监控 vbox.addWidget(self.logMonitor) vbox.addWidget(self.scrollArea) self.setLayout(vbox) def connect_rpc_server(self): """连接到远程服务端""" if self.rpc_client is not None: return try: self.eventEngine.start(timer=False) self.rpc_client = VtClient(self.reqAddress, self.pubAddress, self.eventEngine) # 这里是订阅所有的publish event,也可以指定。 self.rpc_client.subscribeTopic(self.subscribeTopics) self.rpc_client.start() # 初始化主引擎和主窗口对象 self.mainEngine = ClientEngine(self.rpc_client, self.eventEngine) self.ctaMonitor.setMainEngine(self.mainEngine) # 绑定本地GUI与EventEngine的事件 self.registerEvent() except Exception as ex: traceback.print_exc() self.logMonitor.append(str(ex)) def registerEvent(self): """注册事件""" self.signal.connect(self.processEvent) if self.eventEngine: self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit) self.eventEngine.register(EVENT_STATUS, self.signal.emit) def activate_gateway_connection(self): """激活服务端连接网关""" if self.mainEngine is None: return try: self.mainEngine.connect(self.name) except Exception as ex: self.logMonitor.append(str(ex)) def deactivate_gateway_connection(self): """服务端网关断开""" if self.mainEngine is None: return try: self.mainEngine.disconnect(self.name) except: pass def qryStatus(self): if self.mainEngine is None: return try: self.mainEngine.qryStatus() except Exception as ex: pass def processEvent(self, event): """"处理事件(入口)""" if event.type_ == EVENT_CTA_LOG and self.chkCtaLog.isChecked(): self.updateCtaLog(event) return if event.type_ == EVENT_STATUS: self.updateStatus(event) return if event.type_ == EVENT_WARNING and self.chkWarning.isChecked(): self.updateWarning(event) return if event.type_ == EVENT_ERROR and self.chkError.isChecked(): self.updateError(event) return if event.type_ == EVENT_CRITICAL and self.chkCritical.isChecked(): self.updateCritical(event) return def updateStatus(self, event): """更新Status""" status_dict = event.dict_['data'] if 'strategies' in status_dict: strategies_status_dict = status_dict['strategies'] self.ctaMonitor.updateStatus(strategies_status_dict) if 'ticks' in status_dict and self.chkTicks.isChecked(): ticks_dict = status_dict['ticks'] str_dict = json.dumps(ticks_dict, indent=4) self.logMonitor.append(str_dict) if 'server' in status_dict: server_status_dict = status_dict['server'] self.server_info_monitor.update_status(server_status_dict) if 'account' in status_dict: account_status = status_dict['account'] # ---------------------------------------------------------------------- def updateCtaLog(self, event): """更新CTA相关日志""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.logMonitor.append(content) # ---------------------------------------------------------------------- def updateWarning(self, event): """更新相关Warning """ log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.logMonitor.append(content) winsound.PlaySound('err.wav', winsound.SND_ASYNC) # ---------------------------------------------------------------------- def updateError(self, event): """更新相关Error """ log = event.dict_['data'] content = '\t'.join( [log.errorTime, log.errorID, log.errorMsg, log.additionalInfo]) self.logMonitor.append(content) winsound.PlaySound('err.wav', winsound.SND_ASYNC) # ---------------------------------------------------------------------- def updateCritical(self, event): """更新相关Critical""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.logMonitor.append(content) winsound.PlaySound('err.wav', winsound.SND_ASYNC)
class ZzsdEngineManager(QtWidgets.QMainWindow): signal = QtCore.Signal(type(Event())) signal_tick = QtCore.Signal(type(Event())) def __init__(self, zzsdEngine, eventEngine, parent=None): """Constructor""" super(ZzsdEngineManager, self).__init__(parent) self.zzsdEngine = zzsdEngine self.eventEngine = eventEngine self.name = "zzsd" self.stopOrderMonitor = None self.klineDay = None self.klineOpt = None self.dayBarData = {} self.hourBarData = {} self.initUi() self.registerEvent() self.currrentSymbol = "" # 记录日志 #self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED) #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(text.ZZSD_STRATEGY) ##log logMonitor = LogMonitor(self.zzsdEngine, self.eventEngine) widgetLogM, dockLogM = self.createDock(logMonitor, u"log", QtCore.Qt.LeftDockWidgetArea) ##合约 self.marketMonitor = MarketMonitor(None, self.eventEngine) widgetMarketM, dockMarketM = self.createDock( self.marketMonitor, vtText.MARKET_DATA, QtCore.Qt.LeftDockWidgetArea) ##条件单 self.stopOrderMonitor = StopOrderMonitor(None, self.eventEngine) widgetStopOrderM, dockStopOrderM = self.createDock( self.stopOrderMonitor, u"条件单", QtCore.Qt.LeftDockWidgetArea) self.updateMonitor() ##更新一下数据 self.marketMonitor.cellDoubleClicked.connect(self.symbolSelect) self.stopOrderMonitor.cellDoubleClicked.connect(self.symbolSelect) ##K线跟随 self.klineOpt = KLineWidget() widgetklineOptM, dockklineOptM = self.createDock( self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea) self.klineDay = KLineWidget() widgetklineDayM, dockklineDayM = self.createDock( self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea) ##显示合约k线 def symbolSelect(self, row=None, column=None): symbol = self.stopOrderMonitor.item(row, 0).text() print(symbol) if symbol: self.loadKlineData(symbol) def loadKlineData(self, symbol): if self.currrentSymbol == symbol: return self.currrentSymbol = symbol self.loadBar(symbol) self.klineDay.clearData() self.klineOpt.clearData() self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt') self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData) self.klineDay.KLtitle.setText(symbol + " day", size='20pt') self.klineDay.loadDataBarArray(self.dayBarData[symbol].barData) def refreshKline(self, symbol): if self.hourBarData.has_key(symbol): hourBar = VtBarData() hourBar.__dict__ = self.hourBarData[symbol].barData[-1] dayBar = VtBarData() dayBar.__dict__ = self.dayBarData[symbol].barData[-1] #print(hourBar.__dict__) #print(dayBar.__dict__) self.klineOpt.onBar(hourBar) self.klineDay.onBar(dayBar) def loadBar(self, symbol): if not self.dayBarData.has_key(symbol): dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol) self.dayBarData[symbol] = BarManager(dbDayList, symbol, isDay=True) if not self.hourBarData.has_key(symbol): dbHourList = self.loadAllBarFromDb(MINUTE_60_DB_NAME, symbol) self.hourBarData[symbol] = BarManager(dbHourList, symbol, 60) #---------------------------------------------------------------------- def loadAllBarFromDb(self, dbName, collectionName): """从数据库中读取Bar数据,startDate是datetime对象""" d = {} if self.zzsdEngine.client: ##rpc模式 barData = self.zzsdEngine.client.mainEngine.dbQuery( dbName, collectionName, d) else: barData = self.zzsdEngine.mainEngine.dbQuery( dbName, collectionName, d) return barData def updateMonitor(self): ##更新条件单 varOrders = self.zzsdEngine.getStopOrders() self.stopOrderMonitor.updateAllData(varOrders) def processTickEvent(self, event): """收到事件更新""" tick = event.dict_['data'] if self.dayBarData.has_key(tick.symbol): self.dayBarData[tick.symbol].updateTick(tick) if self.hourBarData.has_key(tick.symbol): self.hourBarData[tick.symbol].updateTick(tick) self.refreshKline(tick.symbol) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateMonitor) self.eventEngine.register(EVENT_ZZSD_STRATEGY + self.name, self.signal.emit) self.signal_tick.connect(self.processTickEvent) self.eventEngine.register(EVENT_TICK, self.signal_tick.emit) #---------------------------------------------------------------------- def createDock(self, widget, widgetName, widgetArea): """创建停靠组件""" dock = QtWidgets.QDockWidget(widgetName) dock.setWidget(widget) dock.setObjectName(widgetName) dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable) self.addDockWidget(widgetArea, dock) return widget, dock
class DrEngineManager(QtWidgets.QWidget): """行情数据记录引擎管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, drEngine, eventEngine, parent=None): """Constructor""" super(DrEngineManager, self).__init__(parent) self.drEngine = drEngine self.eventEngine = eventEngine self.initUi() self.updateSetting() self.registerEvent() #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'行情数据记录工具') # 记录合约配置监控 tickLabel = QtWidgets.QLabel(u'Tick记录') self.tickTable = QtWidgets.QTableWidget() self.tickTable.setColumnCount(2) self.tickTable.verticalHeader().setVisible(False) self.tickTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers) self.tickTable.horizontalHeader().setResizeMode( QtWidgets.QHeaderView.Stretch) self.tickTable.setAlternatingRowColors(True) self.tickTable.setHorizontalHeaderLabels([u'合约代码', u'接口']) barLabel = QtWidgets.QLabel(u'Bar记录') self.barTable = QtWidgets.QTableWidget() self.barTable.setColumnCount(2) self.barTable.verticalHeader().setVisible(False) self.barTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers) self.barTable.horizontalHeader().setResizeMode( QtWidgets.QHeaderView.Stretch) self.barTable.setAlternatingRowColors(True) self.barTable.setHorizontalHeaderLabels([u'合约代码', u'接口']) activeLabel = QtWidgets.QLabel(u'主力合约') self.activeTable = QtWidgets.QTableWidget() self.activeTable.setColumnCount(2) self.activeTable.verticalHeader().setVisible(False) self.activeTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers) self.activeTable.horizontalHeader().setResizeMode( QtWidgets.QHeaderView.Stretch) self.activeTable.setAlternatingRowColors(True) self.activeTable.setHorizontalHeaderLabels([u'主力代码', u'合约代码']) # 日志监控 self.logMonitor = QtWidgets.QTextEdit() self.logMonitor.setReadOnly(True) self.logMonitor.setMinimumHeight(600) # 设置布局 grid = QtWidgets.QGridLayout() grid.addWidget(tickLabel, 0, 0) grid.addWidget(barLabel, 0, 1) grid.addWidget(activeLabel, 0, 2) grid.addWidget(self.tickTable, 1, 0) grid.addWidget(self.barTable, 1, 1) grid.addWidget(self.activeTable, 1, 2) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(grid) vbox.addWidget(self.logMonitor) self.setLayout(vbox) #---------------------------------------------------------------------- def updateLog(self, event): """更新日志""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.logMonitor.append(content) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateLog) self.eventEngine.register(EVENT_DATARECORDER_LOG, self.signal.emit) #---------------------------------------------------------------------- def updateSetting(self): """显示引擎行情记录配置""" with open(self.drEngine.settingFileName) as f: drSetting = json.load(f) if 'tick' in drSetting: l = drSetting['tick'] for setting in l: self.tickTable.insertRow(0) self.tickTable.setItem(0, 0, TableCell(setting[0])) self.tickTable.setItem(0, 1, TableCell(setting[1])) if 'bar' in drSetting: l = drSetting['bar'] for setting in l: self.barTable.insertRow(0) self.barTable.setItem(0, 0, TableCell(setting[0])) self.barTable.setItem(0, 1, TableCell(setting[1])) if 'active' in drSetting: d = drSetting['active'] for activeSymbol, symbol in d.items(): self.activeTable.insertRow(0) self.activeTable.setItem(0, 0, TableCell(activeSymbol)) self.activeTable.setItem(0, 1, TableCell(symbol))
class MmEngineManager(QtWidgets.QMainWindow): #QWidget """监控引擎的管理组件""" signal = QtCore.Signal(type(Event())) signal_tick = QtCore.Signal(type(Event())) settingFileName = 'Daily_setting.json' settingfilePath = getJsonPath(settingFileName, __file__) def __init__(self, MmEngine, eventEngine, parent=None): """Constructor""" super(MmEngineManager, self).__init__(parent) self.MmEngine = MmEngine self.eventEngine = eventEngine self.isReplay = False ##监控 # 监控的事件类型 self.eventType = EVENT_TICK if isinstance(self.MmEngine.mainEngine, MainEngine) == True: print("replay") self.isReplay = True ##复盘 self.name = "zzsd" self.stopOrderMonitor = None self.traderOrderMonitor = None self.klineDay = None self.klineOpt = None self.symbolText = None self.dayBarData = {} self.hourBarData = {} self.hourSarData = {} self.currrentSymbol = None self.currrentXmin = None self.initUi() # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u"监控界面") self.initMenu() ##log self.logMonitor = LogMonitor(self.MmEngine, self.eventEngine) widgetLogM, dockLogM = self.createDock(self.logMonitor, u"log", QtCore.Qt.LeftDockWidgetArea) ##行情 self.marketMonitor = MarketMonitor(self.MmEngine, self.eventEngine) widgetMarketM, dockMarketM = self.createDock( self.marketMonitor, vtText.MARKET_DATA, QtCore.Qt.LeftDockWidgetArea) ##合约 self.symbolMonitor = ContractManager(self.MmEngine, self.eventEngine, self) widgetSymbolM, dockLogM = self.createDock(self.symbolMonitor, u"订阅合约", QtCore.Qt.LeftDockWidgetArea) ##成交单 self.traderOrderMonitor = TraderOrderMonitor(None, self.eventEngine) widgetStopOrderM, dockStopOrderM = self.createDock( self.traderOrderMonitor, u"成交单", QtCore.Qt.LeftDockWidgetArea) self.updateTraderMonitor() ##更新一下数据 self.traderOrderMonitor.cellDoubleClicked.connect(self.symbolSelect) self.logMonitor.setMaximumWidth(575) self.traderOrderMonitor.setMaximumWidth(575) ##K线跟随 self.klineOpt = KLineWidget(name="opt") widgetklineOptM, dockklineOptM = self.createDock( self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea) # self.klineDay = KLineWidget(name="day") # widgetklineDayM, dockklineDayM = self.createDock(self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea) if self.isReplay == True: self.fun_timer( ) #每隔5秒执行一次加载交易数据的函数和日志函数updateTraderMonitor(),updateLogMonitor() self.refreshTimer = thd.Timer(60, self.fun_timer) self.refreshTimer.start() def fun_timer(self): ##加载交易数据 self.updateTraderMonitor() ##加载log数据 self.updateLogMonitor() def closeEvent(self, event): if self.refreshTimer: self.refreshTimer.cancel() def initMenu(self): """初始化菜单""" # 创建菜单 menubar = self.menuBar() self.cycle = ["1min", "3min", "5min", "15min", "30min", "1H", "day"] n = 0 for item in self.cycle: action = QtWidgets.QAction(item, self) menubar.addAction(action) try: action.triggered[()].connect( lambda item=item: self.cycleAction(item) ) #一个空元组用于指定触发的信号。如果没有这样做,触发信号将在默认情况下发送一个布尔值,这将阻塞lambda的项目参数。 finally: pass def cycleAction(self, cycle): self.loadXKlineData(self.currrentSymbol, cycle) def logSelect(self, row=None, column=None): content = self.logMonitor.item(row, 1).text() print(content) if content and content.startswith("subscribe===") == True: symbol = content[len("subscribe==="):len(content)] self.loadKlineData(symbol) ##显示合约k线 def symbolSelect(self, row=None, column=None): symbol = self.traderOrderMonitor.item(row, 1).text() print(symbol) if symbol: self.loadKlineData(symbol) ##显示合约k线 def symbolSelectMarket(self, row=None, column=None): symbol = self.marketMonitor.item(row, 0).text() if symbol: self.loadKlineData(symbol) def loadKlineData(self, symbol): if self.currrentSymbol == symbol: return self.subscribeEvent(symbol) # 订阅合约 self.currrentSymbol = symbol print symbol self.loadBar(symbol) # self.klineDay.clearData() self.klineOpt.clearData() self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt') self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData) def subscribeEvent(self, symbol): # # 重新注册事件监听 # self.eventEngine.unregister(EVENT_TICK + self.currrentSymbol, self.signal_tick.emit) self.signal_tick.connect(self.updateEvent) self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit) self.signal_tick.connect(self.processTickEvent) self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit) # 订阅行情 req = VtSubscribeReq() req.symbol = symbol # req.exchange ="SHFE" self.MmEngine.mainEngine.subscribe(req, "CTP") # ---------------------------------------------------------------------- def updateEvent(self, event): """收到事件更新""" data = event.dict_['data'] self.marketMonitor.updateData(data) def loadXKlineData(self, symbol, xmin): if self.currrentSymbol == symbol and self.currrentXmin == xmin: return # 订阅合约 self.subscribeEvent(symbol) self.currrentSymbol = symbol self.currrentXmin = xmin print symbol self.loadXBar(symbol, xmin) self.klineOpt.clearData() self.klineOpt.KLtitle.setText(symbol + " opt=" + xmin, size='20pt') if xmin == "day": self.klineOpt.loadDataBarArray(self.dayBarData[symbol].barData) else: self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData) # 初始化sar指标 self.klineOpt.initIndicator("SAR") def refreshKline(self, symbol): if self.hourBarData.has_key(symbol): hourBar = VtBarData() hourBar.__dict__ = self.hourBarData[symbol].barData[-1] self.klineOpt.onBar(hourBar) def loadBar(self, symbol): """读取策略配置""" with open(self.settingfilePath) as f: l = json.load(f) db = MINUTE_5_DB_NAME xmin = 5 self.currrentXmin = 5 if xmin == "day": if not self.dayBarData.has_key(symbol): dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol) self.dayBarData[symbol] = BarManager(dbDayList, symbol, isDay=True) else: # if not self.hourBarData.has_key(symbol): dbHourList = self.loadAllBarFromDb(db, symbol) self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin) def loadXBar(self, symbol, cycle): db = MINUTE_5_DB_NAME xmin = 5 if cycle == 'week': db = WEEK_DB_NAME elif cycle == 'day': db = DAILY_DB_NAME xmin = "day" elif cycle == '1H': xmin = 60 db = MINUTE_60_DB_NAME else: xmin = cycle_number[cycle] db = cycle_db[cycle] self.currrentXmin = xmin if xmin == "day": if not self.dayBarData.has_key(symbol): dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol) self.dayBarData[symbol] = BarManager(dbDayList, symbol, isDay=True) else: # if not self.hourBarData.has_key(symbol): dbHourList = self.loadAllBarFromDb(db, symbol) self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin) # ---------------------------------------------------------------------- def loadAllBarFromDb(self, dbName, collectionName): """从数据库中读取Bar数据,startDate是datetime对象""" d = {} if hasattr(self.MmEngine, "client"): ##rpc模式 barData = self.MmEngine.client.mainEngine.dbQuery( dbName, collectionName, d, 'datetime') else: barData = self.MmEngine.mainEngine.dbQuery(dbName, collectionName, d, 'datetime') return barData def updateLogMonitor(self): logList = self.MmEngine.mainEngine.mysqlClient.dbSelect( SQL_TABLENAME_LOG, None, "all") for log in logList: logEntity = VtLogData() logEntity.gatewayName = log["gatewayName"] logEntity.logContent = log["logContent"] logEntity.logLevel = log["logLevel"] logEntity.logTime = log["logTime"] self.logMonitor.updateData(logEntity) ##日志table加入click事件 subscribe=== self.logMonitor.cellDoubleClicked.connect(self.logSelect) def updateTraderMonitor(self): ##更新交易单 varOrders = self.MmEngine.getTraderOrders() self.traderOrderMonitor.updateAllData(varOrders) # ---------------------------------------------------------------------- def processTickEvent(self, event): """收到事件更新""" tick = event.dict_['data'] if self.dayBarData.has_key(tick.symbol): self.dayBarData[tick.symbol].updateTick(tick) if self.hourBarData.has_key(tick.symbol): self.hourBarData[tick.symbol].updateTick(tick) if self.currrentSymbol == tick.symbol: self.refreshKline(tick.symbol) # ---------------------------------------------------------------------- def createDock(self, widget, widgetName, widgetArea): """创建停靠组件""" dock = QtWidgets.QDockWidget(widgetName) dock.setWidget(widget) dock.setObjectName(widgetName) dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable) self.addDockWidget(widgetArea, dock) return widget, dock
class StrategyManager(QtWidgets.QGroupBox): """策略管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, engine, eventEngine, name, parent=None): """Constructor""" super(StrategyManager, self).__init__(parent) self.engine = engine self.eventEngine = eventEngine self.name = name self.initUi() self.updateMonitor() self.registerEvent() #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setTitle(self.name) self.paramMonitor = ValueMonitor(True, self) self.varMonitor = ValueMonitor(False, self) height = 65 self.paramMonitor.setFixedHeight(height) self.varMonitor.setFixedHeight(height) buttonInit = QtWidgets.QPushButton(u'初始化') buttonStart = QtWidgets.QPushButton(u'启动') buttonStop = QtWidgets.QPushButton(u'停止') buttonInit.clicked.connect(self.init) buttonStart.clicked.connect(self.start) buttonStop.clicked.connect(self.stop) hbox1 = QtWidgets.QHBoxLayout() hbox1.addWidget(buttonInit) hbox1.addWidget(buttonStart) hbox1.addWidget(buttonStop) hbox1.addStretch() hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(self.paramMonitor) hbox3 = QtWidgets.QHBoxLayout() hbox3.addWidget(self.varMonitor) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) self.setLayout(vbox) self.paramMonitor.itemChanged.connect(self.setParam) #---------------------------------------------------------------------- def updateMonitor(self, event=None): """显示策略最新状态""" paramDict = self.engine.getStrategyParam(self.name) if paramDict: self.paramMonitor.updateData(paramDict) varDict = self.engine.getStrategyVar(self.name) if varDict: self.varMonitor.updateData(varDict) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateMonitor) self.eventEngine.register(EVENT_OM_STRATEGY + self.name, self.signal.emit) #---------------------------------------------------------------------- def init(self): """初始化策略""" self.engine.initStrategy(self.name) #---------------------------------------------------------------------- def start(self): """启动策略""" self.engine.startStrategy(self.name) #---------------------------------------------------------------------- def stop(self): """停止策略""" self.engine.stopStrategy(self.name) #---------------------------------------------------------------------- def setParam(self, cell): """更新参数""" text = unicode(cell.text()) key = cell.key if text.isdigit(): if '.' in text: value = float(text) else: value = int(text) else: value = text self.engine.setStrategyParam(self.name, key, value)
class StrategyEngineManager(QtWidgets.QWidget): """引擎管理组件""" signal = QtCore.Signal(type(Event())) #---------------------------------------------------------------------- def __init__(self, omEngine, parent=None): """Constructor""" super(StrategyEngineManager, self).__init__(parent) self.engine = omEngine.strategyEngine self.eventEngine = omEngine.eventEngine self.strategyLoaded = False self.initUi() self.registerEvent() # 记录日志 self.engine.writeLog(u'期权策略引擎启动') #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'期权策略') # 按钮 loadButton = QtWidgets.QPushButton(u'加载策略') initAllButton = QtWidgets.QPushButton(u'全部初始化') startAllButton = QtWidgets.QPushButton(u'全部启动') stopAllButton = QtWidgets.QPushButton(u'全部停止') loadButton.clicked.connect(self.load) initAllButton.clicked.connect(self.initAll) startAllButton.clicked.connect(self.startAll) stopAllButton.clicked.connect(self.stopAll) # 滚动区域,放置所有的StrategyManager self.scrollArea = QtWidgets.QScrollArea() self.scrollArea.setWidgetResizable(True) # 日志监控 self.ctaLogMonitor = QtWidgets.QTextEdit() self.ctaLogMonitor.setReadOnly(True) self.ctaLogMonitor.setMaximumHeight(200) # 设置布局 hbox2 = QtWidgets.QHBoxLayout() hbox2.addWidget(loadButton) hbox2.addWidget(initAllButton) hbox2.addWidget(startAllButton) hbox2.addWidget(stopAllButton) hbox2.addStretch() vbox = QtWidgets.QVBoxLayout() vbox.addLayout(hbox2) vbox.addWidget(self.scrollArea) vbox.addWidget(self.ctaLogMonitor) self.setLayout(vbox) #---------------------------------------------------------------------- def initStrategyManager(self): """初始化策略管理组件界面""" w = QtWidgets.QWidget() vbox = QtWidgets.QVBoxLayout() for name in self.engine.strategyDict.keys(): strategyManager = StrategyManager(self.engine, self.eventEngine, name) vbox.addWidget(strategyManager) vbox.addStretch() w.setLayout(vbox) self.scrollArea.setWidget(w) #---------------------------------------------------------------------- def initAll(self): """全部初始化""" self.engine.initAll() #---------------------------------------------------------------------- def startAll(self): """全部启动""" self.engine.startAll() #---------------------------------------------------------------------- def stopAll(self): """全部停止""" self.engine.stopAll() #---------------------------------------------------------------------- def load(self): """加载策略""" if not self.strategyLoaded: self.engine.loadSetting() self.initStrategyManager() self.strategyLoaded = True self.engine.writeLog(u'策略加载成功') #---------------------------------------------------------------------- def updateLog(self, event): """更新相关日志""" log = event.dict_['data'] content = '\t'.join([log.logTime, log.logContent]) self.ctaLogMonitor.append(content) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateLog) self.eventEngine.register(EVENT_OM_STRATEGYLOG, self.signal.emit)
class DailyEngineManager(QtWidgets.QMainWindow): signal = QtCore.Signal(type(Event())) signal_tick = QtCore.Signal(type(Event())) settingFileName = 'Daily_setting.json' settingfilePath = getJsonPath(settingFileName, __file__) def __init__(self, dailyEngine, eventEngine, parent=None): """Constructor""" super(DailyEngineManager, self).__init__(parent) self.dailyEngine = dailyEngine self.eventEngine = eventEngine self.isReplay = False ##监控 if isinstance(self.dailyEngine.mainEngine, MainEngine) == True: print("replay") self.isReplay = True ##复盘 self.name = "zzsd" self.stopOrderMonitor = None self.klineDay = None self.klineOpt = None self.dayBarData = {} self.hourBarData = {} self.hourSarData = {} self.initUi() self.registerEvent() self.currrentSymbol = "" # 记录日志 #self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED) #---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u"daily策略") ##log self.logMonitor = LogMonitor(self.dailyEngine, self.eventEngine) widgetLogM, dockLogM = self.createDock(self.logMonitor, u"log", QtCore.Qt.LeftDockWidgetArea) ##合约 self.marketMonitor = MarketMonitor(None, self.eventEngine) widgetMarketM, dockMarketM = self.createDock( self.marketMonitor, vtText.MARKET_DATA, QtCore.Qt.LeftDockWidgetArea) ##条件单 self.stopOrderMonitor = StopOrderMonitor(None, self.eventEngine) widgetStopOrderM, dockStopOrderM = self.createDock( self.stopOrderMonitor, u"条件单", QtCore.Qt.LeftDockWidgetArea) self.updateMonitor() ##更新一下数据 self.marketMonitor.cellDoubleClicked.connect(self.symbolSelectMarket) self.stopOrderMonitor.cellDoubleClicked.connect(self.symbolSelect) self.logMonitor.setMaximumWidth(575) self.marketMonitor.setMaximumWidth(575) self.stopOrderMonitor.setMaximumWidth(575) ##K线跟随 self.klineOpt = KLineWidget(name="opt") widgetklineOptM, dockklineOptM = self.createDock( self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea) #self.klineDay = KLineWidget(name="day") #widgetklineDayM, dockklineDayM = self.createDock(self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea) if self.isReplay == True: ##加载log数据 logList = self.dailyEngine.mainEngine.mysqlClient.dbSelect( SQL_TABLENAME_LOG, None, "all") for log in logList: logEntity = VtLogData() logEntity.gatewayName = log["gatewayName"] logEntity.logContent = log["logContent"] logEntity.logLevel = log["logLevel"] logEntity.logTime = log["logTime"] self.logMonitor.updateData(logEntity) ##日志table加入click事件 subscribe=== self.logMonitor.cellDoubleClicked.connect(self.logSelect) def logSelect(self, row=None, column=None): content = self.logMonitor.item(row, 1).text() print(content) if content and content.startswith("subscribe===") == True: symbol = content[len("subscribe==="):len(content)] self.loadKlineData(symbol) ##显示合约k线 def symbolSelect(self, row=None, column=None): symbol = self.stopOrderMonitor.item(row, 0).text() print(symbol) if symbol: self.loadKlineData(symbol) ##显示合约k线 def symbolSelectMarket(self, row=None, column=None): symbol = self.marketMonitor.item(row, 0).text() print(symbol) if symbol: self.loadKlineData(symbol) def loadKlineData(self, symbol): if self.currrentSymbol == symbol: return self.currrentSymbol = symbol self.loadBar(symbol) #self.klineDay.clearData() self.klineOpt.clearData() self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt') self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData) if not self.hourSarData.has_key(symbol): sar_t = SAR() sar_t.OnCalculate(len(self.klineOpt.listHigh), 0, self.klineOpt.listHigh, self.klineOpt.listLow) self.hourSarData[symbol] = sar_t self.klineOpt.addIndicatorSar(self.hourSarData[symbol].ExtSARBuffer) #self.klineDay.KLtitle.setText(symbol+" day",size='20pt') #self.klineDay.loadDataBarArray(self.dayBarData[symbol].barData) def refreshKline(self, symbol): if self.hourBarData.has_key(symbol): hourBar = VtBarData() hourBar.__dict__ = self.hourBarData[symbol].barData[-1] #dayBar = VtBarData() #dayBar.__dict__ = self.dayBarData[symbol].barData[-1] #print(hourBar.__dict__) #print(dayBar.__dict__) self.klineOpt.onBar(hourBar) ##sar 只计算最后3个值 preSARLen = len(self.hourSarData[symbol].ExtSARBuffer) self.hourSarData[symbol].OnCalculate( len(self.klineOpt.listHigh), len(self.klineOpt.listHigh) - 3, self.klineOpt.listHigh, self.klineOpt.listLow) self.klineOpt.updateIndicatorSar( self.hourSarData[symbol].ExtSARBuffer, preSARLen - 1) def loadBar(self, symbol): #if not self.dayBarData.has_key(symbol): #dbDayList = self.loadAllBarFromDb(DAY_DB_NAME,symbol) #self.dayBarData[symbol] = BarManager(dbDayList,symbol,isDay=True) if not self.hourBarData.has_key(symbol): """读取策略配置""" with open(self.settingfilePath) as f: l = json.load(f) db = MINUTE_5_DB_NAME xmin = 5 #if l["strategyCycle"] == "5min": # db = MINUTE_5_DB_NAME # xmin = 5 #if l["strategyCycle"] == "30min": # db = MINUTE_30_DB_NAME # xmin = 30 dbHourList = self.loadAllBarFromDb(db, symbol) self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin) #---------------------------------------------------------------------- def loadAllBarFromDb(self, dbName, collectionName): """从数据库中读取Bar数据,startDate是datetime对象""" d = {} if hasattr(self.dailyEngine, "client"): ##rpc模式 barData = self.dailyEngine.client.mainEngine.dbQuery( dbName, collectionName, d, 'datetime') else: barData = self.dailyEngine.mainEngine.dbQuery( dbName, collectionName, d, 'datetime') return barData def updateMonitor(self): ##更新条件单 varOrders = self.dailyEngine.getStopOrders() self.stopOrderMonitor.updateAllData(varOrders) def processTickEvent(self, event): """收到事件更新""" tick = event.dict_['data'] #if self.dayBarData.has_key(tick.symbol): # self.dayBarData[tick.symbol].updateTick(tick) if self.hourBarData.has_key(tick.symbol): self.hourBarData[tick.symbol].updateTick(tick) if self.currrentSymbol == tick.symbol: self.refreshKline(tick.symbol) #---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateMonitor) self.eventEngine.register(EVENT_DAILY_STRATEGY + self.name, self.signal.emit) self.signal_tick.connect(self.processTickEvent) self.eventEngine.register(EVENT_TICK, self.signal_tick.emit) #---------------------------------------------------------------------- def createDock(self, widget, widgetName, widgetArea): """创建停靠组件""" dock = QtWidgets.QDockWidget(widgetName) dock.setWidget(widget) dock.setObjectName(widgetName) dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable) self.addDockWidget(widgetArea, dock) return widget, dock