本方案由++EasyQuant AI++++量化助手++ 提供。
问题背景
普通股票委托主要在盘中执行,而盘后固定价交易可在指定时段内提交委托。PTrade 提供 after_trading_order() 接口,可用于提交股票盘后固定价买卖委托。
实现思路
-
使用
run_daily()在盘后时段执行策略函数。 -
通过
get_snapshot()获取最新价格。 -
以最新价作为盘后固定价委托价格。
-
记录订单编号,避免重复提交。
完整代码示例
def initialize(context):
g.security = "510300.SS"
g.order_amount = 100
g.has_ordered = False
set_universe([g.security])
# 盘后指定时间运行
run_daily(place_after_market_order, time="15:15")
def place_after_market_order(context):
if g.has_ordered:
log.info("今日已提交盘后委托,不重复下单")
return
snapshot = get_snapshot(g.security)
if snapshot is None:
log.info("未获取到行情快照")
return
latest_price = snapshot[g.security].get("last_px", 0)
if latest_price <= 0:
log.info("最新价格异常,不提交委托")
return
# 正数买入;负数卖出
order_id = after_trading_order(
g.security,
g.order_amount,
float(latest_price)
)
if order_id:
g.has_ordered = True
log.info(
"盘后固定价委托已提交:代码=%s,数量=%d,价格=%.2f,订单=%s"
% (
g.security,
g.order_amount,
latest_price,
order_id
)
)
else:
log.info("盘后固定价委托提交失败")
def before_trading_start(context, data):
# 每个交易日重置标记
g.has_ordered = False
def after_trading_end(context, data):
log.info("当日策略运行结束")
如何撤销盘后委托?
def cancel_after_market_order(order_id):
after_trading_cancel_order(order_id)
log.info("已提交盘后撤单请求:%s" % order_id)
注意事项
-
after_trading_order()仅支持 PTrade 股票交易模块。 -
盘后固定价委托需要传入
entrust_price,不能省略。 -
正数数量表示买入,负数数量表示卖出。
-
委托提交成功不等于最终成交,应继续查询订单状态。
-
实际可交易时段和业务权限以券商配置为准。
总结
PTrade 盘后固定价委托适合用于盘后调仓、ETF 配置和收盘后策略执行。使用定时任务、行情校验和每日下单标记,可减少重复委托风险。