问题描述
解决方案
在 QMT 策略中,要以涨停价买入或跌停价卖出,最直接的方法是使用核心交易函数 passorder,并将报价类型参数 prType 设置为 12(代表涨跌停价)。
核心逻辑
- 函数:
passorder - 参数
prType:设置为12。- 当执行买入操作(
opType=23)时,prType=12会自动使用涨停价报单。 - 当执行卖出操作(
opType=24)时,prType=12会自动使用跌停价报单。
- 当执行买入操作(
- 参数
price:当prType为 12 时,具体的price数值会被忽略,通常填-1或0即可。
代码示例
以下是一个完整的策略示例,展示了如何在 handlebar 中以涨停价买入平安银行,并以跌停价卖出。
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 设置资金账号 (请替换为您真实的资金账号)
ContextInfo.accID = '6000000000'
ContextInfo.set_account(ContextInfo.accID)
print("策略初始化完成")
def handlebar(ContextInfo):
# 获取当前K线索引
index = ContextInfo.barpos
# 获取当前时间
realtime = ContextInfo.get_bar_timetag(index)
# 示例代码:仅在最后一根K线(实时行情)运行
if not ContextInfo.is_last_bar():
return
# ------------------------------------------------------------------
# 场景 1:以涨停价买入 100 股 平安银行 (000001.SZ)
# ------------------------------------------------------------------
# opType=23 (买入)
# orderType=1101 (单股单账号普通股/手下单)
# prType=12 (涨跌停价 -> 买入时即为涨停价)
# price=-1 (忽略)
# volume=100 (股数)
passorder(23, 1101, ContextInfo.accID, '000001.SZ', 12, -1, 100, ContextInfo)
print("已发出涨停价买入委托")
# ------------------------------------------------------------------
# 场景 2:以跌停价卖出 100 股 平安银行 (000001.SZ)
# ------------------------------------------------------------------
# opType=24 (卖出)
# prType=12 (涨跌停价 -> 卖出时即为跌停价)
passorder(24, 1101, ContextInfo.accID, '000001.SZ', 12, -1, 100, ContextInfo)
print("已发出跌停价卖出委托")
参数详解
在 passorder(opType, orderType, accountID, orderCode, prType, price, volume, ContextInfo) 中:
opType(操作类型):23: 股票买入24: 股票卖出
prType(报价类型):12: 涨跌停价。这是实现你需求的关键参数。- (注:虽然文档附录中有
40代表涨停价,41代表跌停价,但在passorder中通常使用12即可根据买卖方向自动匹配)。
price(价格):- 当
prType设为12时,此参数无效,填-1即可。
- 当
常见问题 Q&A
Q: 为什么使用涨停价买入?
A: 在实盘交易中,以涨停价挂单买入(或跌停价卖出)通常是为了确保成交(即“市价单”的一种模拟方式),系统会以对手方最优价格成交,未成交部分会继续挂在涨停价上。
Q: 这种方式支持回测吗?
A: 支持。在回测模式下,prType=12 会按照当根 K 线的涨跌停价格进行撮合逻辑处理。
Q: 如果我想用 order_shares 等辅助函数怎么办?
A: 辅助函数如 order_shares 的 style 参数虽然支持 'MARKET'(市价),但 QMT 的 passorder 更加底层和精确。如果你必须使用涨/跌停价,建议直接使用 passorder。如果使用辅助函数,通常无法直接指定“涨停价”这个概念,除非你手动计算价格并使用 'FIX' 模式。
Q: 如何手动计算涨跌停价并下单(不推荐,但可行)?
A: 你可以通过 get_instrumentdetail 获取昨收价,然后根据证券类型(主板10%,科创/创业20%)计算涨跌停价格,然后使用 prType=11 (指定价) 下单。但直接使用 prType=12 更安全且方便。