class StrategyEngine(object): """策略引擎""" CACHE_MAXLEN = 10000 # ---------------------------------------------------------------------- def __init__(self, is_backtest=False): """Constructor""" self.__event_engine = EventEngine() # 事件处理引擎 self.__account_manager = AccountManager() # 账户管理 self.__trade_manager = TradeManager(self, is_backtest) # 交易管理器 self.__data_cache = DataCache(self) # 数据中继站 self.__strategys = {} # 策略管理器 def get_data(self): return self.__data_cache.data def get_symbol_pool(self): return self.__data_cache.symbol_pool def get_current_positions(self): return self.__trade_manager.current_positions def get_current_time(self): return self.__data_cache.current_time def get_positions(self): return self.__trade_manager.positions def get_deals(self): return self.__trade_manager.deals def get_strategys(self): return self.__strategys def get_profit_records(self): """获取平仓收益记录""" return self.__account_manager.get_profit_records() def get_symbol_timeframe(self): return self.__data_cache.get_cache_info().keys() # XXX之所以不用装饰器的方式是考虑到不知经过一层property会不会影响效率,所以保留用get_XXX直接访问 # property: current_time = property(get_current_time) symbol_pool = property(get_symbol_pool) data = property(get_data) current_positions = property(get_current_positions) positions = property(get_positions) deal = property(get_deals) strategys = property(get_strategys) profit_records = property(get_profit_records) symbol_timeframe = property(get_symbol_timeframe) def update_deal(self, deal): self.__account_manager.update_deal(deal) def open_position(self, *args, **kwargs): self.__trade_manager.open_position(*args, **kwargs) def close_position(self, *args, **kwargs): self.__trade_manager.close_position(*args, **kwargs) def set_capital_base(self, base): self.__account_manager.set_capital_base(base) # ---------------------------------------------------------------------- def add_cache_info(self, *args, **kwargs): self.__data_cache.add_cache_info(*args, **kwargs) # TODO 从全局的品种池中查询 # ---------------------------------------------------------------------- def add_file(self, file): self.__event_engine.add_file(file) # ---------------------------------------------------------------------- def add_strategy(self, strategy): """添加已创建的策略实例""" self.__strategys[strategy.get_id()] = strategy strategy.engine = self # ---------------------------------------------------------------------- def put_event(self, event): # TODO 加入验证 # TODO 多了一层函数调用,尝试用绑定的形式 self.__event_engine.put(event) # ---------------------------------------------------------------------- def register_event(self, event_type, handle): """注册事件监听""" # TODO 加入验证 self.__event_engine.register(event_type, handle) def unregister_event(self, event_type, handle): """取消事件监听""" self.__event_engine.unregister(event_type, handle) # ---------------------------------------------------------------------- def write_log(self, log): """写日志""" self.__event_engine.put(Event(type=EVENT_LOG, log=log)) # ---------------------------------------------------------------------- def start(self): """启动所有策略""" for strategy in self.__strategys.values(): strategy.start() self.__data_cache.start() self.__trade_manager.init() self.__event_engine.start() # ---------------------------------------------------------------------- def stop(self): """停止所有策略""" self.__event_engine.stop() self.__data_cache.stop() for strategy in self.__strategys.values(): strategy.stop() self._recycle() # 释放资源 # ---------------------------------------------------------------------- def _recycle(self): self.__data_cache.stop() self.__trade_manager.recycle() self.__account_manager.initialize() def wait(self, call_back=None, finished=True, *args, **kwargs): """等待所有事件处理完毕 :param call_back: 运行完成时的回调函数 :param finish: 向下兼容,finish为True时,事件队列处理完成时结束整个回测引擎;为False时只是调用回调函数,继续挂起回测引擎。 """ self.__event_engine.wait() result = call_back(*args, **kwargs) if finished: self._set_finished() self.stop() return result def _set_finished(self): # 标记即不会再有新数据到来 self.__event_engine.set_finished()