问题描述
实盘中,因为想上挂 2% 保证成交,所以使用 algo_passorder,我发现在 9:26 分使用 algo_passorder 函数下单,实际的单子委托是在 30 分以后才委托。但是用 passorder 可以在 9:25-9:30 之间提交委托的。如果想实现在 9:26 分上挂,应该如何处理下单函数呢,期待回复!
解决方案
为什么 algo_passorder 在 9:26 提交会延迟到 9:30?
在 QMT 平台中,algo_passorder 是算法交易下单函数。算法交易(如 TWAP、VWAP 等)通常依赖于券商服务端的算法交易引擎来进行拆单和执行。绝大多数券商的算法交易引擎默认的有效执行时间段是连续竞价阶段(9:30-11:30,13:00-14:57)。因此,如果您在 9:25-9:30 之间(即集合竞价结束到连续竞价开始前的休市/路由期间)调用 algo_passorder,算法引擎会接收该任务,但会将其挂起,直到 9:30 连续竞价开始后才正式向交易所报单。
相比之下,passorder 是普通交易下单函数,它直接将委托指令发送给柜台。在 9:25-9:30 期间,虽然交易所不撮合,但券商柜台是接受普通限价委托的(作为排队单),所以您会看到 passorder 可以立即提交委托。
如何在 9:26 实现上挂 2% 买入?
既然 algo_passorder 受到算法引擎运行时间的限制,而您的核心诉求只是**“上挂 2% 的价格以保证成交”,这其实不需要用到复杂的算法拆单。您完全可以通过在代码中手动计算上挂 2% 的价格**,然后使用 passorder 以**指定价(prType=11)**的方式进行委托。
解决方案与代码实现
您可以在 9:26 分获取当前的基准价格(例如昨日收盘价或 9:25 集合竞价产生的开盘价),将其乘以 1.02,然后通过 passorder 提交限价单。
以下是具体的 Python 代码示例:
#coding:gbk
import time
def init(ContextInfo):
# 设置交易账号
ContextInfo.set_account('您的资金账号')
# 设置股票池
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 仅在实盘/模拟的最新一根K线(或tick)上运行
if not ContextInfo.is_last_bar():
return
# 获取当前时间戳并转换为 HHMMSS 格式
tick_time = ContextInfo.get_tick_timetag()
current_time = int(time.strftime('%H%M%S', time.localtime(tick_time / 1000)))
# 判断是否在 9:26 分左右 (例如 09:26:00 - 09:26:05 之间触发一次)
if 92600 <= current_time < 92605:
stock_code = '000001.SZ'
# 获取基准价格,这里以获取最新价(9:25产生的开盘价)为例
# 如果想用昨收价,可以取 get_market_data 的 preClose 字段
market_data = ContextInfo.get_full_tick([stock_code])
if stock_code in market_data:
base_price = market_data[stock_code]['lastPrice']
# 计算上挂 2% 的价格,并保留两位小数
target_price = round(base_price * 1.02, 2)
# 检查是否超过涨停价(可选,防止废单)
limit_up_price = market_data[stock_code].get('UpStopPrice', 9999)
target_price = min(target_price, limit_up_price)
print(f"当前时间 {current_time},基准价 {base_price},上挂2%目标价 {target_price}")
# 使用 passorder 提交指定价委托
# opType=23(股票买入), orderType=1101(单股单账号普通股/手), prType=11(指定价)
# quickTrade=1 表示立即触发
passorder(23, 1101, '您的资金账号', stock_code, 11, target_price, 100, '926_Premium_Buy', 1, 'UserOrder_001', ContextInfo)
核心参数解析
prType = 11(指定价):在passorder中,当prType设置为 11 时,函数会读取您传入的price参数(即代码中的target_price)作为委托价格。quickTrade = 1:在盘中 Tick 驱动时,设置quickTrade=1可以让信号立即触发下单,而不需要等到当前 K 线走完。- 价格计算与涨停保护:直接乘以 1.02 可能会产生多位小数,需使用
round(price, 2)保留两位小数。同时建议与UpStopPrice(涨停价)做比较,防止上挂价格超过涨停价导致交易所拒单(废单)。
通过这种方式,您既避开了算法交易引擎的时间限制,又完美实现了“上挂 2% 抢筹”的交易策略。