def __getitem__(self, key): if not isinstance(key, six.string_types): raise patch_user_exc(ValueError('invalid key {} (use order_book_id please)'.format(key))) instrument = self._data_proxy.instruments(key) if instrument is None: raise patch_user_exc(ValueError('invalid order book id or symbol: {}'.format(key))) order_book_id = instrument.order_book_id try: return self._cache[order_book_id] except KeyError: try: if not self._dt: return BarObject(instrument, NANDict, self._dt) if ExecutionContext.phase() == EXECUTION_PHASE.OPEN_AUCTION: bar = self._data_proxy.get_open_auction_bar(order_book_id, self._dt) else: bar = self._data_proxy.get_bar(order_book_id, self._dt, self._frequency) except PermissionError: raise except Exception as e: system_log.exception(e) raise patch_user_exc(KeyError(_(u"id_or_symbols {} does not exist").format(key))) if bar is None: return BarObject(instrument, NANDict, self._dt) else: self._cache[order_book_id] = bar return bar
def current_snapshot(id_or_symbol): # type: (Union[str, Instrument]) -> Optional[TickObject] """ 获得当前市场快照数据。只能在日内交易阶段调用,获取当日调用时点的市场快照数据。 市场快照数据记录了每日从开盘到当前的数据信息,可以理解为一个动态的day bar数据。 在目前分钟回测中,快照数据为当日所有分钟线累积而成,一般情况下,最后一个分钟线获取到的快照数据应当与当日的日线行情保持一致。 需要注意,在实盘模拟中,该函数返回的是调用当时的市场快照情况,所以在同一个handle_bar中不同时点调用可能返回的数据不同。 如果当日截止到调用时候对应股票没有任何成交,那么snapshot中的close, high, low, last几个价格水平都将以0表示。 :param d_or_symbol: 合约代码或简称 :example: 在handle_bar中调用该函数,假设策略当前时间是20160104 09:33: .. code-block:: python3 :linenos: [In] logger.info(current_snapshot('000001.XSHE')) [Out] 2016-01-04 09:33:00.00 INFO Snapshot(order_book_id: '000001.XSHE', datetime: datetime.datetime(2016, 1, 4, 9, 33), open: 10.0, high: 10.025, low: 9.9667, last: 9.9917, volume: 2050320, total_turnover: 20485195, prev_close: 9.99) """ env = Environment.get_instance() frequency = env.config.base.frequency order_book_id = assure_order_book_id(id_or_symbol) dt = env.calendar_dt if env.config.base.run_type == RUN_TYPE.BACKTEST: if ExecutionContext.phase() == EXECUTION_PHASE.BEFORE_TRADING: dt = env.data_proxy.get_previous_trading_date( env.trading_dt.date()) return env.data_proxy.current_snapshot(order_book_id, "1d", dt) elif ExecutionContext.phase() == EXECUTION_PHASE.AFTER_TRADING: return env.data_proxy.current_snapshot(order_book_id, "1d", dt) # PT、实盘直接取最新快照,忽略 frequency, dt 参数 return env.data_proxy.current_snapshot(order_book_id, frequency, dt)
def mavg(self, intervals, frequency='1d'): if frequency == 'day': frequency = '1d' if frequency == 'minute': frequency = '1m' # copy form history env = Environment.get_instance() dt = env.calendar_dt if (env.config.base.frequency == '1m' and frequency == '1d') or ExecutionContext.phase() == EXECUTION_PHASE.BEFORE_TRADING: # 在分钟回测获取日线数据, 应该推前一天 dt = env.data_proxy.get_previous_trading_date(env.calendar_dt.date()) bars = env.data_proxy.fast_history(self._instrument.order_book_id, intervals, frequency, 'close', dt) return bars.mean()
def submit_order(self, order): if order.position_effect == POSITION_EFFECT.MATCH: raise TypeError(_("unsupported position_effect {}").format(order.position_effect)) account = self._env.get_account(order.order_book_id) self._env.event_bus.publish_event(Event(EVENT.ORDER_PENDING_NEW, account=account, order=order)) if order.is_final(): return if order.position_effect == POSITION_EFFECT.EXERCISE: return self._open_exercise_orders.append((account, order)) if ExecutionContext.phase() == EXECUTION_PHASE.OPEN_AUCTION: self._open_auction_orders.append((account, order)) else: self._open_orders.append((account, order)) order.active() self._env.event_bus.publish_event(Event(EVENT.ORDER_CREATION_PASS, account=account, order=order)) if self._match_immediately: self._match()
def vwap(self, intervals, frequency='1d'): if frequency == 'day': frequency = '1d' if frequency == 'minute': frequency = '1m' # copy form history env = Environment.get_instance() dt = env.calendar_dt if (env.config.base.frequency == '1m' and frequency == '1d') or ExecutionContext.phase() == EXECUTION_PHASE.BEFORE_TRADING: # 在分钟回测获取日线数据, 应该推前一天 dt = env.data_proxy.get_previous_trading_date(env.calendar_dt.date()) bars = env.data_proxy.fast_history(self._instrument.order_book_id, intervals, frequency, ['close', 'volume'], dt) sum = bars['volume'].sum() if sum == 0: # 全部停牌 return 0 return np.dot(bars['close'], bars['volume']) / sum
def _history_bars(self, order_book_id, bar_count, freq, dt): if self.fetch_data_by_api and ExecutionContext.phase() in ( EXECUTION_PHASE.BEFORE_TRADING, EXECUTION_PHASE.ON_BAR, EXECUTION_PHASE.ON_TICK, EXECUTION_PHASE.AFTER_TRADING, EXECUTION_PHASE.SCHEDULED): bars = history_bars(order_book_id, bar_count, freq, fields=None) else: bars = self.rqalpha_env.data_proxy.history_bars( order_book_id, bar_count, freq, field=[ "datetime", "open", "high", "low", "close", "volume" ], dt=dt) return bars
def history_bars( order_book_id, bar_count, frequency, fields=None, skip_suspended=True, include_now=False, adjust_type="pre", ): # type:(str, int, str, Optional[Union[str, List[str]]], Optional[bool], Optional[bool], Optional[str]) -> np.ndarray """ 获取指定合约的历史 k 线行情,同时支持日以及分钟历史数据。不能在init中调用。 日回测获取分钟历史数据:不支持 日回测获取日历史数据 ========================= =================================================== 调用时间 返回数据 ========================= =================================================== T日before_trading T-1日day bar T日handle_bar T日day bar ========================= =================================================== 分钟回测获取日历史数据 ========================= =================================================== 调用时间 返回数据 ========================= =================================================== T日before_trading T-1日day bar T日handle_bar T-1日day bar ========================= =================================================== 分钟回测获取分钟历史数据 ========================= =================================================== 调用时间 返回数据 ========================= =================================================== T日before_trading T-1日最后一个minute bar T日handle_bar T日当前minute bar ========================= =================================================== :param order_book_id: 合约代码 :param bar_count: 获取的历史数据数量,必填项 :param frequency: 获取数据什么样的频率进行。'1d'或'1m'分别表示每日和每分钟,必填项 :param fields: 返回数据字段。必填项。见下方列表。 :param skip_suspended: 是否跳过停牌数据 :param include_now: 是否包含当前数据 :param adjust_type: 复权类型,默认为前复权 pre;可选 pre, none, post ========================= =================================================== fields 字段名 ========================= =================================================== datetime 时间戳 open 开盘价 high 最高价 low 最低价 close 收盘价 volume 成交量 total_turnover 成交额 open_interest 持仓量(期货专用) basis_spread 期现差(股指期货专用) settlement 结算价(期货日线专用) prev_settlement 结算价(期货日线专用) ========================= =================================================== :example: 获取最近5天的日线收盘价序列(策略当前日期为20160706): .. code-block:: python3 :linenos: [In] logger.info(history_bars('000002.XSHE', 5, '1d', 'close')) [Out] [ 8.69 8.7 8.71 8.81 8.81] """ order_book_id = assure_order_book_id(order_book_id) env = Environment.get_instance() dt = env.calendar_dt if frequency[-1] not in {"m", "d"}: raise RQInvalidArgument("invalid frequency {}".format(frequency)) if frequency[-1] == "m" and env.config.base.frequency == "1d": raise RQInvalidArgument("can not get minute history in day back test") if frequency[-1] == "d" and frequency != "1d": raise RQInvalidArgument("invalid frequency") if adjust_type not in {"pre", "post", "none"}: raise RuntimeError("invalid adjust_type") if frequency == "1d": sys_frequency = Environment.get_instance().config.base.frequency if ( sys_frequency in ["1m", "tick"] and not include_now and ExecutionContext.phase() != EXECUTION_PHASE.AFTER_TRADING ) or (ExecutionContext.phase() in (EXECUTION_PHASE.BEFORE_TRADING, EXECUTION_PHASE.OPEN_AUCTION)): dt = env.data_proxy.get_previous_trading_date(env.trading_dt.date()) # 当 EXECUTION_PHASE.BEFORE_TRADING 的时候,强制 include_now 为 False include_now = False if sys_frequency == "1d": # 日回测不支持 include_now include_now = False if fields is None: fields = ["datetime", "open", "high", "low", "close", "volume"] return env.data_proxy.history_bars( order_book_id, bar_count, frequency, fields, dt, skip_suspended=skip_suspended, include_now=include_now, adjust_type=adjust_type, adjust_orig=env.trading_dt, )
def _get_bar(self, order_book_id): if ExecutionContext.phase() == EXECUTION_PHASE.OPEN_AUCTION: return self._env.data_proxy.get_open_auction_bar(order_book_id, self._env.calendar_dt) return self._env.get_bar(order_book_id)