时间推送引擎 1. 提供统一的 now 时间戳.
| 103 | |
| 104 | |
| 105 | class ClockEngine: |
| 106 | """ |
| 107 | 时间推送引擎 |
| 108 | 1. 提供统一的 now 时间戳. |
| 109 | """ |
| 110 | EventType = 'clock_tick' |
| 111 | |
| 112 | def __init__(self, event_engine, tzinfo=None): |
| 113 | """ |
| 114 | :param event_engine: |
| 115 | :param event_engine: tzinfo |
| 116 | :return: |
| 117 | """ |
| 118 | # 默认使用当地时间的时区 |
| 119 | self.tzinfo = tzinfo or tz.tzlocal() |
| 120 | |
| 121 | self.event_engine = event_engine |
| 122 | self.is_active = True |
| 123 | self.clock_engine_thread = Thread(target=self.clocktick, name="ClockEngine.clocktick") |
| 124 | self.sleep_time = 1 |
| 125 | self.trading_state = True if (etime.is_tradetime(datetime.datetime.now()) and etime.is_trade_date(datetime.datetime.now())) else False |
| 126 | self.clock_moment_handlers = deque() |
| 127 | self.clock_interval_handlers = set() |
| 128 | |
| 129 | self._init_clock_handler() |
| 130 | |
| 131 | def _init_clock_handler(self): |
| 132 | """ |
| 133 | 注册默认的时钟事件 |
| 134 | :return: |
| 135 | """ |
| 136 | |
| 137 | # 开盘事件 |
| 138 | def _open(): |
| 139 | self.trading_state = True |
| 140 | |
| 141 | self._register_moment('open', datetime.time(9, tzinfo=self.tzinfo), makeup=True, call=_open) |
| 142 | |
| 143 | # 中午休市 |
| 144 | self._register_moment('pause', datetime.time(11, 30, tzinfo=self.tzinfo), makeup=True) |
| 145 | |
| 146 | # 下午开盘 |
| 147 | self._register_moment('continue', datetime.time(13, tzinfo=self.tzinfo), makeup=True) |
| 148 | |
| 149 | # 收盘事件 |
| 150 | def close(): |
| 151 | self.trading_state = False |
| 152 | |
| 153 | self._register_moment('close', datetime.time(15, tzinfo=self.tzinfo), makeup=True, call=close) |
| 154 | |
| 155 | # 间隔事件 |
| 156 | for interval in (0.5, 1, 5, 15, 30, 60): |
| 157 | self.register_interval(interval) |
| 158 | |
| 159 | @property |
| 160 | def now(self): |
| 161 | """ |
| 162 | now 时间戳统一接口 |
no outgoing calls