3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT(迅投量化交易系统)中,自动化打新(新股与可转债申购)是实现无人值守交易的重要功能。通过 QMT 提供的 Python API,我们可以轻松获取当日发行的新股新债数据、查询账户对应的申购额度,并通过交易函数下发申购指令。
get_ipo_data([type])type(可选):缺省时返回新股和新债;设置为 "STOCK" 时仅返回新股;设置为 "BOND" 时仅返回可转债。get_new_purchase_limit(accid)accid(字符串),资金账号。passorder(...)opType=23)或信用买入(opType=33)。passorder 进行委托提交,并记录执行状态,确保当日仅运行一次。import datetime
class IpoCBD(object):
def __init__(self):
self.is_run = False
self.ipo_msg = ''
self.start_ipo_time = '1008' # 设置每天 10:08 执行
IPO = IpoCBD()
def init(ContextInfo):
# 绑定资金账号,用于接收交易主推回调
ContextInfo.accID = '你的普通资金账号'
ContextInfo.accIDCredit = '你的信用资金账号'
ContextInfo.set_account(ContextInfo.accID)
def handlebar(ContextInfo):
# 仅在最后一根 K 线(最新行情)时判定
if not ContextInfo.is_last_bar():
return
run_ipo_strategy(ContextInfo)
def run_ipo_strategy(ContextInfo):
now_time = datetime.datetime.now().strftime('%H%M')
# 非交易时间或已运行过则跳过
if now_time < IPO.start_ipo_time or now_time > '1500' or IPO.is_run:
return
print("=== 开始执行自动化打新任务 ===")
# 1. 获取新股信息与额度
ipo_stock = get_ipo_data("STOCK")
limit_info = get_new_purchase_limit(ContextInfo.accID)
if ipo_stock:
stock_vol = {i: ipo_stock[i]['maxPurchaseNum'] for i in ipo_stock}
stock_price = {i: ipo_stock[i]['issuePrice'] for i in ipo_stock}
for stock in stock_vol:
market = stock[-2:] # 获取市场后缀代码 SH / SZ
if market in limit_info:
stock_vol[stock] = min(stock_vol[stock], limit_info[market])
if stock_vol[stock] > 0:
# 示例:上交所股票使用普通账号买入
passorder(23, 1101, ContextInfo.accID, stock, 11, stock_price[stock], stock_vol[stock], '自动打新', 2, stock, ContextInfo)
IPO.ipo_msg += f"新股申购成功: {stock} 数量: {stock_vol[stock]}股\n"
print(f"发送新股申购指令: {stock} {stock_vol[stock]}股")
# 2. 获取可转债信息并申购
ipo_bond = get_ipo_data("BOND")
if ipo_bond:
bond_vol = {i: ipo_bond[i]['maxPurchaseNum'] for i in ipo_bond}
bond_price = {i: ipo_bond[i]['issuePrice'] for i in ipo_bond}
for bond in bond_vol:
if bond_vol[bond] > 0:
passorder(23, 1101, ContextInfo.accID, bond, 11, bond_price[bond], bond_vol[bond], '自动打债', 2, bond, ContextInfo)
IPO.ipo_msg += f"新债申购成功: {bond} 数量: {bond_vol[bond]}张\n"
print(f"发送新债申购指令: {bond} {bond_vol[bond]}张")
IPO.is_run = True
print("打新任务执行完毕:\n" + (IPO.ipo_msg if IPO.ipo_msg else "今日无无可用申购或额度不足"))
init 函数中使用 ContextInfo.set_account() 绑定交易账号。passorder。