3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在日线及以上周期的量化交易中,QMT 默认的运行机制是将上一根 K 线生成的信号在下一个周期的第一个 tick(即早盘 9:25 集合竞价结束时)发出委托。如果投资者希望在 9:25 集合竞价数据确定后立即进行选股计算并发出下单信号,需要结合 do_order() 函数与分笔行情数据进行精准控制。
do_order(ContextInfo)?do_order 作用:若策略在 9:25 之后启动或在盘中运行,调用 do_order(ContextInfo) 可以立刻把上一根 K 线(或刚成立条件)生成的模型信号发出,解决策略必须等待下一根 K 线第一个 tick 才发信号的问题。ContextInfo.get_tick_timetag() 获取当前最新 tick 的时间戳。timetag_to_datetime() 将毫秒时间戳转换为格式化时间(如 'HHMMSS')。ContextInfo.get_full_tick() 或 get_market_data_ex() 获取早盘开盘价、集合竞价成交量等关键指标。init):设定股票池(set_universe)、绑定资金账号(set_account)。handlebar):
passorder 或 order_lots)生成信号。do_order(ContextInfo) 立即触发下单指令,抢占开盘先机。#encoding:gbk
import time
def init(ContextInfo):
# 1. 设定资金账号
ContextInfo.account = '60000001'
ContextInfo.set_account(ContextInfo.account)
# 2. 设定股票池 (以沪深300部分成分股为例)
ContextInfo.stocks = ['600000.SH', '000001.SZ', '600519.SH', '000858.SZ']
ContextInfo.set_universe(ContextInfo.stocks)
# 3. 全局标记:确保每日集合竞价只下单一次
ContextInfo.has_traded = False
print("策略初始化完成,准备进行集合竞价选股...")
def handlebar(ContextInfo):
# 仅在最后一根 Bar (实时行情) 运行逻辑
if not ContextInfo.is_last_bar():
return
# 获取最新 tick 时间戳
timetag = ContextInfo.get_tick_timetag()
time_str = timetag_to_datetime(timetag, '%H%M%S')
int_time = int(time_str)
# 重置每日交易标记(跨日逻辑)
if int_time < 91500:
ContextInfo.has_traded = False
return
# 设定集合竞价触发时间段:09:25:00 至 09:25:59 且未触发过交易
if 92500 <= int_time < 92600 and not ContextInfo.has_traded:
print(f"当前时间 {int_time},进入集合竞价选股逻辑...")
# 获取股票池最新全量 tick 数据
full_ticks = ContextInfo.get_full_tick(ContextInfo.stocks)
selected_stocks = []
for stock in ContextInfo.stocks:
if stock in full_ticks:
tick = full_ticks[stock]
open_price = tick.get('open', 0)
last_close = tick.get('lastClose', 0)
volume = tick.get('volume', 0)
if last_close > 0 and open_price > 0:
# 计算集合竞价涨跌幅
pct_chg = (open_price - last_close) / last_close * 100
# 选股条件:开盘高开 2% 至 5% 之间
if 2.0 <= pct_chg <= 5.0:
selected_stocks.append(stock)
print(f"[选中标的] {stock} 开盘价:{open_price}, 昨收:{last_close}, 集合竞价涨幅:{pct_chg:.2f}%")
# 执行买入委托
for stock in selected_stocks:
# 使用对手价或最新价买入 1000 股
# passorder 参数: (opType=23 股票买入, orderType=1101 单股单账号股数下单, account, code, prType=5 最新价, price=0, volume=1000)
passorder(23, 1101, ContextInfo.account, stock, 5, 0, 1000, '集合竞价选股', 1, stock, ContextInfo)
print(f"[发送委托] {stock} 买入 1000 股")
# 立即触发当前生成的委托信号
if selected_stocks:
do_order(ContextInfo)
print("do_order 已调用,委托信号已即时推送!")
# 标记今日已完成交易,防止重复下单
ContextInfo.has_traded = True
do_order() 会立刻补发上一周期的下单信号。必须在代码中加入时间与 has_traded 状态变量双重校验,防止重复操作。passorder,也可将 quickTrade 参数设置为 1(立即下单),这样在最后一根 Bar 信号成立时便会立即下单,无需等待 Bar 走完。