问题描述
解决方案
在PTrade中,如果您希望在收盘后以收盘价买入股票(通常指科创板和创业板的盘后固定价格交易),可以使用 after_trading_order 函数。
核心逻辑
- 交易时间:盘后固定价格交易时间通常为 15:05 至 15:30。因此,我们需要使用
run_daily将交易函数安排在 15:00 之后执行(例如 15:15)。 - 获取收盘价:在 15:00 收盘后,通过
get_snapshot获取当天的最新价(即收盘价)。 - 下单接口:使用
after_trading_order(security, amount, entrust_price)进行委托。注意,价格必须严格等于收盘价,否则委托无效。
策略代码实现
以下是一个完整的策略示例,展示了如何在盘后阶段以收盘价买入指定股票。
def initialize(context):
"""
初始化函数
"""
# 设置要操作的股票,这里以一只科创板股票为例
# 注意:盘后固定价格交易主要适用于科创板(688)和创业板(300)
g.security = '688001.SS'
set_universe(g.security)
# 设置定时任务,在交易日的 15:15 执行盘后交易逻辑
# 盘后固定价格交易时段一般为 15:05-15:30
run_daily(context, after_hours_trade, time='15:15')
def after_hours_trade(context):
"""
盘后交易执行函数
"""
stock = g.security
# 获取实时行情快照
# 注意:get_snapshot 仅在交易模块可用,回测模式下可能不支持或行为不同
snapshot = get_snapshot(stock)
if snapshot and stock in snapshot:
# 获取最新价,在15:00之后,last_px 即为当日收盘价
close_price = snapshot[stock].get('last_px')
# 确保价格有效
if close_price and close_price > 0:
# 打印日志
log.info("当前股票 %s 收盘价为: %s,准备进行盘后固定价申报" % (stock, close_price))
# 下单买入 200 股
# 参数说明:股票代码,数量(正数买入),委托价格(必须是收盘价)
order_id = after_trading_order(stock, 200, float(close_price))
if order_id:
log.info("盘后委托成功,订单ID: %s" % order_id)
else:
log.info("盘后委托失败")
else:
log.info("获取收盘价失败或价格无效")
else:
log.info("获取行情快照失败")
def handle_data(context, data):
"""
盘中运行函数,此处留空,因为我们只在盘后操作
"""
pass
关键点说明
- 适用范围:
after_trading_order主要用于科创板和创业板的盘后固定价格交易。- 主板股票通常没有这种机制(除非是大宗交易,但大宗交易API不同)。
- 价格精度:
- 传入的
entrust_price必须是浮点数(float),且必须等于当天的收盘价。
- 传入的
- 运行环境:
- 此功能主要用于实盘或仿真交易环境。
- 在回测模式下,
get_snapshot可能无法获取数据(回测通常使用data[security]['close']),且盘后撮合逻辑取决于回测引擎的配置。
- 撤单:
- 如果需要撤销盘后固定价委托,请使用
after_trading_cancel_order函数。
- 如果需要撤销盘后固定价委托,请使用
Q&A
Q: 为什么我在回测中调用 get_snapshot 报错或返回空?
A: get_snapshot 是获取实时L1/L2行情的接口,通常仅在**交易(实盘/仿真)**模块可用。在回测中,您应该使用 data[security]['close'] 或 get_history 来获取价格数据。
Q: 主板股票(600xxx, 000xxx)可以使用这个策略吗?
A: 通常不可以。沪深主板目前没有像科创板/创业板那样的“盘后固定价格交易”时段(15:05-15:30)。主板在15:00收盘后即停止竞价交易。如果您需要在收盘时成交,建议在 14:57 左右使用 order_target 或 order 配合市价单或限价单参与尾盘集合竞价。
Q: after_trading_order 的成交原则是什么?
A: 盘后固定价格交易遵循“时间优先”的原则。即按照申报时间先后顺序进行撮合,成交价格固定为当日收盘价。如果当日该股票没有成交(如全天停牌)或收盘价无法确定,则无法进行盘后固定价格交易。