3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade量化交易平台中,使用 order_market 函数进行市价委托时,market_type 参数决定了具体的市价单类型。
“对手方最优价格” (market_type=0) 和 “本方最优价格” (market_type=2) 是两种截然不同的报价策略,主要区别在于成交的紧迫性和成交价格的优劣。
以下是详细的对比分析、使用场景建议及代码示例。
| 特性 | 对手方最优价格 (Type 0) | 本方最优价格 (Type 2) |
|---|---|---|
| 报价逻辑 | 吃单 (Taker) | 挂单 (Maker) |
| 买入时价格 | 以当前的 卖一价 (Ask 1) 申报 | 以当前的 买一价 (Bid 1) 申报 |
| 卖出时价格 | 以当前的 买一价 (Bid 1) 申报 | 以当前的 卖一价 (Ask 1) 申报 |
| 成交速度 | 极快。通常能立即成交(只要对手盘有量)。 | 较慢。需要等待对手盘主动来“吃”你的单子。 |
| 成交概率 | 高。 | 低。如果行情向不利方向快速移动,可能无法成交。 |
| 交易成本 | 较高。需要支付买卖价差(Spread)。 | 较低。可以赚取或节省买卖价差。 |
| 未成交部分 | 通常转为该价格的限价单。 | 转为该价格的限价单,在队列中排队。 |
以下代码展示了如何在 handle_data 或交易函数中调用这两种市价单。
def initialize(context):
# 设置股票池,以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取当前持仓
position = get_position(g.security)
# ---------------------------------------------------
# 场景 A: 紧急买入,使用【对手方最优价格】(market_type=0)
# ---------------------------------------------------
# 假设策略判断当前是极佳买点,必须立即成交
# market_type=0: 也就是以卖一价买入,大概率立即成交
order_market(g.security, 100, market_type=0)
log.info("已使用对手方最优价格买入 100 股")
# ---------------------------------------------------
# 场景 B: 被动卖出,使用【本方最优价格】(market_type=2)
# ---------------------------------------------------
# 假设策略想止盈,但不着急,想卖个好价钱(卖一价),不想直接砸盘(砸给买一)
# market_type=2: 也就是挂在卖一价上排队
if position.amount >= 100:
order_market(g.security, -100, market_type=2)
log.info("已使用本方最优价格挂单卖出 100 股")
在实盘交易中,对手方最优价格 (Type 0) 是最常用的市价单类型,因为它最符合“市价单”的直觉定义(即时成交)。除非你的策略专门针对微观结构或做市逻辑,否则建议谨慎使用本方最优价格,以免因无法成交而错过行情。
Q: 如果使用“对手方最优价格”买入,但卖一量的挂单很少,不够我买怎么办?
A: 这种情况下,撮合系统会先吃掉卖一的所有挂单。剩余未成交的部分,通常会转为限价单,价格锁定在刚才的卖一价上,等待新的卖单出现。它不会自动向上去吃卖二、卖三的价格(除非使用“五档即时成交剩余撤销”等其他类型)。
Q: PTrade回测中支持这两种市价单的区别吗?
A: 在分钟级别回测中,由于缺乏Tick级别的盘口数据,回测引擎通常会简化处理(例如都按当前分钟的收盘价或开盘价成交)。这两种类型的显著差异主要体现在实盘交易或Tick级别回测中。
Q: 科创板和创业板支持这些市价单类型吗?
A: 支持。根据PTrade文档,上证科创板支持 market_type 0, 1, 2, 4;深证股票(含创业板)支持 0, 2, 3, 4, 5。因此 0 和 2 是通用的。注意科创板使用市价单时,通常建议(或强制)设置 limit_price 作为保护限价。