def _reqData(self, code, data=''): event = Event({ 'EventCode': code, 'StrategyId': self._strategyId, 'Data': data, }) self.sendEvent2Engine(event)
def _onTradeOrder(self, apiEvent): ''' 交易委托信息发生变化时,更新交易模型信息 :param apiEvent: 引擎返回事件 :return: None ''' if str(apiEvent.getStrategyId()) != str(self._strategyId): return self._dataModel._trdModel.updateOrderData(apiEvent) # 更新本地订单信息 dataList = apiEvent.getData() eSessionId = apiEvent.getESessionId() for data in dataList: self.updateLocalOrder(eSessionId, data) if not self._dataModel.getConfigModel().hasTradeTrigger() or len( dataList) == 0: return if apiEvent.getEventCode() == EEQU_SRVEVENT_TRADE_ORDER and str( apiEvent.getStrategyId()) == str(self._strategyId): tradeTriggerEvent = Event({ "EventCode": ST_TRIGGER_TRADE, "ContractNo": dataList[0]["Cont"], "Data": { "TriggerType": "Trade", "Data": apiEvent.getData() } }) # 交易触发 self.sendTriggerQueue(tradeTriggerEvent)
def _onTradeOrder(self, apiEvent): ''' 交易委托信息发生变化时,更新交易模型信息 :param apiEvent: 引擎返回事件 :return: None ''' self._dataModel._trdModel.updateOrderData(apiEvent) # 更新本地订单信息 dataList = apiEvent.getData() for data in dataList: sessionId = data['SessionId'] if sessionId in self._sesnId2eSesnIdMap: self._eSesnId2orderNoMap[self._sesnId2eSesnIdMap[sessionId]] = data['OrderNo'] if not self._dataModel.getConfigModel().hasTradeTrigger(): return # print(apiEvent.getEventCode(), apiEvent.getStrategyId()) if apiEvent.getEventCode() == EEQU_SRVEVENT_TRADE_ORDER and str(apiEvent.getStrategyId()) == str(self._strategyId): # print("交易触发===================11111") tradeTriggerEvent = Event({ "EventCode":ST_TRIGGER_TRADE, "Data":{ "TriggerType":"Trade", "Data": apiEvent.getData() } }) # 交易触发 self.sendTriggerQueue(tradeTriggerEvent)
def _triggerTime(self): '''检查定时触发''' if not self._dataModel.getConfigModel().hasTimerTrigger( ) or not self.isRealTimeStatus(): return nowTime = datetime.now() for i, timeSecond in enumerate(self._dataModel.getConfigTimer()): specifiedTime = datetime.strptime(timeSecond, "%H%M%S") if 0 <= (nowTime - specifiedTime ).seconds < 1 and not self._isTimeTriggered[i]: self._isTimeTriggered[i] = True key = self._dataModel.getConfigModel().getKLineShowInfoSimple() dateTimeStamp, tradeDate, lv1Data = self.getTriggerTimeAndData( key[0]) event = Event({ "EventCode": ST_TRIGGER_TIMER, "ContractNo": None, "KLineType": None, "KLineSlice": None, "Data": { "TradeDate": tradeDate, "DateTimeStamp": dateTimeStamp, "Data": timeSecond } }) self._triggerQueue.put(event)
def _onStrategyRemove(self, event): self._isSt2EgQueueEffective = False self._strategyState = StrategyStatusExit config = None if self._dataModel is None else self._dataModel.getConfigData( ) responseEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data": { "Status": ST_STATUS_REMOVE, "Config": config, "Pid": os.getpid(), "Path": self._filePath, "StrategyName": self._strategyName, } }) self.sendEvent2UI(responseEvent) self.sendEvent2EngineForce(responseEvent) self.logger.info( f"策略已经将删除完成信号发送到UI和engine,策略{self._strategyId}, {EV_EG2UI_STRATEGY_STATUS}" ) # 保证该进程is_alive, 使得队列可用 while True: time.sleep(2)
def _onStrategyQuit(self, event=None, status=ST_STATUS_QUIT): try: #回调退出函数 if hasattr(self._userModule, 'exit_callback'): self._userModule.exit_callback(self._context) except Exception as e: self.logger.error('onStrategyStop callback error: %s' % str(e)) self._isSt2EgQueueEffective = False self._strategyState = StrategyStatusExit config = None if self._dataModel is None else self._dataModel.getConfigData( ) result = None if self._dataModel and self._dataModel.getCalcCenter(): result = self._dataModel.getCalcCenter().testResult() quitEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data": { "Status": status, "Config": config, "Pid": os.getpid(), "Path": self._filePath, "StrategyName": self._strategyName, "Result": result } }) self.sendEvent2UI(quitEvent) self.sendEvent2EngineForce(quitEvent) self.logger.info(f"策略已经将停止完成信号发送到UI和engine,策略{self._strategyId}") # 保证该进程is_alive, 使得队列可用 while True: time.sleep(2)
def _snapShotTrigger(self, event): # 未选择即时行情触发 # if not self._dataModel.getConfigModel().hasSnapShotTrigger() or not self.isRealTimeStatus(): # return # # # 该合约不触发 # if event.getContractNo() not in self._dataModel.getConfigModel().getTriggerContract(): # return if not self.isRealTimeStatus(): return # 对应字段没有变化不触发 data = event.getData() if len(data) == 0 or (not set(data[0]["FieldData"].keys()) & set([4, 11, 17, 18, 19, 20])): # 4:最新价 11:成交量 17:最优买价 18:买量 19:最优卖价 20:卖量 return dateTimeStamp, tradeDate, lv1Data = self.getTriggerTimeAndData( event.getContractNo()) event = Event({ "EventCode": ST_TRIGGER_SANPSHOT_FILL, "ContractNo": event.getContractNo(), "KLineType": None, "KLineSlice": None, "Data": { "Data": lv1Data, "DateTimeStamp": dateTimeStamp, "TradeDate": tradeDate, "IsLastPriceChanged": 4 in data[0]["FieldData"], # 最新价是否改变 } }) self.sendTriggerQueue(event)
def _tradeTriggerMatch(self, apiEvent): if not self._dataModel.getConfigModel().hasTradeTrigger() or len( apiEvent.getData()) == 0: return if apiEvent.getEventCode() == EEQU_SRVEVENT_TRADE_MATCH and str( apiEvent.getStrategyId()) == str(self._strategyId): contractNo = apiEvent.getData()[0]["Cont"] dateTimeStamp, tradeDate, lv1Data = self.getTriggerTimeAndData( contractNo) tradeTriggerEvent = Event({ "EventCode": ST_TRIGGER_TRADE_MATCH, "ContractNo": contractNo, "KLineType": None, "KLineSlice": None, "Data": { "Data": apiEvent.getData()[0], "DateTimeStamp": dateTimeStamp, "TradeDate": tradeDate, } }) # 交易触发 self.sendTriggerQueue(tradeTriggerEvent)
def _triggerCycle(self): '''检查周期性触发''' if not self._dataModel.getConfigModel().hasCycleTrigger(): return if not self.isRealTimeStatus(): return nowTime = datetime.now() cycle = self._dataModel.getConfigCycle() if (nowTime - self._nowTime).total_seconds() * 1000 > cycle: self._nowTime = nowTime key = self._dataModel.getConfigModel().getKLineShowInfoSimple() dateTimeStamp, tradeDate, lv1Data = self.getTriggerTimeAndData( key[0]) event = Event({ "EventCode": ST_TRIGGER_CYCLE, "ContractNo": None, "KLineType": None, "KLineSlice": None, "Data": { "TradeDate": tradeDate, "DateTimeStamp": dateTimeStamp, "Data": None, } }) self._triggerQueue.put(event)
def _onStrategyQuit(self, event=None, status=ST_STATUS_QUIT): self._isSt2EgQueueEffective = False self._strategyState = StrategyStatusExit config = None if self._dataModel is None else self._dataModel.getConfigData() result = None if self._dataModel and self._dataModel.getCalcCenter(): result = self._dataModel.getCalcCenter().testResult() quitEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data":{ "Status":status, "Config":config, "Pid":os.getpid(), "Path":self._filePath, "StrategyName": self._strategyName, "Result":result } }) self.sendEvent2UI(quitEvent) self.sendEvent2EngineForce(quitEvent) self.logger.info(f"策略已经将停止完成信号发送到UI和engine,策略{self._strategyId}") # 保证该进程is_alive, 使得队列可用 while True: time.sleep(2)
def _onReport(self, event): data = self._dataModel.getCalcCenter().testResult() responseEvent = Event({ "EventCode": EV_EG2UI_REPORT_RESPONSE, "StrategyId": self._strategyId, "Data": data }) self.sendEvent2Engine(responseEvent)
def resetSyncPosConf(self, config): msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_SYNCPOS_CONF, "Data": config } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI]: Reset position setting send completely!")
def _onStrategyPause(self, event): self._strategyState = StrategyStatusPause responseEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data":{ "Status":ST_STATUS_PAUSE } }) self.sendEvent2Engine(responseEvent)
def _send2UIStatus(self, status): '''通知界面策略运行状态''' event = Event({ "StrategyId": self._strategyId, "EventCode": EV_EG2UI_STRATEGY_STATUS, "Data": { 'Status': status } }) self.sendEvent2UI(event)
def _exit(self, errorCode, errorText): event = Event({ "EventCode": EV_EG2UI_CHECK_RESULT, "StrategyId": self._strategyId, "Data": { "ErrorCode": errorCode, "ErrorText": errorText, } }) self.sendEvent2EngineForce(event) self._onStrategyQuit(None, ST_STATUS_EXCEPTION)
def _onStrategyResume(self, event): self._strategyState = StrategyStatusRunning status = ST_STATUS_CONTINUES if self.isRealTimeStatus() else ST_STATUS_HISTORY responseEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data": { "Status": status } }) self.sendEvent2Engine(responseEvent)
def deleteOrderByOrderId(self, orderId): aOrder = { "OrderId": orderId, } aOrderEvent = Event({ "EventCode": EV_ST2EG_ACTUAL_CANCEL_ORDER, "StrategyId": self.getStrategyId(), "Data": aOrder }) self.sendEvent2Engine(aOrderEvent) return True
def strategyParamRestart(self, strategyId, config): """属性设置""" msg = { "EventSrc" : EEQU_EVSRC_UI, "EventCode" : EV_UI2EG_STRATEGY_RESTART, "SessionId" : 0, "StrategyId": strategyId, "Data" : {"Config": config} } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI][{strategyId}]: Strategy Param setting send completely!")
def strategyRemove(self, strategyId): """移除策略""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_REMOVE, "SessionId": 0, "StrategyId": strategyId, "Data": {} } event = Event(msg) self._ui2egQueue.put(event)
def strategySignal(self, strategyId): """策略信号和指标图""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_FIGURE, "SessionId": 0, "StrategyId": strategyId, "Data": {} } event = Event(msg) self._ui2egQueue.put(event)
def strategyQuit(self, strategyId): """策略停止运行""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_QUIT, "SessionId": 0, "StrategyId": strategyId, "Data": {} } event = Event(msg) self._ui2egQueue.put(event)
def _onReport(self, event): data = self._dataModel.getCalcCenter().testResult() responseEvent = Event({ "EventCode":EV_EG2UI_REPORT_RESPONSE, "StrategyId":self._strategyId, "Data":{ "Result":data, "BeginTradeDate":self._dataModel.getHisQuoteModel().getBeginDate(), "EndTradeDate":self._dataModel.getHisQuoteModel().getEndDate(), } }) self.sendEvent2Engine(responseEvent)
def strategyResume(self, strategyId): """策略运行恢复""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_RESUME, "SessionId": 0, "Data": strategyId } event = Event(msg) self._ui2egQueue.put(event) print("恢复事件已发送")
def _onEquantExit(self, event): self._strategyState = StrategyStatusExit responseEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data": { "Status": event.getEventCode(), "Config": self._dataModel.getConfigData(), "Pid": os.getpid(), "Path": self._filePath, } }) self.sendEvent2Engine(responseEvent)
def strategyQuit(self, strategyId): """策略停止运行""" msg = { "EventSrc" : EEQU_EVSRC_UI, "EventCode" : EV_UI2EG_STRATEGY_QUIT, "SessionId" : 0, "StrategyId" : strategyId, "Data" : {} } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI][{strategyId}]: Strategy quit request send completely")
def strategyRemove(self, strategyId): """移除策略""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_REMOVE, "SessionId": 0, "StrategyId": strategyId, "Data": {} } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI][{strategyId}]: Strategy remove request send completely!")
def strategySignal(self, strategyId): """策略信号和指标图""" msg = { "EventSrc" : EEQU_EVSRC_UI, "EventCode" : EV_UI2EG_STRATEGY_FIGURE, "SessionId" : 0, "StrategyId" : strategyId, "Data" : {} } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI][{strategyId}]: Strategy Signal and index figure request send completely!")
def strategyResume(self, strategyId): """策略运行恢复""" msg = { "EventSrc" : EEQU_EVSRC_UI, "EventCode" : EV_UI2EG_STRATEGY_RESUME, "SessionId" : 0, "StrategyId" : strategyId, "Data" : {} } event = Event(msg) self._ui2egQueue.put(event) self._logger.info(f"[UI]{strategyId}: Strategy resume request send completely!")
def strategyPause(self, strategyId): """策略暂停事件""" msg = { "EventSrc": EEQU_EVSRC_UI, "EventCode": EV_UI2EG_STRATEGY_PAUSE, "StrategyId": strategyId, "SessionId": 0, "Data": {} } event = Event(msg) self._ui2egQueue.put(event)
def _onStrategyQuit(self, event): self._strategyState = StrategyStatusExit quitEvent = Event({ "EventCode": EV_EG2UI_STRATEGY_STATUS, "StrategyId": self._strategyId, "Data":{ "Status":ST_STATUS_QUIT, "Config":self._dataModel.getConfigData(), "Pid":os.getpid(), "Path":self._filePath, } }) self.sendEvent2Engine(quitEvent)