def updateUI(self, stra): try: # stra 状态没有变化不需要更新UI if not stra.isUpdated(): return for plateName in stra.plateDict: plateSymbolList = stra.plateDict[plateName]["symbol_list"] plateCatchedSymobolList = stra.plateDict[plateName][ "catched_symbol"] plateMissedSymbolList = stra.plateDict[plateName][ "missed_symbol"] event1 = Event(type_=EVENT_STRATEGY_CATCH_LIMITUP_STATUS) catchLimitUpInfo = VtStrategyCatchLimitUpInfo() event1.dict_['data'] = catchLimitUpInfo catchLimitUpInfo.plateName = plateName catchLimitUpInfo.numOfStocks = len(plateSymbolList) catchLimitUpInfo.catchedStocks = len(plateCatchedSymobolList) catchLimitUpInfo.missedStocks = len(plateMissedSymbolList) self.eventEngine.put(event1) stra.resetUpdatedFlag() except: traceback.print_exc()
def onOptionTick(self, optionTick): try: # 期权价格信息推送 event1 = Event(type_=EVENT_OPTION_TICK) event1.dict_['data'] = optionTick self.eventEngine.put(event1) except: traceback.print_exc()
def writeLog(self, content): """快速发出日志事件""" log = VtLogData() log.logContent = content log.gatewayName = 'SLIPPERY_GRID_ENGINE' event = Event(type_=EVENT_LOG) event.dict_['data'] = log self.eventEngine.put(event)
def writeLog(self, content): try: log = VtLogData() log.logContent = content log.gatewayName = 'OPTION_SELECTOR_ENGINE' event = Event(type_=EVENT_LOG) event.dict_['data'] = log self.eventEngine.put(event) except: traceback.print_exc()
def writeLog(self, content): try: """快速发出日志事件""" log = VtLogData() log.logContent = content log.gatewayName = 'CATCH_LIMITUP_ENGINE' event = Event(type_=EVENT_LOG) event.dict_['data'] = log self.eventEngine.put(event) except: traceback.print_exc()
def writeLog(self, content): try: """快速发出日志事件""" log = VtLogData() log.logContent = content log.gatewayName = 'STOPORDER_MAIN_WINDOW' event = Event(type_=EVENT_LOG) event.dict_['data'] = log self.eventEngine.put(event) except: traceback.print_exc()
def updateUI(self, stra): try: event1 = Event(type_=EVENT_STRATEGY_STOP_ORDER_STATUS) straStatus = VtStrategyStopOrderStatus() event1.dict_['data'] = straStatus straStatus.strategyID = stra.strategyID straStatus.status = stra.status if stra.thresholdPriceEnabled: # 已经获取了真实的threshold值,则显示真实数值 if stra.realThresholdPrice: straStatus.thresholdInfo = stra.startThresholdDirection + str( stra.realThresholdPrice) # 否则用用户输入代替显示信息 else: suffix = "" if stra.thresholdIsPct: suffix = u"百分比" straStatus.thresholdInfo = stra.startThresholdDirection + suffix + str( stra.thresholdPrice) # 用V X标识价格是否已经冲破 threshold if stra.isThresholdPriceBroken: straStatus.thresholdInfo = "V" + straStatus.thresholdInfo else: straStatus.thresholdInfo = "X" + straStatus.thresholdInfo else: straStatus.thresholdInfo = "无限制" straStatus.ownerPrice = stra.getOwnerPrice() straStatus.ownerMaxMinPrice = stra.getOwnerMaxMinPrice() straStatus.triggerPrice = stra.getTriggerPrice() straStatus.crossDirection = stra.crossDirection straStatus.tradeDirection = stra.tradeDirection straStatus.volume = stra.volume straStatus.orderVolume = stra.volume self.eventEngine.put(event1) except: traceback.print_exc()
def runChildProcess(): """子进程运行函数""" # print '-'*20 # 创建日志引擎 le = LogEngine() le.setLogLevel(le.LEVEL_INFO) le.addConsoleHandler() le.addFileHandler() le.info(u'启动行情记录运行子进程') # 创建主引擎 me = MainEngine() ee = me.eventEngine ee.register(EVENT_LOG, le.processLogEvent) ee.register(EVENT_CTA_LOG, le.processLogEvent) ee.register(EVENT_ERROR, processErrorEvent) try: # 添加交易接口 try: me.addGateway(ctpGateway) except: pass # 添加上层应用 me.addApp(riskManager) me.addApp(dataRecorder) #fix: 当服务端初始化完毕后再开启rpcService #me.addApp(rpcService) me.addApp(ctaStrategy) me.addApp(spreadTrading) me.addApp(algoTrading) le.info(u'主引擎创建成功') # 自动建立MongoDB数据库 me.dbConnect() le.info(u'connect MongoDB') # 自动建立CTP链接 me.connect('CTP') le.info(u'连接CTP接口') # 取仓位信息 me.qryPosition("CTP") while not me.getAllContracts(): sleep(5) le.info(u'收集合约信息...') sleep(3) le.info(u'合约信息中数量: %s' % len(me.getAllContracts())) # 及时保存数据引擎里的合约数据到硬盘 me.dataEngine.saveContracts() #服务端初始化完成 #开启RPC me.addApp(rpcService) le.info(u'开启RPCService') ''' bug-fix: 休息,以便于客户端连接上来收CTP信息 ''' sleep(5.) #CTP连接完成,发送重启信号 event = Event(EVENT_CTP_RESTARTED) me.eventEngine.put(event) le.info(u'通知客户端CTP RESTART') while True: sleep(1) except KeyboardInterrupt: le.info(u"Keyboard interrupt in process") finally: le.info(u"cleaning up")
class CtaStrategyManager(QtGui.QGroupBox): """策略管理组件""" signal = QtCore.pyqtSignal(type(Event())) # ---------------------------------------------------------------------- def __init__(self, cta_engine, event_engine, name, parent=None): """Constructor""" super(CtaStrategyManager, self).__init__(parent) self.ctaEngine = cta_engine self.eventEngine = event_engine self.name = name self.initUi() self.updateMonitor() self.registerEvent() # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setTitle(self.name) self.paramMonitor = CtaValueMonitor(self) self.varMonitor = CtaValueMonitor(self) max_height = 60 self.paramMonitor.setMaximumHeight(max_height) self.varMonitor.setMaximumHeight(max_height) button_init = QtGui.QPushButton(u'初始化') button_start = QtGui.QPushButton(u'启动') button_stop = QtGui.QPushButton(u'停止') button_init.clicked.connect(self.init) button_start.clicked.connect(self.start) button_stop.clicked.connect(self.stop) hbox1 = QtGui.QHBoxLayout() hbox1.addWidget(button_init) hbox1.addWidget(button_start) hbox1.addWidget(button_stop) hbox1.addStretch() hbox2 = QtGui.QHBoxLayout() hbox2.addWidget(self.paramMonitor) hbox3 = QtGui.QHBoxLayout() hbox3.addWidget(self.varMonitor) vbox = QtGui.QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addLayout(hbox3) self.setLayout(vbox) # ---------------------------------------------------------------------- def updateMonitor(self, event=None): """显示策略最新状态""" param_dict = self.ctaEngine.getStrategyParam(self.name) if param_dict: self.paramMonitor.updateData(param_dict) var_dict = self.ctaEngine.getStrategyVar(self.name) if var_dict: self.varMonitor.updateData(var_dict) # ---------------------------------------------------------------------- def registerEvent(self): """注册事件监听""" self.signal.connect(self.updateMonitor) 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(QtGui.QWidget): """CTA引擎管理组件""" signal = QtCore.pyqtSignal(type(Event())) # ---------------------------------------------------------------------- def __init__(self, cta_engine, event_engine, parent=None): """Constructor""" super(CtaEngineManager, self).__init__(parent) self.ctaEngine = cta_engine self.eventEngine = event_engine self.strategyLoaded = False self.initUi() self.registerEvent() # 记录日志 self.ctaEngine.writeCtaLog(u'CTA引擎启动成功') # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'CTA策略') # 按钮 load_button = QtGui.QPushButton(u'加载策略') init_all_button = QtGui.QPushButton(u'全部初始化') start_all_button = QtGui.QPushButton(u'全部启动') stop_all_button = QtGui.QPushButton(u'全部停止') load_button.clicked.connect(self.load) init_all_button.clicked.connect(self.initAll) start_all_button.clicked.connect(self.startAll) stop_all_button.clicked.connect(self.stopAll) # 滚动区域,放置所有的CtaStrategyManager self.scrollArea = QtGui.QScrollArea() self.scrollArea.setWidgetResizable(True) # CTA组件的日志监控 self.ctaLogMonitor = QtGui.QTextEdit() self.ctaLogMonitor.setReadOnly(True) self.ctaLogMonitor.setMaximumHeight(200) # 设置布局 hbox2 = QtGui.QHBoxLayout() hbox2.addWidget(load_button) hbox2.addWidget(init_all_button) hbox2.addWidget(start_all_button) hbox2.addWidget(stop_all_button) hbox2.addStretch() vbox = QtGui.QVBoxLayout() vbox.addLayout(hbox2) vbox.addWidget(self.scrollArea) vbox.addWidget(self.ctaLogMonitor) self.setLayout(vbox) # ---------------------------------------------------------------------- def initStrategyManager(self): """初始化策略管理组件界面""" w = QtGui.QWidget() vbox = QtGui.QVBoxLayout() for name in self.ctaEngine.strategyDict.keys(): strategy_manager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name) vbox.addWidget(strategy_manager) vbox.addStretch() w.setLayout(vbox) self.scrollArea.setWidget(w) # ---------------------------------------------------------------------- def initAll(self): """全部初始化""" for name in self.ctaEngine.strategyDict.keys(): self.ctaEngine.initStrategy(name) # ---------------------------------------------------------------------- def startAll(self): """全部启动""" for name in self.ctaEngine.strategyDict.keys(): self.ctaEngine.startStrategy(name) # ---------------------------------------------------------------------- def stopAll(self): """全部停止""" for name in self.ctaEngine.strategyDict.keys(): self.ctaEngine.stopStrategy(name) # ---------------------------------------------------------------------- def load(self): """加载策略""" if not self.strategyLoaded: self.ctaEngine.loadSetting() self.initStrategyManager() self.strategyLoaded = True self.ctaEngine.writeCtaLog(u'策略加载成功') # ---------------------------------------------------------------------- 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 SlipperyGridMainWindow(QtWidgets.QWidget): signalParam = QtCore.Signal(type(Event())) def __init__(self, strategyEngine, eventEngine, parent=None): super(SlipperyGridMainWindow, self).__init__(parent) self.strategyEngine = strategyEngine self.eventEngine = eventEngine self.sigFunParam = self.signalParam.emit self.strategyEngine.start() self.initUi() self.registerEvent() def initUi(self): self.setWindowTitle(u"滑头网格策略") labelStockOwner = QLabel(u"正股代码") labelStockP = QLabel(u"正向标的代码") labelStockN = QLabel(u"负向标的代码") labelOnlyOwner = QLabel(u"只正股") labelBiDirection = QLabel(u"双向") self.lineStockOwner = QLineEdit() self.lineStockP = QLineEdit() self.lineStockN = QLineEdit() self.checkBoxOnlyOwner = QCheckBox() self.checkBoxDiDirection = QCheckBox() gridTop = QGridLayout() gridTop.addWidget(labelStockOwner, 0, 0) gridTop.addWidget(self.lineStockOwner, 0, 1) gridTop.addWidget(labelStockP, 0, 2) gridTop.addWidget(self.lineStockP, 0, 3) gridTop.addWidget(labelStockN, 1, 2) gridTop.addWidget(self.lineStockN, 1, 3) gridTop.addWidget(labelOnlyOwner, 2, 0) gridTop.addWidget(self.checkBoxOnlyOwner, 2, 1) gridTop.addWidget(labelBiDirection, 3, 0) gridTop.addWidget(self.checkBoxDiDirection, 3, 1) self.setLayout(gridTop) # 关联UI事件 self.lineStockOwner.returnPressed.connect(self.qryStockRelationship) def qryStockRelationship(self): stockOwnerCode = self.lineStockOwner.text() if stockOwnerCode in self.strategyEngine.stockOwnership: stockPCode = self.strategyEngine.stockOwnership[stockOwnerCode][ 'positive'] stockNCode = self.strategyEngine.stockOwnership[stockOwnerCode][ 'negative'] self.lineStockP.setText(stockPCode) self.lineStockN.setText(stockNCode) #注册UI事件处理 stockList = [stockOwnerCode, stockPCode, stockNCode] self.strategyEngine.subscribe(stockList) def registerEvent(self): pass