3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade中,选择最优的市价委托类型(market_type)需要根据交易所规则(沪市 vs 深市)以及你对成交速度与成交价格的偏好来决定。
由于沪深两市支持的市价单类型不同,没有一种单一的类型可以通用于所有股票。以下是基于PTrade API文档的详细分析和策略建议。
上海证券交易所(沪市主板/科创板)
market_type=1 (最优五档即时成交剩余转限价)深圳证券交易所(深市主板/创业板)
market_type=4 (最优五档即时成交剩余撤销)
market_type=0 (对手方最优价格)
以下代码展示了如何封装一个智能下单函数,根据股票代码自动判断市场,并选择该市场下“兼顾速度与成交率”的最优市价单类型。
def initialize(context):
# 设置股票池:包含沪市主板、科创板、深市主板
g.security = ['600570.SS', '688001.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 示例:对股票池中每只股票买入100股
for stock in g.security:
smart_market_order(context, stock, 100)
def smart_market_order(context, stock_code, amount):
"""
智能市价单函数
根据标的所属市场,选择最优的市价委托类型
"""
# 获取股票后缀以判断市场
suffix = stock_code.split('.')[-1]
# 默认市价单类型
# 0: 对手方最优 (深市保成交)
# 1: 最优五档转限价 (沪市最优解)
# 4: 最优五档即时成交剩余撤销 (深市抢速度)
target_market_type = 0
# 1. 判断市场并选择类型
if suffix == 'SS' or suffix == 'XSHG':
# 上海市场 (主板支持1,4; 科创板支持0,1,2,4)
# 选择 1: 最优五档即时成交剩余转限价
# 优点: 吃掉5档流动性,剩余部分转为限价单排队,不会被撤销
target_market_type = 1
elif suffix == 'SZ' or suffix == 'XSHE':
# 深圳市场 (支持0,2,3,4,5,不支持1)
# 权衡选择:
# 如果追求极致速度且接受部分撤单,选 4 (最优五档即时成交剩余撤销)
# 如果追求必须成交且接受稍慢,选 0 (对手方最优价格)
# 这里为了保证策略逻辑连贯(不希望订单被撤),我们演示使用 0
# 如果你的策略是高频抢单,请改为 4
target_market_type = 0
else:
log.warning("未知市场标的: %s,跳过下单" % stock_code)
return
# 2. 处理科创板/创业板的保护限价 (limit_price)
# PTrade文档指出:科创板市价委托必须设置保护限价,否则可能失败
# 这里简单演示:买入保护价为最新价的105%,卖出为95%
current_price = get_snapshot(stock_code)[stock_code]['last_px']
protect_price = 0.0
if amount > 0: # 买入
protect_price = current_price * 1.05
else: # 卖出
protect_price = current_price * 0.95
# 3. 下单
# 注意:order_market 是交易专用函数,回测中也可以使用,但逻辑会有所模拟
# 只有科创板/创业板部分券商强制要求limit_price,普通A股可不传或传0
# 为兼容性,建议对所有市价单计算一个较宽的保护价
log.info("对 %s 下市价单, 数量: %d, 类型: %d" % (stock_code, amount, target_market_type))
order_market(stock_code, amount, market_type=target_market_type, limit_price=protect_price)
根据PTrade API文档,order_market 的 market_type 参数详解如下:
| 类型值 | 名称 | 含义 | 适用场景 | 支持市场 |
|---|---|---|---|---|
| 0 | 对手方最优价格 | 以对手方(如卖一)价格申报。 | 稳健型。不吃单,价格好,但大单成交慢。 | 科创板, 深市 |
| 1 | 最优五档...转限价 | 吃掉5档,剩下的变成限价单挂着。 | 推荐(沪市)。兼顾速度和成交率,不会撤单。 | 沪市(主板/科创) |
| 2 | 本方最优价格 | 以自己方(如买一)价格申报。 | 极慢。相当于挂一个被动限价单,等待别人来吃。 | 科创板, 深市 |
| 3 | 即时成交剩余撤销 | 吃掉对手盘,吃不完的立即撤销。 | 极速。类似FOK/IOC,适合高频。 | 深市 |
| 4 | 最优五档...剩余撤销 | 吃掉5档,剩下的立即撤销。 | 推荐(深市抢单)。防止深价格滑点过大。 | 沪市, 深市 |
| 5 | 全额成交或撤单 | 要么全成,要么全撤。 | 特殊需求。适合套利,防止单腿成交。 | 深市 |
Q1: 为什么我在回测中使用 order_market 感觉和 order 没区别?
A: 在回测模式下,撮合机制是模拟的。PTrade的回测引擎通常会假设市价单以当前分钟/Tick的收盘价或开盘价成交。market_type 的细微差别(如五档撮合、转限价逻辑)主要在实盘交易中由交易所柜台执行时才会体现出显著差异。
Q2: 科创板和创业板下单失败提示“无效的价格”是怎么回事?
A: 根据交易所规定,科创板和创业板在使用市价委托时,必须指定保护限价(limit_price)。虽然是市价单,但你必须告诉交易所你能接受的最差价格(买入的上限或卖出的下限),以防止价格瞬间剧烈波动导致巨额亏损。
Q3: 如果我用 market_type=4 (剩余撤销),如何知道订单是否完全成交?
A: 你需要在下单后监听 on_order_response (委托主推) 或查询 get_orders()。如果状态变为 6 (已撤) 或 5 (部撤),说明流动性不足,未成交部分被撤销了。此时你的策略逻辑可能需要决定是否追单。
Q4: 为什么深市没有 market_type=1?
A: 这是交易所规则决定的。深圳证券交易所的交易系统不支持“转限价”这种指令,只支持“剩余撤销”或“对手方最优”。因此在深市交易时,必须在“保成交(Type 0)”和“抢速度(Type 4)”之间做选择。