Ejemplo n.º 1
0
    def restart(self):
        """引擎初始化"""
        self.write_log("模拟交易主引擎:启动")

        # 引擎工作参数检查
        self._param_check()

        # 持久化配置
        if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME:
            self.pst_active = True
        elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL:
            self.pst_active = False
        else:
            raise ValueError("持久化参数错误")

        # 连接数据库
        db = self.creat_db()

        # 连接行情
        hq_client = self.creat_hq_api()

        # 账户引擎启动
        self.account_engine = AccountEngine(self.event_engine, self.pst_active,
                                            self._settings['LOAD_DATA_MODE'],
                                            db)
        self.account_engine.start()

        # 默认使用ChinaAMarket
        if not self._market or isinstance(self._market, ChinaAMarket):
            self._market = ChinaAMarket(self.event_engine, self.account_engine,
                                        hq_client, {})
        else:
            self._market = self._market(self.event_engine, self.account_engine,
                                        hq_client, {})

        # 交易市场初始化,并返回订单推送函数
        self.order_put = self._market.on_init()

        # 启动订单薄撮合程序
        self._thread = Thread(target=self._run)
        self._thread.start()
        self.__active = True

        return self
Ejemplo n.º 2
0
    def start(self):
        """引擎初始化"""
        self.write_log("模拟交易主引擎:启动")

        # 默认使用ChinaAMarket
        if not self._market:
            self._market = ChinaAMarket(self.event_engine, self._mode)

        # 交易市场初始化
        self.order_put = self._market.on_init()

        # 连接数据库
        host = self.settings.get('MONGO_HOST')
        port = self.settings.get('MONGO_PORT')
        self.db = MongoDBService(host, port)
        self.db.connect_db()

        # 启动订单薄撮合程序
        self._thread.start()

        return self
Ejemplo n.º 3
0
class MainEngine():
    """模拟交易主引擎"""
    def __init__(self,
                 event_engine: EventEngine = None,
                 market=None,
                 param: dict = None):
        # 绑定事件引擎
        if not event_engine:
            self.event_engine = EventEngine()
        else:
            self.event_engine = event_engine
        self.event_engine.start()

        self._settings = SETTINGS  # 配置参数
        self.__active = False  # 主引擎状态
        self.pst_active = None  # 数据持久化开关
        self._market = market  # 交易市场
        self.account_engine = None  # 账户引擎
        self.order_put = None  # 订单回调函数

        # 更新参数
        self._settings.update(param)

        # 开启日志引擎
        log = LogEngine(self.event_engine)
        log.register_event()

        # 开启邮件引擎
        # self.email = EmailEngine(self.event_engine)
        # self.email.start()

        # 市场模拟交易线程
        self._thread = Thread(target=self._run)

        # 注册事件监听
        self.event_register()

        self.write_log("模拟交易主引擎:初始化完毕")

    def event_register(self):
        """注册事件监听"""
        self.event_engine.register(EVENT_ERROR, self.process_error_event)
        self.event_engine.register(EVENT_MARKET_CLOSE,
                                   self.process_market_close)

    def start(self):
        """引擎初始化"""
        self.write_log("模拟交易主引擎:启动")

        # 引擎工作参数检查
        self._param_check()

        # 持久化配置
        if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME:
            self.pst_active = True
        elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL:
            self.pst_active = False
        else:
            raise ValueError("持久化参数错误")

        # 连接数据库
        db = self.creat_db()

        # 连接行情
        hq_client = self.creat_hq_api()

        # 账户引擎启动
        self.account_engine = AccountEngine(self.event_engine, self.pst_active,
                                            self._settings['LOAD_DATA_MODE'],
                                            db)
        self.account_engine.start()

        # 默认使用ChinaAMarket
        if not self._market or isinstance(self._market, ChinaAMarket):
            self._market = ChinaAMarket(self.event_engine, self.account_engine,
                                        hq_client, {})
        else:
            self._market = self._market(self.event_engine, self.account_engine,
                                        hq_client, {})

        # 交易市场初始化,并返回订单推送函数
        self.order_put = self._market.on_init()

        # 启动订单薄撮合程序
        self._thread.start()
        self.__active = True

        return self

    def restart(self):
        """引擎初始化"""
        self.write_log("模拟交易主引擎:启动")

        # 引擎工作参数检查
        self._param_check()

        # 持久化配置
        if self._settings['PERSISTENCE_MODE'] == PersistanceMode.REALTIME:
            self.pst_active = True
        elif self._settings['PERSISTENCE_MODE'] == PersistanceMode.MANUAL:
            self.pst_active = False
        else:
            raise ValueError("持久化参数错误")

        # 连接数据库
        db = self.creat_db()

        # 连接行情
        hq_client = self.creat_hq_api()

        # 账户引擎启动
        self.account_engine = AccountEngine(self.event_engine, self.pst_active,
                                            self._settings['LOAD_DATA_MODE'],
                                            db)
        self.account_engine.start()

        # 默认使用ChinaAMarket
        if not self._market or isinstance(self._market, ChinaAMarket):
            self._market = ChinaAMarket(self.event_engine, self.account_engine,
                                        hq_client, {})
        else:
            self._market = self._market(self.event_engine, self.account_engine,
                                        hq_client, {})

        # 交易市场初始化,并返回订单推送函数
        self.order_put = self._market.on_init()

        # 启动订单薄撮合程序
        self._thread = Thread(target=self._run)
        self._thread.start()
        self.__active = True

        return self

    def _run(self):
        """订单薄撮合程序启动"""
        self._market.on_match()

    def _close(self):
        """模拟交易引擎关闭"""
        # 关闭市场
        self._market._active = False
        self._thread.join()

        self.__active = False

        self.write_log("模拟交易主引擎:关闭")

    def _param_check(self):
        """引擎工作参数检查"""
        if not self._settings['PERSISTENCE_MODE']:
            raise ValueError("数据持久化参数未配置")

    def on_orders_arrived(self, order):
        """订单到达处理"""
        if self.__active:
            status, msg = self.account_engine.orders_arrived(order)
            return status, msg
        else:
            return False, "交易市场关闭"

    def process_market_close(self, event):
        """市场关闭处理"""
        market_name = event.data
        self.write_log("{}: 交易市场闭市".format(market_name))
        self._close()

    def process_error_event(self, event):
        """系统错误处理"""
        msg = event.data
        self.write_log(msg, level=logging.CRITICAL)
        # self.email.queue.put(msg)

    def creat_db(self):
        """实例化数据库"""
        host = self._settings.get('MONGO_HOST', "localhost")
        port = self._settings.get('MONGO_PORT', 27017)
        db = MongoDBService(host, port)
        db.connect_db()
        return db

    def creat_hq_api(self):
        """实例化行情源"""
        tdx = PYTDXService()
        tdx.connect_api()

        return tdx

    def write_log(self, msg: str, level: int = logging.INFO):
        """"""
        log = LogData(log_content=msg, log_level=level)
        event = Event(EVENT_LOG, log)
        self.event_engine.put(event)
