问题描述
若是涨停再买入 状态会变为已撤,但是未涨停就能买入 |,如图中华塑控股就是涨停 然后自动被变为已撤了,京能未涨停能直接买入
使用的是:order-id 已经正常返回
order_id = self.xt_trader.order_stock(
self.account, stock_code = xq_stock_code, order_type = xtconstant.STOCK_BUY,
order_volume = buy_vol, price = price, price_type = xtconstant.MARKET_PEER_PRICE_FIRST, strategy_name = remark,
order_remark = ''
)
order_id = self.xt_trader.order_stock(
self.account, stock_code = xq_stock_code, order_type = xtconstant.STOCK_BUY,
order_volume = buy_vol, price = price, price_type = xtconstant.MARKET_PEER_PRICE_FIRST, strategy_name = remark,
order_remark = ''
)
解决方案
问题诊断:为什么涨停时下单会被自动撤销?
您遇到的现象并非 API 的 Bug,而是交易所的订单撮合规则导致的正常现象。
在您的代码中,使用了 price_type = xtconstant.MARKET_PEER_PRICE_FIRST(对手方最优价格委托)。
根据交易所规则,对手方最优价格委托的含义是:
- 买入时:以当前盘口的卖一价作为委托价格。
- 卖出时:以当前盘口的买一价作为委托价格。
当股票涨停时,盘口上的卖单通常已经被全部吃光(即卖一价不存在或卖一量为0)。此时,如果您提交“对手方最优价格”的买单,交易所系统在盘口上找不到对手方(卖方)的价格,无法确定您的委托价,因此会直接将该笔委托作废(状态变为“已撤”或“废单”)。
而当股票未涨停时,盘口有正常的卖一价,所以订单能够正常下达并成交。
解决方案:如何正确在涨停板买入(打板排队)?
要在涨停板上买入股票,您的目的是以涨停价在买一位置排队。为了实现这一点,您需要更改 price_type(报价类型)。
以下是两种推荐的修改方案:
方案一:使用“限价单 + 涨停价”(最推荐、最稳妥)
无论股票是否涨停,直接计算出该股票的涨停价,并以**限价单(FIX_PRICE)**的方式申报。这样即使涨停,您的订单也会以涨停价加入买一的排队队列中。
# 假设您已经获取到了该股票的涨停价 limit_up_price
order_id = self.xt_trader.order_stock(
self.account,
stock_code=xq_stock_code,
order_type=xtconstant.STOCK_BUY,
order_volume=buy_vol,
price=limit_up_price, # 传入具体的涨停价格
price_type=xtconstant.FIX_PRICE, # 改为指定价/限价单
strategy_name=remark,
order_remark=''
)
方案二:使用“本方最优价格委托”
如果您不想手动计算涨停价,可以使用 MARKET_MINE_PRICE_FIRST(本方最优价格委托)。
- 买入时:以当前盘口的买一价作为委托价格。
- 涨停时,买一价就是涨停价,您的订单会以涨停价排队。
order_id = self.xt_trader.order_stock(
self.account,
stock_code=xq_stock_code,
order_type=xtconstant.STOCK_BUY,
order_volume=buy_vol,
price=price,
price_type=xtconstant.MARKET_MINE_PRICE_FIRST, # 改为本方最优价格委托
strategy_name=remark,
order_remark=''
)
注意:使用本方最优时,如果盘口瞬间剧烈波动导致买一价回落,您的委托价也会随之变为回落后的买一价,可能无法保证一定是涨停价打板。因此,严格的打板策略通常采用方案一。
总结
- MARKET_PEER_PRICE_FIRST (对手价):涨停时无卖盘 -> 找不到价格 -> 自动撤单。
- FIX_PRICE (限价) + 涨停价:直接以涨停价排队 -> 成功打板(推荐)。
- MARKET_MINE_PRICE_FIRST (本方价):涨停时以买一价(涨停价)排队 -> 成功打板。