`ContextInfo` 是 QMT 内置 Python 策略运行的核心上下文对象，贯穿策略的整个生命周期。所有回调和定时任务函数都接收 `ContextInfo` 作为参数，通过该对象可获取当前运行状态、回测配置、品种信息、账户信息、K 线数据等。本页面列出 `ContextInfo` 对象的全部常用属性。

## QMT ContextInfo 运行状态属性

**【事实】** 以下属性反映策略当前的运行状态：

| 属性 | 类型 | 含义 | 示例 |
|------|------|------|------|
| `ContextInfo.do_back_test` | bool | 是否处于回测模式 | `True` / `False` |
| `ContextInfo.is_last_bar` | bool | 当前 Bar 是否为最后一根 Bar（最新 Bar） | `True` / `False` |
| `ContextInfo.barpos` | int | 当前 Bar 的位置索引（从 0 开始） | `100` |
| `ContextInfo.bar_size` | int | 当前 K 线序列的总 Bar 数量 | `5000` |
| `ContextInfo.run_time` | str | 策略的定时运行时间设置 | `'10:00:00'` |
| `ContextInfo.time_tick_size` | int | Tick 的时间间隔（毫秒） | `3000` |

**【解释】**
- `do_back_test` 为 `True` 时表示策略运行在回测环境，为 `False` 时表示运行在实盘环境（仿真或真实交易）。
- `is_last_bar` 用于在 `handlebar` 中区分回测遍历和盘中实时更新。回测中每根 Bar 都会触发 `handlebar`，但仅在最后一根 Bar 时 `is_last_bar` 为 `True`；盘中运行时每根新 Bar 完成时 `is_last_bar` 为 `True`。
- `barpos` 是当前正在处理的 Bar 在整个 K 线序列中的位置索引，可用于获取特定位置的 Bar 数据。

**【建议】** 在 `handlebar` 中使用 `ContextInfo.is_last_bar()` 方法判断是否为最新 Bar，避免在回测遍历时重复执行交易逻辑。

## QMT ContextInfo 回测配置属性

**【事实】** 以下属性仅在回测环境中有效：

| 属性 | 类型 | 含义 | 示例 |
|------|------|------|------|
| `ContextInfo.start_time` | str | 回测开始时间 | `'20240101'` |
| `ContextInfo.end_time` | str | 回测结束时间 | `'20240630'` |
| `ContextInfo.start_cash` | float | 回测初始资金 | `1000000.0` |
| `ContextInfo.commission` | float | 回测佣金费率 | `0.0003` |
| `ContextInfo.slippage` | float | 回测滑点设置 | `0.001` |
| `ContextInfo.dealvolume` | float | 回测成交量限制比例 | `0.1` |
| `ContextInfo.backtest_size` | int | 回测的 K 线数量 | `10000` |

**【解释】**
- `start_cash` 是回测开始时的初始资金，单位为元。
- `commission` 是每次交易的手续费费率，如 `0.0003` 表示万分之三。
- `slippage` 是回测中模拟的滑点，影响成交价格与委托价格的偏差。
- `dealvolume` 限制每根 Bar 的最大成交量为当日成交量的比例，如 `0.1` 表示最多成交当日成交量的 10%。

**【建议】** 回测配置属性在实盘环境中可能返回默认值或无效值，策略逻辑不应依赖这些属性在实盘中的取值。

## QMT ContextInfo 品种与周期属性

**【事实】** 以下属性反映当前策略绑定的品种和周期信息：

| 属性 | 类型 | 含义 | 示例 |
|------|------|------|------|
| `ContextInfo.stockcode` | str | 当前品种代码 | `'600000.SH'` |
| `ContextInfo.stock_code` | str | 当前品种代码（别名） | `'600000.SH'` |
| `ContextInfo.period` | str | 当前 K 线周期 | `'1d'` |
| `ContextInfo.dividend_type` | str | 复权方式 | `'front'` |
| `ContextInfo.timetag` | int | 当前 K 线的时间戳 | `20240104000000` |
| `ContextInfo.universe` | list | 策略标的池 | `['600000.SH', '000001.SZ']` |
| `ContextInfo.trade_universe` | list | 交易标的池 | `['600000.SH']` |

