背景
我是用国金证券的迷你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的"历史包袱"。作为交易者,没必要和它硬刚,最好的策略是:
- 文件路径全英文
- 中文输出重定向到文件
- 关键字符串做编码转换
这三个方法让我再没因为编码问题卡过壳。
本文基于国金迷你QMT 2024版实测,不同券商版本可能有差异。