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

qmt 如何读取包含股票代码和数量的 txt 或 csv 文件进行批量下单?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt 篮子交易:利用 load_stk_vol_list 从本地文件导入代码及指定股数

Question: qmt 如何读取包含股票代码和数量的 txt 或 csv 文件进行批量下单?

解决方案

QMT 篮子交易:利用 load_stk_vol_list 从本地文件导入代码及指定股数

在量化交易和组合管理中,投资者经常需要根据外部生成的股票篮子文件(如 txt 或 csv)进行一键批量下单。QMT 提供了便捷的内置函数 ContextInfo.load_stk_vol_list(),可快速解析包含合约代码与对应数量的本地文件。


1. 接口介绍:ContextInfo.load_stk_vol_list()

用法

ContextInfo.load_stk_vol_list(filePath, fileName)

功能

读取指定路径下的文本文件,解析一篮子证券编码及对应的数量。

文件格式规范

  • txt 文件格式600000.SH,100,600004.SH,200,600000.SH100600004.SH200
    • 注意:数据需成对存在(合约代码,数量),且最后一个数量字段后必须带分隔符
  • csv 文件格式600000.SH,100,600004.SH,200,

2. 核心代码示例与实现

以下是一个完整的 QMT 策略示例。策略在 init 中设置账户与订阅股票,在 handlebar 中通过 load_stk_vol_list 读取本地篮子文件并使用 passorder 进行批量下单。

#coding:gbk
import os

def init(ContextInfo):
    # 设定交易账号
    ContextInfo.account = '6000000248'
    ContextInfo.set_account(ContextInfo.account)
    
    # 定义文件路径与文件名
    ContextInfo.file_path = 'D:/data/'
    ContextInfo.file_name = 'basket.txt'
    
    # 设置只在最后一根Bar触发下单标志
    ContextInfo.has_ordered = False

def handlebar(ContextInfo):
    # 仅在最后一根 Bar(实时最新Tick驱动)且未执行过下单时执行
    if not ContextInfo.is_last_bar() or ContextInfo.has_ordered:
        return
    
    # 1. 读取本地篮子文件中的代码与数量
    # 返回格式通常为代码与数量依次排列的列表或拼接字符串
    stk_vol_data = ContextInfo.load_stk_vol_list(ContextInfo.file_path, ContextInfo.file_name)
    print("解析到的篮子文件数据:", stk_vol_data)
    
    # 假设文件内容为: 600000.SH,100,000001.SZ,200,
    # 如果返回的是解析后的列表或分隔字符串,可进行提取
    if isinstance(stk_vol_data, str):
        raw_list = [x.strip() for x in stk_vol_data.split(',') if x.strip()]
    else:
        raw_list = stk_vol_data
        
    # 2. 配对解析股票代码和数量
    basket_dict = {}
    for i in range(0, len(raw_list), 2):
        if i + 1 < len(raw_list):
            code = raw_list[i]
            vol = int(raw_list[i+1])
            basket_dict[code] = vol
            
    print("解析后的下单字典:", basket_dict)
    
    # 3. 循环遍历字典并批量下单 (以股票买入为例)
    for code, vol in basket_dict.items():
        # opType: 23-股票买入
        # orderType: 1101-单股单账号股数下单
        # prType: 5-最新价
        passorder(
            23, 
            1101, 
            ContextInfo.account, 
            code, 
            5, 
            -1, 
            vol, 
            'BasketTrade', 
            1, 
            'basket_order', 
            ContextInfo
        )
        print(f"成功发送下单任务: {code}, 数量: {vol}")
        
    ContextInfo.has_ordered = True

3. 注意事项

  1. 分隔符结尾:准备 txtcsv 文件时,请务必确保末尾包含逗号 ,,否则最后一个字段可能无法被正确解析。
  2. 代码格式:股票代码需带市场后缀,如 600000.SH000001.SZ
  3. 下单触发控制:盘中实盘交易时,建议配合 ContextInfo.is_last_bar() 以及标志位控制,防止策略在历史 Bar 上重复触发下单。
  4. 权限与路径:确保 QMT 进程对目标文件目录(如 D:/data/)拥有读取权限。