背景

我是用国金证券的迷你QMT做量化交易的。第一次安装完,兴冲冲写了个叫"沪锡趋势跟踪"的策略,保存后直接报错,提示找不到文件。折腾了2小时才发现,是编码问题

坑1:策略文件路径含中文

现象:策略名或保存路径里有中文,QMT加载时报错"文件不存在"或"非法字符"。

原因:迷你QMT底层某些接口仍使用GB2312编码,而Windows 10中文版默认是GBK(兼容GB2312),但Python 3默认是UTF-8。当路径字符串在不同编码间传递时,中文字符会被"翻译"成乱码。

解决方案

  • 策略文件名和路径全部用英文,比如 sn_trend_strategy.py 而不是 沪锡趋势跟踪.py
  • 如果必须用中文,在文件头加编码声明:
# -*- coding: gb2312 -*-

坑2:回测日志中文乱码

现象print("买入信号触发") 在QMT控制台输出为乱码或问号。

原因:QMT控制台的输出编码是GB2312,而Python默认按UTF-8编码输出。

解决方案

在策略代码开头设置标准输出编码:

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb2312')

或者更简单的做法:把中文日志写入文件,文件用UTF-8保存,然后用VS Code打开文件查看。

坑3:VS Code与QMT编码冲突

现象:在VS Code里写好的代码,复制到QMT里,中文注释变成乱码。

原因:VS Code默认UTF-8,QMT编辑器默认GB2312。

解决方案

  • VS Code右下角点击"UTF-8" → “通过编码保存” → 选择"GB2312"
  • 或者在VS Code设置里,针对 .py 文件单独设置默认编码为GB2312(不推荐,会影响其他项目)

我的最终做法

  • 代码文件本身用UTF-8保存(VS Code默认)
  • 所有字符串变量里的中文,在传入QMT接口前做编码转换:
text = "沪锡2609".encode('utf-8').decode('gb2312', errors='ignore')

总结

GB2312是迷你QMT的"历史包袱"。作为交易者,没必要和它硬刚,最好的策略是:

  1. 文件路径全英文
  2. 中文输出重定向到文件
  3. 关键字符串做编码转换

这三个方法让我再没因为编码问题卡过壳。

本文基于国金迷你QMT 2024版实测,不同券商版本可能有差异。