问题描述
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 并在 Traceback 中提示 KeyboardInterrupt:策略被手动停止,通常是因为上一次回测未正常结束,导致底层的 Python 进程成为了“僵尸进程”,或者 Python 的模块加载锁(import lock)被死锁。重新覆盖安装客户端有时无法清理掉这些残留的进程和缓存文件。
以下是彻底解决该问题的步骤:
第一步:彻底结束残留的僵尸进程
当你在回测未结束时再次点击回测,QMT 会尝试发送 KeyboardInterrupt 信号中断原策略,但如果原策略正卡在某个 C 库或模块导入阶段,就会导致进程假死。
- 关闭当前的 QMT 客户端。
- 按
Ctrl + Shift + Esc打开 Windows 任务管理器。 - 切换到“详细信息”或“进程”选项卡。
- 寻找所有名为
python.exe、qmt.exe、xtquant.exe或与e海方舟相关的进程。 - 右键点击它们,选择**“结束任务”**。确保没有任何残留的后台 Python 进程。
第二步:清理 Python 编译缓存(pycache)
Python 在导入模块时会生成 .pyc 缓存文件。如果进程在导入时被强杀,缓存文件可能会损坏,导致后续启动时一直卡在 _find_and_load 和 importlib._bootstrap。
- 打开你的策略所在目录,根据你的报错信息,路径为:
E:\programs\e海方舟-量化交易版\python\。 - 在该目录下,寻找名为
__pycache__的文件夹,将其整个删除。 - 如果你的策略引用了其他自定义的
.py文件,也请一并检查并删除它们同级目录下的__pycache__文件夹。
第三步:清理 QMT 临时数据(可选)
如果上述两步仍未解决,可以尝试清理 QMT 的运行缓存:
- 进入 QMT 安装目录(
E:\programs\e海方舟-量化交易版\)。 - 找到
userdata或datadir文件夹(具体名称视券商版本而定)。 - 备份后,删除其中的
temp或log文件夹中的临时文件。
第四步:排查策略代码中的死循环
如果每次运行该特定策略(短线热点回测_20250307_02.py)都会复现此问题,请检查代码:
- 死循环:检查
init或handlebar中是否有while True:等可能导致死循环的代码,且没有适当的break或sleep。 - 海量数据加载:检查是否在
init中一次性请求了过大的历史数据(如ContextInfo.get_market_data_ex请求了全市场 tick 数据),导致内存溢出或长时间阻塞。 - 第三方库冲突:如果在策略中
import了某些需要长时间初始化的第三方库(如某些机器学习库),尽量将其放在文件顶部,避免在handlebar中重复导入。
预防建议
- 不要频繁连点回测:在 QMT 中,如果一个回测正在进行,请先点击“停止”按钮,等待日志输出“策略已停止”后,再启动新的回测。
- 使用日志调试:在代码的关键节点加上
print,观察策略到底卡在哪一行代码,从而针对性优化。