策略执行的物理单元,支持多个策略同时运行。 每个执行单元都可能跟踪多个数据(策略用到的周期合约数据集合)。 其中第一个合约为"主合约" 。 每个执行器可加载多个策略,只要数据需求不超过pcontracts。 :ivar begin_dt: 策略执行的时间起点。 :vartype begin_dt: datetime :ivar end_dt: 策略执行的时间终点。 :vartype end_dt: datetime :ivar pcontracts: 策略用到的周期合约数据集合。
| 6 | from quantdigger.kernel.engine.strategy import BarTracker |
| 7 | from quantdigger.kernel.engine.event import Event |
| 8 | class ExecuteUnit(object): |
| 9 | """ 策略执行的物理单元,支持多个策略同时运行。 |
| 10 | 每个执行单元都可能跟踪多个数据(策略用到的周期合约数据集合)。 |
| 11 | 其中第一个合约为"主合约" 。 每个执行器可加载多个策略,只要数据需求不超过pcontracts。 |
| 12 | |
| 13 | :ivar begin_dt: 策略执行的时间起点。 |
| 14 | :vartype begin_dt: datetime |
| 15 | :ivar end_dt: 策略执行的时间终点。 |
| 16 | :vartype end_dt: datetime |
| 17 | :ivar pcontracts: 策略用到的周期合约数据集合。 |
| 18 | :vartype pcontracts: list |
| 19 | :ivar trackers: 策略用到的跟踪器集合。(和周期合约一一对应) |
| 20 | :vartype trackers: list |
| 21 | :ivar _strategies: 策略集合。 |
| 22 | :vartype _strategies: list |
| 23 | |
| 24 | """ |
| 25 | def __init__(self, pcontracts, begin_dt=None, end_dt=None): |
| 26 | self.begin_dt = begin_dt |
| 27 | self.end_dt = end_dt |
| 28 | # 不同周期合约数据。 |
| 29 | self.data = { } # PContract -> pandas.DataFrame |
| 30 | self.pcontracts = pcontracts |
| 31 | self.trackers = [] |
| 32 | self._strategies = [] |
| 33 | |
| 34 | # 如果begin_dt, end_dt 等于None,做特殊处理。 |
| 35 | # accociate with a mplot widget |
| 36 | #tracker.pcontracts |
| 37 | |
| 38 | self.load_data(pcontracts[0]) |
| 39 | # 每个周期合约对应一个跟跟踪器。 |
| 40 | for pcon in pcontracts[1:]: |
| 41 | self.load_data(pcon) |
| 42 | BarTracker(self, pcon) |
| 43 | |
| 44 | def run(self): |
| 45 | """""" |
| 46 | print 'running...' |
| 47 | bar_index = 0 |
| 48 | while bar_index < self._data_length: |
| 49 | # |
| 50 | latest_bars = { } |
| 51 | for tracker in self.trackers: |
| 52 | bar = tracker.update_curbar(bar_index) |
| 53 | latest_bars[tracker._main_contract] = bar |
| 54 | # 在回测中无需MARKET事件。 |
| 55 | # 这样可以加速回测速度。 |
| 56 | for algo in self._strategies: |
| 57 | bar = algo.update_curbar(bar_index) |
| 58 | algo.exchange.update_datetime(bar.datetime) |
| 59 | algo.blotter.update_datetime(bar.datetime) |
| 60 | latest_bars[algo._main_contract] = bar |
| 61 | algo.blotter.update_bar(latest_bars) |
| 62 | #algo.exchange.make_market(bar) |
| 63 | # 对新的价格运行算法。 |
| 64 | algo.execute_strategy() |
| 65 | while True: |