问题描述
解决方案
科创板市价委托 limit_price 参数说明
在 PTrade 交易系统中,在科创板(股票代码 688 开头)使用市价委托(order_market)时,limit_price 参数是必须的。
1. 原因说明
- 交易所规则:根据上海证券交易所科创板交易特别规定,科创板股票在进行市价申报时,必须包含保护限价(Protection Limit Price)。
- 买入时:保护限价是投资者能接受的最高买入价。
- 卖出时:保护限价是投资者能接受的最低卖出价。
- PTrade API 机制:虽然
order_market函数的limit_price参数默认值为None,但对于科创板股票,如果不传入该参数,委托将会失败(通常表现为废单或直接报错),因为系统无法向柜台提交没有保护限价的科创板市价单。
2. 参数要求
在调用 order_market 函数交易科创板股票时:
- security:科创板股票代码(如
'688001.SS')。 - amount:数量。
- market_type:市价委托类型(科创板支持 0, 1, 2, 4)。
- limit_price:必填。需传入一个具体的浮点数(float),作为保护限价。
3. 代码示例
以下代码展示了如何在科创板进行市价买入,并计算保护限价(例如以卖一价上浮 2% 作为保护限价):
def initialize(context):
# 设置科创板股票
g.security = '688001.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取当前行情快照
snapshot = get_snapshot(g.security)
if snapshot:
# 获取卖一价(作为参考基准)
# 注意:实际策略中应根据具体需求选择基准价格(如最新价、卖五价等)
current_ask_price = snapshot[g.security]['offer_grp'][1][0]
# 如果获取到的价格有效
if current_ask_price > 0:
# 设定保护限价:例如在卖一价基础上上浮 2%
# 注意:科创板有2%的价格笼子限制,保护限价不应超过基准价的102%
protect_price = current_ask_price * 1.02
# 对价格进行修约,保留2位小数(科创板价格最小变动单位为0.01)
protect_price = round(protect_price, 2)
# 下单:市价买入 200 股
# market_type=4 代表 "最优五档即时成交剩余撤销"
# limit_price 必须传入
order_market(g.security, 200, market_type=4, limit_price=protect_price)
log.info("科创板市价委托已发送,保护限价: %s" % protect_price)
4. 注意事项
- 价格笼子:科创板在连续竞价阶段有“价格笼子”机制(通常为基准价格的 $\pm 2%$)。如果设置的
limit_price超出有效申报范围,可能会导致废单。 - 非科创板股票:对于主板股票(如 600xxx, 000xxx),使用
order_market时通常不需要传入limit_price(传入了也可能被忽略,视券商柜台实现而定),但科创板必须传入。 - 创业板:创业板注册制后的股票在市价委托时同样需要保护限价,逻辑与科创板类似。
Q&A
Q: 如果我在科创板市价委托时不填 limit_price 会发生什么?
A: 委托会失败。PTrade 系统或柜台会校验该参数,对于科创板代码,缺少保护限价将被视为无效申报,状态通常会变为“废单”或直接抛出异常。
Q: limit_price 的值应该如何设置?
A: limit_price 应根据您的策略对滑点的容忍度来设置。
- 买入保护价 = 预期成交价 * (1 + 允许的最大滑点比例)。
- 卖出保护价 = 预期成交价 * (1 - 允许的最大滑点比例)。
同时需注意不要超过交易所规定的涨跌停价格范围和有效申报价格范围(价格笼子)。
Q: order_market 支持哪些市价委托类型?
A:
- 上证科创板支持:0 (对手方最优), 1 (最优五档即时成交剩余转限价), 2 (本方最优), 4 (最优五档即时成交剩余撤销)。
- **深证(含创业板)**支持:0, 2, 3, 4, 5。
- 上证主板支持:1, 4。