跳转到正文

订单样式、管理与成交对象 ​

从 localquant.apis 导入函数、MarketOrder/LimitOrder 和所需枚举。提交接口分别见股票基金下单与期货下单。本页定义它们共用的价格参数、订单管理及结果对象。

订单管理函数 get_open_orders 与 cancel_order 可在盘前、竞价、handle_bar、盘后及 scheduler 中调用,不能在 init 调用。

价格与样式 ​

摘要:构造订单样式对象,本身不提交订单。

python
MarketOrder()
LimitOrder(limit_price)
参数类型 / 默认说明
limit_priceint | float,必填,仅LimitOrder正的有限值,单位是标的原始价格

下单接口共用以下价格参数:

参数类型 / 默认说明
price_or_styleint | float | MarketOrder | LimitOrder | None,默认 NoneNone/MarketOrder() 为市价单;数值或 LimitOrder(price) 为限价单
pricefloat | None,默认 None另一种传限价的参数位置;日常调用使用 price_or_style
styleMarketOrder | 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_idint订单标识
order_book_idstr实际交易代码;系列订单使用真实月合约代码
datetime / trading_datetimedatetime.datetime创建订单的自然时间 / 交易日加钟表时间
series可选 str期货系列归属;没有此属性时用 getattr(order, "series", None)
quantity / filled_quantity / unfilled_quantity数值,表示整数数量委托量 / 已成交 / 未成交;股票股、基金份、期货手
avg_pricefloat已成交部分均价,尚未成交为 0
pricefloat限价;市价单为 0,不表示成交价格
frozen_pricefloat订单冻结资金使用的参考价格
transaction_costfloat本订单已发生成交的累计交易费用,元
sideSIDEBUY / SELL
position_effectPOSITION_EFFECTOPEN / CLOSE / CLOSE_TODAY 等开平动作
position_directionPOSITION_DIRECTIONLONG / SHORT 持仓方向
type / styleORDER_TYPE / 样式对象MARKET 或 LIMIT / MarketOrder 或 LimitOrder
statusORDER_STATUSPENDING_NEW、ACTIVE、FILLED、PENDING_CANCEL、CANCELLED、REJECTED
messagestr取消/拒绝等原因,无消息时为空字符串
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_idint成交标识
order_idint | None关联订单;系统成交可能没有
order_book_idstr实际交易代码
datetime / trading_datetimedatetime.datetime自然成交时间 / 交易日加钟表时间;夜盘排序用前者
last_quantity数值,表示整数数量本笔成交量,股/份/手
last_pricefloat本笔成交的原始价格
commission / tax / transaction_costfloat本笔佣金 / 税 / 总费用,元
side / position_effect / position_direction对应枚举买卖、开平、持仓方向
close_today_amountint本笔平今数量
instrumentInstrument实际成交合约,乘数读取 instrument.contract_multiplier
series / trade_source可选 str系列归属 / 系统成交来源;读取可选属性使用 getattr

普通成交可能没有 trade_source 属性;保存表将其记为 strategy。系统移仓为 roll、到期清仓为 expiry;其他公司行为使用对应来源。event.order 可能为 None,不能假定每笔系统成交都来自策略订单。

localquant documentation