🚀 AI 一键生成 qmt 策略代码

QMT/qmtmini 获取新股新债申购信息的正确方法与代码示例

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

qmtmini问题

qmtmini 获取当日的新股或者新债申购信息的代码有?在 QMT 可以,在 qmtmini 里面不行。df=xtdata.get_ipo_info("20250728","20250730") 这样写报错

解决方案

在 QMT 及其相关环境(如 qmtmini)中,获取新股新债申购信息报错,通常是因为使用了错误的函数名或传入了不支持的参数(例如尝试传入日期范围 "20250728","20250730")。

根据 QMT 官方 API 文档,获取当日新股新债信息的正确内置函数是 get_ipo_data(),该函数不需要传入日期范围,它默认返回当天的申购数据。

正确的 API 用法:get_ipo_data([type])

释义: 获取当日新股新债信息,返回结果为一个字典,包括新股申购代码、申购名称、最大申购数量、最小申购数量等数据。

参数:

  • type:为空时返回新股新债信息;
  • type="STOCK":只返回新股申购信息;
  • type="BOND":只返回新债申购信息。

基础代码示例

在 QMT 的策略代码中,你应该这样调用:

def init(ContextInfo):
    # 1. 获取所有新股新债信息
    ipoData = get_ipo_data() 
    print("新股新债信息:", ipoData)
    
    # 2. 仅获取新股信息
    ipoStock = get_ipo_data("STOCK") 
    print("新股信息:", ipoStock)
    
    # 3. 仅获取新债申购信息
    ipoCB = get_ipo_data("BOND") 
    print("新债信息:", ipoCB)

进阶:结合额度查询实现自动打新

如果你希望在获取到新股信息后进行自动化申购,还需要配合 get_new_purchase_limit(accid) 函数来获取账户的新股申购额度。以下是官方提供的一个完整的自动打新逻辑框架:

import datetime

class IpoCBD(object):
    is_run = False
    ipo_msg = ''
    start_ipo_time = '1008' # 设置申请新股的时间:10点08分
    task_id = 'IPO'

IPO = IpoCBD()

def init(ContextInfo):
    # 设置你的普通资金账号和信用资金账号
    ContextInfo.accID = '你的普通账号'
    ContextInfo.accIDCredit = '你的信用账号'

def handlebar(ContextInfo):
    # 1. 判断执行时间
    now_time = datetime.datetime.now().strftime('%H%M')
    if now_time < IPO.start_ipo_time or now_time > '1500' or IPO.is_run:
        return

    # 2. 获取新股相关信息
    ipo_stock = get_ipo_data("STOCK")
    print('当日新股', ipo_stock)
    
    # 获取账户限额
    limit_info = get_new_purchase_limit(ContextInfo.accID)
    print('账户限额', limit_info)
    
    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:]
        if market not in limit_info:
            continue
        # 取最大申购量和账户额度的较小值
        stock_vol[stock] = min(stock_vol[stock], limit_info[market])
        
    for stock in stock_vol:
        if not stock_vol[stock] > 0:
            continue
        # 执行申购下单 (23代表股票买入,1101代表单股单账号普通下单,11代表指定价)
        passorder(23, 1101, ContextInfo.accID, stock, 11, stock_price[stock], stock_vol[stock], '新股申购', 2, stock, ContextInfo)
        print(f"新股申购:{stock} {stock_vol[stock]}股")

    # 3. 获取并申购可转债
    ipo_bond = get_ipo_data("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:
        passorder(23, 1101, ContextInfo.accID, bond, 11, bond_price[bond], bond_vol[bond], '新债申购', 2, bond, ContextInfo)
        print(f"新债申购 {bond} {bond_vol[bond]}张")

    IPO.is_run = True

总结:
不要使用 xtdata.get_ipo_info("日期", "日期") 这种带日期范围的写法,QMT 策略环境内请直接使用 get_ipo_data() 获取当日数据。如果是独立运行的 xtquant 脚本,请确保你调用的接口名称与官方文档一致,且通常打新接口只支持查询当天的发行数据。