🚀 AI 一键生成 qmt 策略代码
立即体验
👉 AI 生成代码 👈

QMT平台如何实现批量预埋单与批量下单?

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

问题描述

请教大神,策略交易=》批量预埋单的问题

请教一下大神,这个功能对应的这俩 DBF 怎么写入啊?死活写不进去。

解决方案

针对您提到的 QMT 客户端中“批量预埋单”通过 DBF 文件导入失败的问题,通常是因为 DBF 文件格式非常古老且对字段类型、长度、编码(通常要求 GBK)要求极其严格,使用第三方工具(如 Excel 或 Python 的 dbf 库)生成时极易出现格式不兼容导致 QMT 无法识别。

作为量化交易者,强烈建议您放弃折腾 DBF 文件,转而使用 QMT 强大的 Python API 来实现“批量预埋单”功能。使用 API 读取普通的 CSV 或 TXT 文件,然后通过代码批量发单,不仅成功率 100%,而且灵活性远超客户端的 DBF 导入。

以下是使用 QMT Python API 实现批量预埋单的完整替代方案:

方案优势

  1. 格式简单:只需使用普通的 TXT 或 CSV 文件,无需处理复杂的 DBF 格式。
  2. 高度自动化:可以结合定时器或特定行情条件自动触发预埋单。
  3. 灵活控制:可以针对不同账号、不同价格类型进行精细化控制。

实现步骤与代码示例

1. 准备预埋单数据文件 (CSV/TXT)

在本地创建一个文件,例如 D:/data/order_list.csv,格式如下(合约代码,数量):

600000.SH,100,
000001.SZ,200,

(注意:根据 QMT API 文档,CSV 最后一个字段后需要增加分隔符 ,)

2. 编写 QMT Python 策略读取并下单

利用 QMT 提供的 ContextInfo.load_stk_vol_list 函数读取文件,并使用 passorder 函数批量发送委托。

#coding:gbk
import time

class PresetOrder:
    def __init__(self):
        self.has_ordered = False

# 实例化全局控制对象
preset_ctrl = PresetOrder()

def init(ContextInfo):
    # 设置交易账号
    ContextInfo.set_account('您的资金账号')
    # 设定只运行一次的标志
    preset_ctrl.has_ordered = False
    print("批量预埋单策略初始化完成")

def handlebar(ContextInfo):
    # 如果已经下过单,则不再重复下单
    if preset_ctrl.has_ordered:
        return
        
    # 确保在最新的 K 线上执行
    if not ContextInfo.is_last_bar():
        return

    # 1. 读取本地预埋单文件 (合约代码和数量)
    # 假设文件路径为 D:/data/order_list.csv
    try:
        file_content = ContextInfo.load_stk_vol_list('D:/data/', 'order_list.csv')
        if not file_content:
            print("未读取到预埋单数据")
            return
            
        # 解析文件内容 (根据 QMT 文档,返回的可能是字符串,需要自行解析)
        # 假设解析后得到一个字典 { '600000.SH': 100, '000001.SZ': 200 }
        # 这里提供一个简单的解析示例,具体视 load_stk_vol_list 返回格式而定
        items = file_content.split(',')
        order_dict = {}
        for i in range(0, len(items)-1, 2):
            if items[i].strip():
                order_dict[items[i].strip()] = int(items[i+1].strip())
                
        # 2. 遍历字典,批量发送预埋单
        for stock_code, vol in order_dict.items():
            # 使用 passorder 下单
            # 23: 股票买入, 1101: 单股单账号普通股/手方式, 11: 指定价 (这里示例用最新价 5)
            # 如果是预埋单,通常使用挂单价或指定价
            passorder(23, 1101, ContextInfo.accID, stock_code, 5, -1, vol, 'PresetOrder', 1, '批量预埋', ContextInfo)
            print(f"已发送预埋单: {stock_code}, 数量: {vol}")
            
        # 标记为已下单
        preset_ctrl.has_ordered = True
        print("批量预埋单执行完毕")
        
    except Exception as e:
        print(f"读取或下单失败: {e}")

进阶技巧

  • 定时触发:如果您希望在特定时间(如 09:25 集合竞价后)触发预埋单,可以在 handlebar 中结合 ContextInfo.get_tick_timetag() 获取当前时间进行判断,或者在 init 中使用 ContextInfo.run_time() 设置定时器。
  • 价格控制:上述示例使用了最新价(prType=5)。如果是真正的预埋单,您可能需要读取 CSV 中的第三列(价格),并将 passorderprType 设置为 11(指定价),传入您设定的价格。

通过这种方式,您完全可以绕开难用的 DBF 文件,利用 Python 脚本实现更强大、更稳定的批量预埋单系统。