外观
订单样式、管理与成交对象
从 localquant.apis 导入函数、MarketOrder/LimitOrder 和所需枚举。提交接口分别见股票基金下单与期货下单。本页定义它们共用的价格参数、订单管理及结果对象。
订单管理函数 get_open_orders 与 cancel_order 可在盘前、竞价、handle_bar、盘后及 scheduler 中调用,不能在 init 调用。
价格与样式
摘要:构造订单样式对象,本身不提交订单。
python
MarketOrder()
LimitOrder(limit_price)| 参数 | 类型 / 默认 | 说明 |
|---|---|---|
limit_price | int | float,必填,仅LimitOrder | 正的有限值,单位是标的原始价格 |
下单接口共用以下价格参数:
| 参数 | 类型 / 默认 | 说明 |
|---|---|---|
price_or_style | int | float | MarketOrder | LimitOrder | None,默认 None | None/MarketOrder() 为市价单;数值或 LimitOrder(price) 为限价单 |
price | float | None,默认 None | 另一种传限价的参数位置;日常调用使用 price_or_style |
style | MarketOrder | LimitOrder | None,默认 None | 另一种传样式的参数位置;日常调用使用 price_or_style |
返回:MarketOrder | LimitOrder — 对应的订单样式对象。
注意:
- 限价是成交约束,不是指定最终成交价。
- 仅设置一种价格参数,不混传。使用 price/style 时部分接口会发出弃用提示。参数表保留它们是为了说明准确的位置顺序;本指南示例统一使用 price_or_style。目标市值/权重接口另支持
(买入样式, 卖出样式),见目标调仓。 - 价格使用不复权行情,不能用后复权信号价作为委托限价。支持市价与限价,不支持 TWAPOrder/VWAPOrder;
matching_type="vwap"是另一种 bar 撮合价格模型。滑点、成交价与容量见撮合。
get_open_orders
摘要:查询当前未结束的普通订单。
python
get_open_orders()返回:list[Order] — 包含当前未结束的普通订单;没有则为 []。
注意:
- 返回列表是本次查询的集合,其中的 Order 对象会随后续成交更新。
- 没有标的筛选参数;按
o.order_book_id筛选真实代码,按getattr(o, "series", None)筛选期货系列。
cancel_order
摘要:取消剩余委托,不撤销已发生成交。
python
cancel_order(order)order 必须是本轮回测创建的 Order 对象,不接受订单编号。
返回:Order — 传入的订单对象。
注意:已经结束或撤单未通过校验时状态不一定改变,应读取返回对象。
python
from localquant.apis import cancel_order, get_open_orders
# 放在允许交易的回调内,撤销当前所有活动订单。
for pending in get_open_orders():
cancel_order(pending)Order 对象
用于读取订单状态,不由策略直接构造或修改其状态。下单后返回的是可更新对象;若要保留当时快照,复制需要的字段值。
| 字段 / 方法 | 类型 | 说明 |
|---|---|---|
order_id | int | 订单标识 |
order_book_id | str | 实际交易代码;系列订单使用真实月合约代码 |
datetime / trading_datetime | datetime.datetime | 创建订单的自然时间 / 交易日加钟表时间 |
series | 可选 str | 期货系列归属;没有此属性时用 getattr(order, "series", None) |
quantity / filled_quantity / unfilled_quantity | 数值,表示整数数量 | 委托量 / 已成交 / 未成交;股票股、基金份、期货手 |
avg_price | float | 已成交部分均价,尚未成交为 0 |
price | float | 限价;市价单为 0,不表示成交价格 |
frozen_price | float | 订单冻结资金使用的参考价格 |
transaction_cost | float | 本订单已发生成交的累计交易费用,元 |
side | SIDE | BUY / SELL |
position_effect | POSITION_EFFECT | OPEN / CLOSE / CLOSE_TODAY 等开平动作 |
position_direction | POSITION_DIRECTION | LONG / SHORT 持仓方向 |
type / style | ORDER_TYPE / 样式对象 | MARKET 或 LIMIT / MarketOrder 或 LimitOrder |
status | ORDER_STATUS | PENDING_NEW、ACTIVE、FILLED、PENDING_CANCEL、CANCELLED、REJECTED |
message | str | 取消/拒绝等原因,无消息时为空字符串 |
is_active() | bool | 当前是否 ACTIVE |
is_final() | bool | 是否 FILLED、CANCELLED 或 REJECTED |
运行中的方向与状态用枚举比较,如 order.status == ORDER_STATUS.FILLED;字符串标签通过 .value 取得。
订单状态与有效期
判断单个 Order 是否有成交可用 order is not None and order.filled_quantity > 0,不能只认 FILLED。账户、持仓和订单状态在同步成交的下单函数返回前已更新。
普通 BAR 撮合中,在其他条件满足时:
| 情况 | 市价单 | 限价单 |
|---|---|---|
| 滑点后价格不满足委托限价 | 不适用 | 保持活动,等待后续撮合 |
| 基价涨停买入或跌停卖出,已开启价格限制 | 拒绝 | 保持活动 |
| 成交量额度不足,已开启容量限制 | 可部分成交,取消剩余数量;无额度时全部取消 | 可部分成交,剩余数量保持活动 |
| 有效报价但 bar 成交量为零,已开启 inactive_limit | 取消 | 取消 |
这些条件按撮合顺序判断;例如成交基价尚不满足委托限价时,不会继续检查零成交量。缺少有效报价时通常等待,不保证市价单立即结束;上市首日无有效报价会拒绝。资金不足另按资金约束处理。
竞价普通订单同步尝试开盘价成交;current_bar/vwap 在盘中同步尝试,next_bar 等待后续行情。同一竞价阶段内重复撮合仍使用开盘价,阶段结束后的余单才进入普通 BAR 队列。每个 BAR 先撮合已有订单,再调用 handle_bar,进入回调才撤单无法阻止这次撮合。盘后未完成订单被拒绝,不自动带到下一交易日。
只允许开盘成交时,每笔竞价订单返回后立即撤销活动余量,再处理下一笔。策略的买卖意图是否跨日重试是策略规则,不能等同于订单存活;重试数量按实际持仓与剩余目标确定,已有活动单时避免重复提交。
Trade 对象
通过 subscribe_event(EVENT.TRADE, handler) 订阅实际成交,在 handler(context, event) 中读取 event.trade。注册仅限 init,完整签名与回调见成交事件。
Trade 表示一笔已发生成交;一张订单可能对应多笔 Trade。以下为运行对象的只读字段,保存后的表结构见成交记录。
| 字段 | 类型 | 说明 |
|---|---|---|
exec_id | int | 成交标识 |
order_id | int | None | 关联订单;系统成交可能没有 |
order_book_id | str | 实际交易代码 |
datetime / trading_datetime | datetime.datetime | 自然成交时间 / 交易日加钟表时间;夜盘排序用前者 |
last_quantity | 数值,表示整数数量 | 本笔成交量,股/份/手 |
last_price | float | 本笔成交的原始价格 |
commission / tax / transaction_cost | float | 本笔佣金 / 税 / 总费用,元 |
side / position_effect / position_direction | 对应枚举 | 买卖、开平、持仓方向 |
close_today_amount | int | 本笔平今数量 |
instrument | Instrument | 实际成交合约,乘数读取 instrument.contract_multiplier |
series / trade_source | 可选 str | 系列归属 / 系统成交来源;读取可选属性使用 getattr |
普通成交可能没有 trade_source 属性;保存表将其记为 strategy。系统移仓为 roll、到期清仓为 expiry;其他公司行为使用对应来源。event.order 可能为 None,不能假定每笔系统成交都来自策略订单。