主引擎,负责行情 / 事件驱动引擎 / 交易
| 27 | |
| 28 | |
| 29 | class MainEngine: |
| 30 | """主引擎,负责行情 / 事件驱动引擎 / 交易""" |
| 31 | |
| 32 | def __init__(self, broker=None, need_data=None, quotation_engines=None, |
| 33 | log_handler=DefaultLogHandler(), tzinfo=None): |
| 34 | """初始化事件 / 行情 引擎并启动事件引擎 |
| 35 | """ |
| 36 | self.log = log_handler |
| 37 | self.broker = broker |
| 38 | |
| 39 | # 登录账户 |
| 40 | if (broker is not None) and (need_data is not None): |
| 41 | self.user = easytrader.use(broker) |
| 42 | need_data_file = pathlib.Path(need_data) |
| 43 | if need_data_file.exists(): |
| 44 | self.user.prepare(need_data) |
| 45 | else: |
| 46 | log_handler.warn("券商账号信息文件 %s 不存在, easytrader 将不可用" % need_data) |
| 47 | else: |
| 48 | self.user = None |
| 49 | self.log.info('选择了无交易模式') |
| 50 | |
| 51 | self.event_engine = EventEngine() |
| 52 | self.clock_engine = ClockEngine(self.event_engine, tzinfo) |
| 53 | |
| 54 | quotation_engines = quotation_engines or [DefaultQuotationEngine] |
| 55 | |
| 56 | if type(quotation_engines) != list: |
| 57 | quotation_engines = [quotation_engines] |
| 58 | else: |
| 59 | types = [quo.EventType for quo in quotation_engines] |
| 60 | if len(types) != len(set(types)): |
| 61 | types.sort() |
| 62 | types = ','.join([str(t) for t in types]) |
| 63 | raise ValueError("行情引擎 EventType 重复:" + types) |
| 64 | self.quotation_engines = [] |
| 65 | for quotation_engine in quotation_engines: |
| 66 | self.quotation_engines.append(quotation_engine(self.event_engine, self.clock_engine)) |
| 67 | |
| 68 | # 保存读取的策略类 |
| 69 | self.strategies = OrderedDict() |
| 70 | self.strategy_list = list() |
| 71 | |
| 72 | # 是否要动态重载策略 |
| 73 | self.is_watch_strategy = False |
| 74 | # 修改时间缓存 |
| 75 | self._cache = {} |
| 76 | # # 文件进程映射 |
| 77 | # self._process_map = {} |
| 78 | # 文件模块映射 |
| 79 | self._modules = {} |
| 80 | self._names = None |
| 81 | # 加载锁 |
| 82 | self.lock = Lock() |
| 83 | # 加载线程 |
| 84 | self._watch_thread = Thread(target=self._load_strategy, name="MainEngine.watch_reload_strategy") |
| 85 | |
| 86 | # shutdown 函数 |
no outgoing calls