**【解释】**
- `stockcode` 和 `stock_code` 是同一属性的不同名称，均返回当前品种代码。
- `period` 的取值包括 `'1d'`（日线）、`'1m'`（1 分钟）、`'5m'`（5 分钟）、`'15m'`（15 分钟）、`'30m'`（30 分钟）、`'60m'`（60 分钟）等。
- `dividend_type` 的取值包括 `'none'`（不复权）、`'front'`（前复权）、`'back'`（后复权）。
- `universe` 是策略的标的池，包含所有需要监控的证券。`trade_universe` 是交易标的池，是 `universe` 的子集。

## QMT ContextInfo 账户信息属性

**【事实】** 以下属性反映策略绑定的交易账户信息：

| 属性 | 类型 | 含义 | 示例 |
|------|------|------|------|
| `ContextInfo.accountid` | str | 当前资金账号 ID | `'12345678'` |
| `ContextInfo.accountType` | str | 账户类型 | `'STOCK'` |

**【解释】**
- `accountid` 是策略绑定的资金账号，用于交易和查询。可通过在 `init` 中赋值来设置。
- `accountType` 的取值包括 `'STOCK'`（普通股票）、`'CREDIT'`（信用）、`'FUTURE'`（期货）。

**【建议】** 在 `init` 中设置 `ContextInfo.accountid`，确保策略使用正确的交易账户。

## QMT ContextInfo Tick 数据属性

**【事实】** 以下属性在 Tick 级别运行时有效：

| 属性 | 类型 | 含义 | 示例 |
|------|------|------|------|
| `ContextInfo.tick_last_body` | dict | 上一个 Tick 的数据 | `{'last_price': 10.5, ...}` |
| `ContextInfo.tick_last_volume` | int | 上一个 Tick 的成交量 | `100` |

**【解释】** 这些属性仅在 Tick 周期运行时有效，用于获取上一个 Tick 的快照数据。

## QMT ContextInfo 自定义属性

**【事实】** `ContextInfo` 对象支持动态添加自定义属性，用于在策略中存储全局状态：

```python
def init(ContextInfo):
    # 添加自定义属性
    ContextInfo.my_counter = 0
    ContextInfo.my_position = {}
    ContextInfo.my_flag = True

def handlebar(ContextInfo):
    # 读取和修改自定义属性
    ContextInfo.my_counter += 1
    print(f'已处理 {ContextInfo.my_counter} 根 Bar')
```

**【解释】** 自定义属性在整个策略生命周期内持久存在，可在不同回调函数之间共享状态。

**【建议】** 使用自定义属性时建议在 `init` 中初始化，避免在 `handlebar` 中因属性未定义而报错。

## QMT ContextInfo 常用方法一览

**【事实】** `ContextInfo` 对象的常用方法（非属性）：

| 方法 | 说明 | 详细链接 |
|------|------|----------|
| `get_market_data_ex(...)` | 获取历史 K 线数据 | [get_market_data_ex](/docs/qmt/builtin-python/api-reference/contextinfo-get-market-data-ex/) |
| `subscribe_quote(...)` | 订阅实时行情 | [subscribe_quote](/docs/qmt/builtin-python/api-reference/contextinfo-subscribe-quote/) |
| `unsubscribe_quote(...)` | 取消行情订阅 | [unsubscribe_quote](/docs/qmt/builtin-python/api-reference/contextinfo-unsubscribe-quote/) |
| `get_full_tick(...)` | 获取全推 Tick 数据 | [get_full_tick](/docs/qmt/builtin-python/api-reference/contextinfo-get-full-tick/) |
| `get_history_data(...)` | 获取历史数据序列 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `get_market_data(...)` | 获取市场数据 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `get_last_price(...)` | 获取最新价 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `get_bid_price(...)` | 获取买盘价格 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `get_ask_price(...)` | 获取卖盘价格 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `order_volume(...)` | 按数量下单 | [交易函数](/docs/qmt/builtin-python/api-reference/categories/trading-functions/) |
| `order_value(...)` | 按金额下单 | [交易函数](/docs/qmt/builtin-python/api-reference/categories/trading-functions/) |
| `order_target(...)` | 调仓到目标数量 | [交易函数](/docs/qmt/builtin-python/api-reference/categories/trading-functions/) |
| `cancel(...)` | 撤单 | [交易函数](/docs/qmt/builtin-python/api-reference/categories/trading-functions/) |
| `get_account()` | 获取账户信息 | [数据结构](/docs/qmt/builtin-python/api-reference/categories/data-structures/) |
| `get_positions()` | 获取所有持仓 | [数据结构](/docs/qmt/builtin-python/api-reference/categories/data-structures/) |
| `get_position(stock)` | 获取指定品种持仓 | [数据结构](/docs/qmt/builtin-python/api-reference/categories/data-structures/) |
| `get_orders()` | 获取当日委托 | [交易函数](/docs/qmt/builtin-python/api-reference/categories/trading-functions/) |
| `is_last_bar()` | 判断是否为最新 Bar | 本页 |
| `set_universe(stocks)` | 设置标的池 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `get_universe()` | 获取标的池 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `do_download_history_data(...)` | 下载历史数据 | [行情与数据获取](/docs/qmt/builtin-python/api/market-data/) |
| `run_time(...)` | 设置定时任务 | [run_time](/docs/qmt/builtin-python/api-reference/contextinfo-run-time/) |

## QMT ContextInfo 示例代码

### 获取运行状态信息

```python
# -*- coding: utf-8 -*-

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return

    # 打印运行状态
    print(f'是否回测: {ContextInfo.do_back_test}')
    print(f'当前 Bar 位置: {ContextInfo.barpos}')
    print(f'K 线总数: {ContextInfo.bar_size}')
    print(f'当前品种: {ContextInfo.stockcode}')
    print(f'当前周期: {ContextInfo.period}')
    print(f'复权方式: {ContextInfo.dividend_type}')
    print(f'当前账号: {ContextInfo.accountid}')

    if ContextInfo.do_back_test:
        print(f'回测开始: {ContextInfo.start_time}')
        print(f'回测结束: {ContextInfo.end_time}')
        print(f'初始资金: {ContextInfo.start_cash}')
```

### 使用自定义属性管理策略状态

```python
def init(ContextInfo):
    """初始化策略状态"""
    ContextInfo.accountid = 'YOUR_ACCOUNT_ID'
    ContextInfo.buy_count = 0          # 买入次数
    ContextInfo.sell_count = 0         # 卖出次数
    ContextInfo.last_buy_price = 0     # 上次买入价
    ContextInfo.max_position = 1000    # 最大持仓

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return

    close = ContextInfo.get_close_price()

    # 使用自定义属性控制交易逻辑
    if ContextInfo.last_buy_price > 0:
        profit_ratio = (close - ContextInfo.last_buy_price) / ContextInfo.last_buy_price
        if profit_ratio > 0.05:
            print(f'盈利 {profit_ratio:.2%}，考虑卖出')
        elif profit_ratio < -0.03:
            print(f'亏损 {profit_ratio:.2%}，考虑止损')
```

## QMT ContextInfo 注意事项

**【事实】** 使用 `ContextInfo` 属性时需注意：

| 注意项 | 说明 |
|--------|------|
| 属性版本差异 | 部分属性在不同客户端版本中命名或可用性可能不同 |
| 回测独有属性 | `start_time`、`end_time`、`start_cash` 等仅在回测环境中有效 |
| Tick 独有属性 | `tick_last_body` 等仅在 Tick 周期运行时有效 |
| 属性只读性 | 大部分属性为只读，强行修改可能导致不可预期的行为 |
| 自定义属性 | 自定义属性在策略重启后丢失，需在 `init` 中重新初始化 |

**【建议】**
1. 访问不确定是否存在的属性前，使用 `hasattr(ContextInfo, 'attr_name')` 检查
2. 回测配置属性在实盘中不可依赖，应使用 `do_back_test` 判断运行环境后分支处理
3. 自定义属性命名建议加前缀（如 `my_`），避免与内置属性冲突

## QMT ContextInfo 来源与更新时间

**【事实】** 本页面内容基于 QMT 官方文档整理。

| 项目 | 值 |
|------|-----|
| 数据来源 | QMT 官方文档 |
| 更新时间 | 2026-08-04 |
| 验证时间 | 2026-08-04 |
| 适用版本 | 以当前客户端版本为准 |
