通知设置 新通知
QMT文件读写限制绕过
QMT • 李魔佛 发表了文章 • 0 个评论 • 9 次浏览 • 2026-10-20 19:33
某金券商的大QMT将在10月23日对文件读写和网络连接进行限制。
而其QMT测试客户端在10月13日已经开始限制了。
简单测试了一下:
报错日子一看,FileIO已经没有权限写入。写入文件路径为 "D:\github\input.csv"
不过只要我把目录路径改成相对路径:"input.csv" , 数据是可以被写入且读取的。
这个路径是QMT安装目录下的子目录bin.x64,比如我的是: D:\tool\gjzq_qmt_simulation\bin.x64
这样就轻松绕过读写限制了。
其实上面的绝对路径的读取文件也是没有任何问题的,只是无法写入而已。
需要写入的话就使用相对路径。
网络的话,测试端使用requests请求一切正常,并没有限制。所以传递数据的时候使用API传给QMT访问是没有问题的。
QMT本地持久化
如果不想使用本地来存储,QMT系统提供了
save_py_key(key, value) 和 get_py_key(key)
两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。QMT系统提供了 save_py_key(key, value) 和 get_py_key(key) 两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。
函数说明:
save_py_key(key, value):保存数据
key :要保存的关键字, str 类型
value :要保存的值, str 类型
返回: errid (错误id,0表示成功), errmsg (错误信息,成功时为空字符串)
示例: errid, errmsg = save_py_key('关键字', '值')
get_py_key(key):读取数据
key :要读取的关键字, str 类型
返回: value (返回的值, str 类型), errid , errmsg
示例: value, errid, errmsg = get_py_key('关键字')
注意事项:
单字段长度限制为5000字符(英文1个字符,中文2个字符)。
该功能适用于在QMT系统对文件读写和网络连接进行限制后,替代本地文件存储中间变量的方案。
附测试使用代码:
# encoding:gbk
import json
def server_kv_store():
key = 'positions'
v = [{'symbol': '123456.SZ','base_pirce':100},{'symbol': '123457.SZ','base_pirce':200}]
kv = { key: json.dumps(v)}
# 保存键值对
print('保存数据',kv)
errid, errmsg = save_py_key(key, kv[key])
if errid != 0:
print("Failed to save key-value: ", errmsg)
return
print('保存成功,读取数据')
value, errid, errmsg = get_py_key(key)
if errid!=0:
print("Failed to get key-value: ", errmsg)
return
jvalue = json.loads(value)
print('读取数据', jvalue)
def init(ContextInfo):
# read_io()
# network_io()
server_kv_store()
def handlebar(ContextInfo):
pass
在测试客户端上测试通过。
value的参数类型是str,所以dict,list这些类型需要json.dump序列化一下,不然会报错。
不同券商遇到的问题不同,到时QMT实盘客户端也可能有不同的限制,可评论留言。
关注公众号: 查看全部
而其QMT测试客户端在10月13日已经开始限制了。
简单测试了一下:
报错日子一看,FileIO已经没有权限写入。写入文件路径为 "D:\github\input.csv"
不过只要我把目录路径改成相对路径:"input.csv" , 数据是可以被写入且读取的。
这个路径是QMT安装目录下的子目录bin.x64,比如我的是: D:\tool\gjzq_qmt_simulation\bin.x64
这样就轻松绕过读写限制了。
其实上面的绝对路径的读取文件也是没有任何问题的,只是无法写入而已。
需要写入的话就使用相对路径。
网络的话,测试端使用requests请求一切正常,并没有限制。所以传递数据的时候使用API传给QMT访问是没有问题的。
QMT本地持久化
如果不想使用本地来存储,QMT系统提供了
save_py_key(key, value) 和 get_py_key(key)
两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。QMT系统提供了 save_py_key(key, value) 和 get_py_key(key) 两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。
函数说明:
save_py_key(key, value):保存数据
key :要保存的关键字, str 类型
value :要保存的值, str 类型
返回: errid (错误id,0表示成功), errmsg (错误信息,成功时为空字符串)
示例: errid, errmsg = save_py_key('关键字', '值')
get_py_key(key):读取数据
key :要读取的关键字, str 类型
返回: value (返回的值, str 类型), errid , errmsg
示例: value, errid, errmsg = get_py_key('关键字')
注意事项:
单字段长度限制为5000字符(英文1个字符,中文2个字符)。
该功能适用于在QMT系统对文件读写和网络连接进行限制后,替代本地文件存储中间变量的方案。
附测试使用代码:
# encoding:gbk
import json
def server_kv_store():
key = 'positions'
v = [{'symbol': '123456.SZ','base_pirce':100},{'symbol': '123457.SZ','base_pirce':200}]
kv = { key: json.dumps(v)}
# 保存键值对
print('保存数据',kv)
errid, errmsg = save_py_key(key, kv[key])
if errid != 0:
print("Failed to save key-value: ", errmsg)
return
print('保存成功,读取数据')
value, errid, errmsg = get_py_key(key)
if errid!=0:
print("Failed to get key-value: ", errmsg)
return
jvalue = json.loads(value)
print('读取数据', jvalue)
def init(ContextInfo):
# read_io()
# network_io()
server_kv_store()
def handlebar(ContextInfo):
pass
在测试客户端上测试通过。
value的参数类型是str,所以dict,list这些类型需要json.dump序列化一下,不然会报错。
不同券商遇到的问题不同,到时QMT实盘客户端也可能有不同的限制,可评论留言。
关注公众号: 查看全部
某金券商的大QMT将在10月23日对文件读写和网络连接进行限制。
而其QMT测试客户端在10月13日已经开始限制了。
简单测试了一下:
报错日子一看,FileIO已经没有权限写入。写入文件路径为 "D:\github\input.csv"
不过只要我把目录路径改成相对路径:"input.csv" , 数据是可以被写入且读取的。
这个路径是QMT安装目录下的子目录bin.x64,比如我的是: D:\tool\gjzq_qmt_simulation\bin.x64
这样就轻松绕过读写限制了。
其实上面的绝对路径的读取文件也是没有任何问题的,只是无法写入而已。
需要写入的话就使用相对路径。
网络的话,测试端使用requests请求一切正常,并没有限制。所以传递数据的时候使用API传给QMT访问是没有问题的。
QMT本地持久化
如果不想使用本地来存储,QMT系统提供了
save_py_key(key, value) 和 get_py_key(key)
两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。
附测试使用代码:
在测试客户端上测试通过。
value的参数类型是str,所以dict,list这些类型需要json.dump序列化一下,不然会报错。
不同券商遇到的问题不同,到时QMT实盘客户端也可能有不同的限制,可评论留言。
关注公众号:
而其QMT测试客户端在10月13日已经开始限制了。
简单测试了一下:
报错日子一看,FileIO已经没有权限写入。写入文件路径为 "D:\github\input.csv"
不过只要我把目录路径改成相对路径:"input.csv" , 数据是可以被写入且读取的。
这个路径是QMT安装目录下的子目录bin.x64,比如我的是: D:\tool\gjzq_qmt_simulation\bin.x64
这样就轻松绕过读写限制了。
其实上面的绝对路径的读取文件也是没有任何问题的,只是无法写入而已。
需要写入的话就使用相对路径。
网络的话,测试端使用requests请求一切正常,并没有限制。所以传递数据的时候使用API传给QMT访问是没有问题的。
QMT本地持久化
如果不想使用本地来存储,QMT系统提供了
save_py_key(key, value) 和 get_py_key(key)
两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。
QMT系统提供了 save_py_key(key, value) 和 get_py_key(key) 两个函数,用于将策略运行过程中的中间变量持久化存储到券商服务端数据库中,数据是加密保存的。
函数说明:
save_py_key(key, value):保存数据
key :要保存的关键字, str 类型
value :要保存的值, str 类型
返回: errid (错误id,0表示成功), errmsg (错误信息,成功时为空字符串)
示例: errid, errmsg = save_py_key('关键字', '值')
get_py_key(key):读取数据
key :要读取的关键字, str 类型
返回: value (返回的值, str 类型), errid , errmsg
示例: value, errid, errmsg = get_py_key('关键字')
注意事项:
单字段长度限制为5000字符(英文1个字符,中文2个字符)。
该功能适用于在QMT系统对文件读写和网络连接进行限制后,替代本地文件存储中间变量的方案。
附测试使用代码:
# encoding:gbk
import json
def server_kv_store():
key = 'positions'
v = [{'symbol': '123456.SZ','base_pirce':100},{'symbol': '123457.SZ','base_pirce':200}]
kv = { key: json.dumps(v)}
# 保存键值对
print('保存数据',kv)
errid, errmsg = save_py_key(key, kv[key])
if errid != 0:
print("Failed to save key-value: ", errmsg)
return
print('保存成功,读取数据')
value, errid, errmsg = get_py_key(key)
if errid!=0:
print("Failed to get key-value: ", errmsg)
return
jvalue = json.loads(value)
print('读取数据', jvalue)
def init(ContextInfo):
# read_io()
# network_io()
server_kv_store()
def handlebar(ContextInfo):
pass
在测试客户端上测试通过。
value的参数类型是str,所以dict,list这些类型需要json.dump序列化一下,不然会报错。
不同券商遇到的问题不同,到时QMT实盘客户端也可能有不同的限制,可评论留言。
关注公众号:




