问题描述
QMT 在回测时,在调试另一个回测程序,所以又点击了回测,就发现回测程序不执行第一个回测日期了。重新覆盖安装或者重新下载 python 库都不行。现在只要启动 QMT,点击回测就报以下错误,请问怎么解决?
【2025-03-08 23:58:44.457】 0E:\programs\e 海方舟-量化交易版\python\短线热点回测_20250307_02.py_SH0003009KeyboardInterrupt:策略被手动停止
【2025-03-08 23:58:44.457】 Traceback (most recent call last):
File "", line 966, in _find_and_load
KeyboardInterrupt: 策略被手动停止
【2025-03-08 23:58:44.458】 0E:\programs\e 海方舟-量化交易版\python\短线热点回测_20250307_02.py_SH0003009KeyboardInterrupt:策略被手动停止【2025-03-08 23:58:45.019】 start back test mode
解决方案
在 QMT(如 e海方舟-量化交易版)中遇到 frozen importlib._bootstrap 和 KeyboardInterrupt:策略被手动停止 的报错,通常是因为在 Python 引擎正在导入(import)第三方库或初始化时,进程被强行中断(例如你提到在运行一个回测时又点击了另一个回测)。
由于 QMT 的 Python 环境是内嵌的,这种强行中断会导致 Python 解释器的内部导入锁(import lock)卡死,或者产生残留的僵尸进程,从而导致后续无论怎么点击回测都会直接报错。
以下是彻底解决该问题的排查与修复步骤:
1. 彻底清理残留进程(最关键)
虽然你重新安装了软件,但如果后台有残留的 Python 进程未被关闭,问题依然会存在。
- 方法一:关闭 QMT 软件,打开 Windows 任务管理器(Ctrl+Shift+Esc),在“详细信息”或“进程”中寻找所有名为
python.exe、xtquant或与 QMT 相关的后台进程,右键将其结束任务。 - 方法二(推荐):最简单粗暴的方法是直接重启电脑。重启可以彻底清空内存中卡死的 Python 导入锁和僵尸进程。
2. 清理 Python 编译缓存文件
中断导入可能会导致生成损坏的 .pyc 缓存文件。下次运行时 Python 会读取损坏的缓存,再次报错。
- 进入你的策略代码所在目录(如报错中的
E:\programs\e 海方舟-量化交易版\python\)。 - 寻找名为
__pycache__的文件夹,将其整个删除。 - 如果在该目录下看到任何以
.pyc结尾的文件,也一并删除。
3. 检查策略代码中的阻塞操作
如果重启电脑和清理缓存后,点击回测依然立刻报这个错,说明你的代码中可能存在导致 QMT 引擎超时并自动触发 KeyboardInterrupt 的逻辑:
- 死循环:检查
init(ContextInfo)或全局作用域中是否有while True:等死循环。 - 耗时过长的导入:如果在代码开头
import了非常庞大的自定义库,或者在导入时执行了耗时的网络请求/数据库读取,QMT 可能会认为策略卡死而强行发送中断信号。 - time.sleep():尽量不要在 QMT 的主线程(尤其是
init和handlebar中)使用长期的time.sleep()。
4. 彻底重置 QMT 环境
你提到“重新覆盖安装”无效,通常是因为覆盖安装不会删除用户数据和配置。
如果上述步骤都不行,请尝试彻底重置:
- 备份你的策略代码文件(
.py文件)。 - 在控制面板中正常卸载 QMT(e海方舟量化版)。
- 手动删除安装目录(如
E:\programs\e 海方舟-量化交易版\),确保里面没有任何残留文件。 - 重新下载最新版客户端并安装。
💡 预防建议
QMT 的回测引擎在处理高并发时相对脆弱。在日常使用中:
- 不要在回测未结束时频繁点击运行/回测。如果需要停止,请先点击界面上的“停止”按钮,等待日志输出“策略已停止”后,再运行下一个策略。
- 如果需要同时对比多个策略,建议使用 QMT 的批量回测功能,或者在代码逻辑中分离,而不是在界面上强行并发点击。