def sendOrderHistorySyncEvent(self, exchange, fSymbol, tSymbol, limit, ratio): try: # 构造事件对象 TEMP_EVENT = json.loads( ORDER_HISTORY_SYNC_EVENT.substitute( id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), exchange=exchange, fSymbol=fSymbol, tSymbol=tSymbol, limit=limit, ratio=ratio)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendOrderHistorySyncEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendOrderHistorySyncEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendListenMarketKlineEvent(self, exchange, fSymbol, tSymbol, interval, start, end): try: # 构造事件对象 TEMP_EVENT = json.loads( LISTEN_MARKET_KLINE_EVENT.substitute( id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), exchange=exchange, fSymbol=fSymbol, tSymbol=tSymbol, interval=interval, start=start, end=end)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendListenMarketKlineEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendListenMarketKlineEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendJudgeMarketKlineEvent(self, args): try: # 构造事件对象 TEMP_EVENT = json.loads( JUDGE_MARKET_KLINE_EVENT.substitute( id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), args="")) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendJudgeMarketKlineEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 pass except Exception as err: errStr = "src.core.engine.sender.Sender.sendJudgeMarketKlineEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendStatiscJudgeEvent(self, exchange, types): try: # 构造事件对象 TEMP_EVENT = json.loads( STATISTIC_JUDGE_EVENT.substitute(id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), exchange=exchange, types=types)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendStatiscJudgeEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendStatiscJudgeEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendListenAccountBalanceEvent(self, exchange): try: # 构造事件对象 TEMP_EVENT = json.loads( LISTEN_ACCOUNT_BALANCE_EVENT.substitute( id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), exchange=exchange)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendListenAccountBalanceEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendListenAccountBalanceEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendStatiscOrderEvent(self, signals): try: for signal in signals: signal['status_assets'] = json_escape(signal['status_assets']) # 构造事件对象 TEMP_EVENT = json.loads( STATISTIC_ORDER_EVENT.substitute(id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), signals=signals)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendStatiscOrderEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendStatiscOrderEvent: %s" % EngineException( err) raise EngineException(errStr)
def sendOrderHistoryCreatEvent(self, exchange, signals, timeout): try: # 构造事件对象 TEMP_EVENT = json.loads( BACKTEST_HISTORY_CREAT_EVENT.substitute( id=self._engine.getEventID(), timeStamp=utcnow_timestamp(), exchange=exchange, signals=signals, timeout=timeout)) event = Event(TEMP_EVENT) self._logger.debug( "src.core.engine.sender.Sender.sendOrderHistoryCreatEvent: " + json.dumps(TEMP_EVENT)) # 发送事件 self._engine.sendEvent(event) # 返回参数 return event.id except Exception as err: errStr = "src.core.engine.sender.Sender.sendOrderHistoryCreatEvent: %s" % EngineException( err) raise EngineException(errStr)
def backtestUpdateSignalStatusByOrders(self, infoOrders, resInfoSymbol): self._logger.debug( "src.core.calc.signal.Signal.backtestUpdateSignalStatusByOrders: {infoOrders=%s, resInfoSymbol=%s}" % ('infoOrders', 'resInfoSymbol')) try: if not self._signals: raise Exception("NO SIGNAL ERROR, signals empty.") calc = Calc() resStatus = [] timeStamp = utcnow_timestamp() for signal in self._signals: orders = infoOrders[( infoOrders['group_id'] == signal['group_id'])] status = calc.calcSignalStatusByOrders(signal, orders, resInfoSymbol, SIGNAL_BASECOIN) if not status == []: resStatus.append({ "signal_id": signal['signal_id'], "status": status }) if not resStatus == []: for signal in self._signals: for res in resStatus: if signal['signal_id'] == res['signal_id']: signal['timeStamp'] = timeStamp signal['status_done'] = res['status'][ 'status_done'] signal['status_assets'] = res['status'][ 'status_assets'] signal['status_gain'] = res['status'][ 'status_gain'] except Exception as err: errStr = "src.core.calc.signal.Signal.backtestUpdateSignalStatusByOrders: {infoOrders=%s, resInfoSymbol=%s}, exception err=%s" % ( 'infoOrders', 'resInfoSymbol', err) raise CalcException(errStr)
def __run(self): self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run") try: while self.__active.value: # 执行 Epoch time.sleep(self.__epoch) # 控制最大进程数量 if self.getActiveEventNum() > int(self.__maxProcess): self.__logger.warn( "src.core.engine.engine.EventEngine.__mainProcess.__run.__eventQueue: Too Many" ) else: # 按优先级 获取队列中的事件 超时1秒 event = None if not self.__highEventQueue.empty(): self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run.__highEventQueue" ) event = self.__highEventQueue.get(block=False) while utcnow_timestamp( ) - event.timeStamp > HIGH_PRIORITY_EVENT_TIMEOUT: self.__status.delEventStatus(event) if not self.__highEventQueue.empty(): self.__logger.error( "src.core.engine.engine.EventEngine.__mainProcess.__run.__highEventQueue TIMEOUT: {id=%s, type=%s, priority=%s, timeStamp=%s, args=%s}" % (event.id, event.type, event.priority, event.timeStamp, event.args)) event = self.__highEventQueue.get(block=False) else: event = None break if not self.__mediumEventQueue.empty() and event == None: self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run.__mediumEventQueue" ) event = self.__mediumEventQueue.get(block=False) while utcnow_timestamp( ) - event.timeStamp > MEDIUM_PRIORITY_EVENT_TIMEOUT: self.__status.delEventStatus(event) if not self.__mediumEventQueue.empty(): self.__logger.error( "src.core.engine.engine.EventEngine.__mainProcess.__run.__mediumEventQueue TIMEOUT: {id=%s, type=%s, priority=%s, timeStamp=%s, args=%s}" % (event.id, event.type, event.priority, event.timeStamp, event.args)) event = self.__mediumEventQueue.get( block=False) else: event = None break if not self.__lowEnventQueue.empty() and event == None: self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run.__lowEnventQueue" ) event = self.__lowEnventQueue.get(block=False) while utcnow_timestamp( ) - event.timeStamp > LOW_PRIORITY_EVENT_TIMEOUT: self.__status.delEventStatus(event) if not self.__lowEnventQueue.empty(): self.__logger.error( "src.core.engine.engine.EventEngine.__mainProcess.__run.__lowEnventQueue TIMEOUT: {id=%s, type=%s, priority=%s, timeStamp=%s, args=%s}" % (event.id, event.type, event.priority, event.timeStamp, event.args)) event = self.__lowEnventQueue.get(block=False) else: event = None break # 事件队列非空 if not event == None: # 执行事件 self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run.__eventQueue: {id=%s, type=%s, priority=%s, timeStamp=%s, args=%s}" % (event.id, event.type, event.priority, event.timeStamp, event.args)) self.__process(event) else: self.__logger.debug( "src.core.engine.engine.EventEngine.__mainProcess.__run.__eventQueue: empty" ) # 定期清理进程池 if len(self.__processPool) > self.__maxProcess: for (_id, _pid) in self.__processPool: if not psutil.pid_exists(_pid): self.__processPool.remove((_id, _pid)) # break out while # 终止所有事件处理进程 for (_id, _pid) in self.__processPool: if psutil.pid_exists(_pid): _p = psutil.Process(_pid) _p.terminate() self.__processPool.remove((_id, _pid)) except Exception as err: errStr = "src.core.engine.engine.EventEngine.__mainProcess.__run: exception err=%s" % EngineException( err) raise EngineException(errStr)
def _configSignals(self, exchange, types): self._logger.debug("src.core.calc.signal.Signal._configSignals") try: signals = [] strList = ast.literal_eval(self._signals_str) if not strList == []: pid = os.getpid() timeStamp = utcnow_timestamp() id = 0 for s in strList: id = id + 1 signal = {} if s['type'] == TYPE_DIS: if (types == 'all' or TYPE_DIS in types) and ( exchange == 'all' or (s['bid_server'] in exchange and s['ask_server'] in exchange)): id_str = str(pid) + str(timeStamp) + str(id) signal['timeStamp'] = timeStamp signal['signal_id'] = '0x1c-' + str( uuid.uuid3(uuid.NAMESPACE_DNS, id_str)) signal['type'] = s['type'] signal['bid_server'] = s['bid_server'] signal['ask_server'] = s['ask_server'] signal['fSymbol'] = s['fSymbol'] signal['tSymbol'] = s['tSymbol'] signal['forward_ratio'] = float(s['forward_ratio']) signal['backward_ratio'] = float( s['backward_ratio']) signal['base_start'] = float(s['base_start']) signal['base_gain'] = float(s['base_gain']) signal['base_timeout'] = float(s['base_timeout']) signal['group_id'] = str(s['group_id']) signal['status_done'] = False signal['status_assets'] = [{ "server": s['bid_server'], "asset": SIGNAL_BASECOIN, "balance": float(s['base_start']) / 2, "free": float(s['base_start']) / 2, "locked": 0.0 }, { "server": s['ask_server'], "asset": SIGNAL_BASECOIN, "balance": float(s['base_start']) / 2, "free": float(s['base_start']) / 2, "locked": 0.0 }] signal['status_gain'] = 0.0 if s['type'] == TYPE_TRA: if (types == 'all' or TYPE_TRA in types) and ( exchange == 'all' or s['server'] in exchange): tuple = tuple_str_to_list(s['symbol_pair']) id_str = str(pid) + str(timeStamp) + str(id) signal['timeStamp'] = timeStamp signal['signal_id'] = '0x2c-' + str( uuid.uuid3(uuid.NAMESPACE_DNS, id_str)) signal['type'] = s['type'] signal['server'] = s['server'] signal['V1_fSymbol'] = tuple[0][0] signal['V1_tSymbol'] = tuple[0][1] signal['V2_fSymbol'] = tuple[1][0] signal['V2_tSymbol'] = tuple[1][1] signal['V3_fSymbol'] = tuple[2][0] signal['V3_tSymbol'] = tuple[2][1] signal['forward_ratio'] = float(s['forward_ratio']) signal['base_start'] = float(s['base_start']) signal['base_gain'] = float(s['base_gain']) signal['base_timeout'] = float(s['base_timeout']) signal['group_id'] = str(s['group_id']) signal['status_done'] = False signal['status_assets'] = [{ "server": s['server'], "asset": SIGNAL_BASECOIN, "balance": float(s['base_start']), "free": float(s['base_start']), "locked": 0.0 }] signal['status_gain'] = 0.0 if s['type'] == TYPE_PAIR: if (types == 'all' or TYPE_PAIR in types) and ( exchange == 'all' or (s['J1_server'] in exchange and s['J2_server'] in exchange)): tuple = tuple_str_to_list(s['symbol_pair']) id_str = str(pid) + str(timeStamp) + str(id) signal['timeStamp'] = timeStamp signal['signal_id'] = '0x3c-' + str( uuid.uuid3(uuid.NAMESPACE_DNS, id_str)) signal['type'] = s['type'] signal['J1_server'] = s['J1_server'] signal['J2_server'] = s['J2_server'] signal['V1_fSymbol'] = tuple[0][0] signal['V1_tSymbol'] = tuple[0][1] signal['V2_fSymbol'] = tuple[1][0] signal['V2_tSymbol'] = tuple[1][1] signal['V3_fSymbol'] = tuple[2][0] signal['V3_tSymbol'] = tuple[2][1] signal['forward_ratio'] = float(s['forward_ratio']) signal['base_start'] = float(s['base_start']) signal['base_gain'] = float(s['base_gain']) signal['base_timeout'] = float(s['base_timeout']) signal['group_id'] = str(s['group_id']) signal['status_done'] = False signal['status_assets'] = [{ "server": s['J1_server'], "asset": SIGNAL_BASECOIN, "balance": float(s['base_start']) / 2, "free": float(s['base_start']) / 2, "locked": 0.0 }, { "server": s['J2_server'], "asset": SIGNAL_BASECOIN, "balance": float(s['base_start']) / 2, "free": float(s['base_start']) / 2, "locked": 0.0 }] signal['status_gain'] = 0.0 if not signal == {}: signals.append(signal) # return signals return signals except Exception as err: errStr = "src.core.calc.signal.Signal.signals, exception err=%s" % err raise CalcException(errStr)