问题描述
清仓失败,T2Connector::Receive Packet Failed[750823,不允许该委托方式. 接入用户gjzq-Ptrade(gjz9-HZYJPTRAD-ALL-0000)功能号:333104 资产账号:***]
解决方案
在 ptrade 量化交易平台中,遇到清仓报错 “不允许该委托方式”(如 T2Connector::Receive Packet Failed[750823,不允许该委托方式...]),通常是由于**使用了当前股票或券商柜台不支持的委托类型(特别是市价单类型)**导致的。
以下是导致该报错的常见原因及详细的解决方法:
1. 报错原因分析
(1) 市价单类型(market_type)与股票所属市场不匹配
如果你在清仓时使用了市价单接口(如 order_market),需要注意不同市场对市价单类型的支持是不同的。根据 ptrade API 文档:
- 上证非科创板股票:仅支持参数
1(最优五档即时成交剩余转限价)、4(最优五档即时成交剩余撤销)。 - 上证科创板股票:支持参数
0、1、2、4。 - 深证股票:支持参数
0、2、3、4、5。
如果你对上证主板股票使用了 market_type=0(对手方最优价格)或 market_type=5(全额成交或撤单),柜台就会直接拒绝并返回“不允许该委托方式”。
(2) 券商柜台限制了市价委托
部分券商的特定账户类型(如某些两融账户或特定通道)可能在接口层面禁用了市价单,要求必须使用限价单(Limit Order)进行报单。
(3) 标的类型不支持市价单
例如,可转债在 ptrade 中不支持使用 order_market 进行市价委托,必须使用限价单。
2. 解决方法
方案一:改用限价单(推荐,最稳妥)
为了避免市价单带来的各种限制和滑点风险,建议在清仓时使用限价单接口(order_target 或 order),并结合跌停价或当前盘口价格来确保成交。
示例代码:使用跌停价清仓(模拟市价卖出)
def handle_data(context, data):
security = '600570.SS'
# 获取当前持仓
position = get_position(security)
if position.amount > 0:
# 获取跌停价
snapshot = get_snapshot(security)
down_price = snapshot[security]['down_px']
# 以跌停价挂单卖出所有持仓,通常会以当前买一价及以下价格迅速成交
order_target(security, 0, limit_price=down_price)
log.info(f"以跌停价 {down_price} 挂单清仓 {security}")
方案二:修正市价单的 market_type 参数
如果你必须使用市价单,请根据股票代码的后缀(市场)动态传入正确的 market_type。
示例代码:动态判断市场并使用市价单
def handle_data(context, data):
security = '600570.SS'
position = get_position(security)
if position.amount > 0:
# 判断市场类型
if security.endswith('.SS'):
# 上证股票(假设非科创板),使用 1:最优五档即时成交剩余转限价
market_type = 1
elif security.endswith('.SZ'):
# 深证股票,使用 4:最优五档即时成交剩余撤销
market_type = 4
else:
market_type = 1
# 使用 order_market 进行市价清仓
order_market(security, -position.amount, market_type)
log.info(f"使用市价单类型 {market_type} 清仓 {security}")
3. 总结与建议
- 排查代码:检查你的清仓逻辑中是否使用了
order_market,或者在调用order/order_target时没有传入limit_price(ptrade 默认会用最新价报单,但在某些极端行情下可能被柜台拒绝)。 - 最佳实践:在量化实盘中,强烈建议使用限价单(Limit Order)。可以通过获取盘口买一价(
get_gear_price)或直接使用跌停价(down_px)作为limit_price来实现快速清仓,这样可以最大程度避免“不允许该委托方式”的柜台报错。