Ejemplo n.º 4
0
class MainEngine():
    """模拟交易主引擎"""
    def __init__(
            self,
            event_engine: EventEngine = None,
            market: Exchange = None,
            param: dict = None
    ):
        # 绑定事件引擎
        if not event_engine:
            self.event_engine = EventEngine()
        else:
            self.event_engine = event_engine
        self.event_engine.start()

        self.db = None             # 数据库实例
        self._market = market      # 市场实例
        self._mode = param.get('ENGINE_MODE')
        self.settings = SETTINGS   # 绑定参数
        self.order_put = None      # 订单推送

        # 更新参数
        self.settings.update(param)

        # 开启日志引擎
        log = LogEngine(self.event_engine)
        log.register_event()

        # 开启邮件引擎
        # self.email = EmailEngine(self.event_engine)
        # self.email.start()

        # 市场交易线程
        self._thread = Thread(target=self._run)

        # 注册事件监听
        self.event_register()

        self.write_log("模拟交易主引擎:初始化完毕")

    def event_register(self):
        """注册事件监听"""
        self.event_engine.register(EVENT_ERROR, self.process_error_event)
        self.event_engine.register(
            EVENT_MARKET_CLOSE,
            self.process_market_close)

    def start(self):
        """引擎初始化"""
        self.write_log("模拟交易主引擎:启动")

        # 默认使用ChinaAMarket
        if not self._market:
            self._market = ChinaAMarket(self.event_engine, self._mode)

        # 交易市场初始化
        self.order_put = self._market.on_init()

        # 连接数据库
        host = self.settings.get('MONGO_HOST')
        port = self.settings.get('MONGO_PORT')
        self.db = MongoDBService(host, port)
        self.db.connect_db()

        # 启动订单薄撮合程序
        self._thread.start()

        return self

    def _run(self):
        """订单薄撮合程序启动"""
        self._market.on_match(self.db)

    def _close(self):
        """模拟交易引擎关闭"""
        # 关闭市场
        self._market._active = False
        self._thread.join()

        # 关闭数据库
        self.db.close()

        self.write_log("模拟交易主引擎:关闭")

    def process_market_close(self, event):
        """市场关闭处理"""
        market_name = event.data
        self.write_log("{}: 交易市场闭市".format(market_name))
        self._close()

    def process_error_event(self, event):
        """系统错误处理"""
        msg = event.data
        self.write_log(msg, level=logging.CRITICAL)
        # self.email.queue.put(msg)

    def get_report(self, token, start, end):
        """获取交易报告"""
        captial, account_df, pos_df, trade_df = calculate_result(token, self.db, start, end)

        if not len(trade_df):
            return "成交记录为空,无法计算"

        # 获取分析报告
        statistics = trade_statistics(captial, account_df, pos_df, trade_df)

        return statistics

    def write_log(self, msg: str, level: int = logging.INFO):
        """"""
        log = LogData(
            log_content=msg,
            log_level=level
        )
        event = Event(EVENT_LOG, log)
        self.event_engine.put(event)