QMT/iQuant居然禁止redis获取股票行情数据,如何破解

QMT李魔佛 发表了文章 • 0 个评论 • 384 次浏览 • 2024-09-10 11:26 • 来自相关话题

QMT禁止redis获取股票行情数据,如何破解

因为QMT没有转债的规模,而国信iquant本身又把requests 库给封禁了,它无法通过requests 获取任何外部数据,比如访问东财,tushare都会提示访问超时。(后面发现它修改了requests的源码)

于是发现iquant的redis是内置库,不需要pip安装,所以第一时间就想到使用redis获取转债数据。

简单测试了一下,redis是可以获取数据的。比如随便丢一个字符到redis,然后QMT可以获取到这个字符数据

于是就把原来的策略里,使用requests 调用API的部分,改成redis。

可是运行后发现报错:







2024-09-10 10:05:19,851 [INFO] [0x00000e24] [msg service] msg: 0C:\iquant\python\新建策略文件.py_SH00030021

DataError:Sensitive Data Detected, Forbidden!

报错信息说的很明显,敏感信息检测到,禁止!

居然对redis的数据进行检验,很明显这部分是QMT对redis的源码进行了修改。

于是根据报错的提示,找到 目录:

D:\tool\gjzq_qmt_simulation\bin.x64\Lib\site-packages\redis,下面的client.py

找到对应的行:








的确有一个check_response 的函数用于检测 redis的内容,看正则表达式和变量命名(search_stock),类似股票代码的数据传输被阻止了,检测到之后直接raise Error,程序会停止的。

解决办法,也很简单,直接把这一段 代码删除就好了。

然后需要重启你的QMT,不然修改的代码不会生效。

然后重新运行的你的策略,发现一起正常了。
 
需要开通QMT和代写量化策略,可以关注公众号: 查看全部
QMT禁止redis获取股票行情数据,如何破解

因为QMT没有转债的规模,而国信iquant本身又把requests 库给封禁了,它无法通过requests 获取任何外部数据,比如访问东财,tushare都会提示访问超时。(后面发现它修改了requests的源码)

于是发现iquant的redis是内置库,不需要pip安装,所以第一时间就想到使用redis获取转债数据。

简单测试了一下,redis是可以获取数据的。比如随便丢一个字符到redis,然后QMT可以获取到这个字符数据

于是就把原来的策略里,使用requests 调用API的部分,改成redis。

可是运行后发现报错:


微信图片_20240910103921.jpg


2024-09-10 10:05:19,851 [INFO] [0x00000e24] [msg service] msg: 0C:\iquant\python\新建策略文件.py_SH00030021

DataError:Sensitive Data Detected, Forbidden!

报错信息说的很明显,敏感信息检测到,禁止!

居然对redis的数据进行检验,很明显这部分是QMT对redis的源码进行了修改。

于是根据报错的提示,找到 目录:

D:\tool\gjzq_qmt_simulation\bin.x64\Lib\site-packages\redis,下面的client.py

找到对应的行:


微信图片_20240910103929.png



的确有一个check_response 的函数用于检测 redis的内容,看正则表达式和变量命名(search_stock),类似股票代码的数据传输被阻止了,检测到之后直接raise Error,程序会停止的。

解决办法,也很简单,直接把这一段 代码删除就好了。

然后需要重启你的QMT,不然修改的代码不会生效。

然后重新运行的你的策略,发现一起正常了。
 
需要开通QMT和代写量化策略,可以关注公众号:

QMT的handlebar设置成一分钟周期的时候,运行是3秒一次的

QMT李魔佛 发表了文章 • 0 个评论 • 245 次浏览 • 2024-09-13 11:46 • 来自相关话题

平时很少用handlebar驱动。
 
刚好有个策略是一分钟周期运行的,所以就用了handle驱动。





 
 
结果发现,经常查询重复买入。
 
调试后发现,原来这个handlebar是3m触发一次的。
 
如果要一分钟运行一次,还是用
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)
 
INTERVAL_STRING 用1分钟表示。
 
示例代码:
一分钟打印当前时间:
 # -*-coding:gbk-*-
# 作者公众号:可转债量化分析
import datetime
import json
import redis

####### 以下为固定配置,请勿随意修改 ##########
# 注意:程序需要在9:30前启动

START_TIME = '09:30' # 启动时间,可以修改为开盘任意时间9:30-14:57
STOCK_ACCOUNT = '' # 股票账户


INTERVAL_SECOND = 60 # 交易间隔
INTERVAL_STRING = "{}nSecond".format(INTERVAL_SECOND)

def today_date():
return datetime.datetime.now().strftime('%Y%m%d')


def init(ContextInfo):
now = datetime.datetime.now()
print('策略初始化 {}'.format(now))
now = datetime.datetime.now()
running_time = '{} {}'.format(today_date(), START_TIME)
print('策略初始化 {} , 程序启动时间 {}'.format(now, START_TIME))
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)



def handlebar(ContextInfo):
pass

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
now = datetime.datetime.now()
print(now)


公众号: 查看全部
平时很少用handlebar驱动。
 
刚好有个策略是一分钟周期运行的,所以就用了handle驱动。

20240913113955.png

 
 
结果发现,经常查询重复买入。
 
调试后发现,原来这个handlebar是3m触发一次的。
 
如果要一分钟运行一次,还是用
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)
 
INTERVAL_STRING 用1分钟表示。
 
示例代码:
一分钟打印当前时间:
 
# -*-coding:gbk-*-
# 作者公众号:可转债量化分析
import datetime
import json
import redis

####### 以下为固定配置,请勿随意修改 ##########
# 注意:程序需要在9:30前启动

START_TIME = '09:30' # 启动时间,可以修改为开盘任意时间9:30-14:57
STOCK_ACCOUNT = '' # 股票账户


INTERVAL_SECOND = 60 # 交易间隔
INTERVAL_STRING = "{}nSecond".format(INTERVAL_SECOND)

def today_date():
return datetime.datetime.now().strftime('%Y%m%d')


def init(ContextInfo):
now = datetime.datetime.now()
print('策略初始化 {}'.format(now))
now = datetime.datetime.now()
running_time = '{} {}'.format(today_date(), START_TIME)
print('策略初始化 {} , 程序启动时间 {}'.format(now, START_TIME))
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)



def handlebar(ContextInfo):
pass

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
now = datetime.datetime.now()
print(now)


公众号:

Ptrade回测模式下获取实时的分钟数据:只能使用handle_data,数据不能用get_snapshot

Ptrade李魔佛 发表了文章 • 0 个评论 • 211 次浏览 • 2024-09-21 17:32 • 来自相关话题

好久没有使用Ptrade做分钟级别的回测了。
发现有点蛋疼,记录一下。
 
因为回测模式下,不能使用run_interval 函数;
 
而run_daily模式,只能在固定时间运行,无法分钟级别。
 
所以只能使用 handle_data
而在handle_data 里面获取当前的分钟价格数据,也无法使用 get_snapshot ,get_gear_price,函数。
 
所以只能使用handle_data(Context,data) 里面的data里。
 
而handle_data 里面的data数据,使用方法如下:

 

import datetime

target_list = [
'600000.SS',
'000333.SZ'
]

def execution(context, data):
now = context.current_dt.strftime('%H:%M')
for code in target_list:
tick_info = data[code]
price = tick_info['price']
print('now: {} code : {} price:{}'.format(now,code ,price))




# 标准
def initialize(context):
log.info("公众号:可转债量化分析 ---- start ----")


def handle_data(context, data):
execution(context, data)

 

获取数据结果:2024-09-20 14:42:00 - INFO - now: 14:42 code : 000333.SZ price:66.22
2024-09-20 14:43:00 - INFO - now: 14:43 code : 000333.SZ price:66.26
2024-09-20 14:44:00 - INFO - now: 14:44 code : 000333.SZ price:66.19
2024-09-20 14:45:00 - INFO - now: 14:45 code : 000333.SZ price:66.2
2024-09-20 14:46:00 - INFO - now: 14:46 code : 000333.SZ price:66.19
2024-09-20 14:47:00 - INFO - now: 14:47 code : 000333.SZ price:66.18
2024-09-20 14:48:00 - INFO - now: 14:48 code : 000333.SZ price:66.14
2024-09-20 14:49:00 - INFO - now: 14:49 code : 000333.SZ price:66.25
2024-09-20 14:50:00 - INFO - now: 14:50 code : 000333.SZ price:66.19
2024-09-20 14:51:00 - INFO - now: 14:51 code : 000333.SZ price:66.18
2024-09-20 14:52:00 - INFO - now: 14:52 code : 000333.SZ price:66.19
2024-09-20 14:53:00 - INFO - now: 14:53 code : 000333.SZ price:66.2
2024-09-20 14:54:00 - INFO - now: 14:54 code : 000333.SZ price:66.19
2024-09-20 14:55:00 - INFO - now: 14:55 code : 000333.SZ price:66.25
2024-09-20 14:56:00 - INFO - now: 14:56 code : 000333.SZ price:66.27
2024-09-20 14:57:00 - INFO - now: 14:57 code : 000333.SZ price:66.28
2024-09-20 14:58:00 - INFO - now: 14:58 code : 000333.SZ price:66.28
2024-09-20 14:59:00 - INFO - now: 14:59 code : 000333.SZ price:66.28
2024-09-20 15:00:00 - INFO - now: 15:00 code : 000333.SZ price:66.06
 用同花顺,对了一下结果,是满足的了。
 

  查看全部
好久没有使用Ptrade做分钟级别的回测了。
发现有点蛋疼,记录一下。
 
因为回测模式下,不能使用run_interval 函数;
 
而run_daily模式,只能在固定时间运行,无法分钟级别。
 
所以只能使用 handle_data
而在handle_data 里面获取当前的分钟价格数据,也无法使用 get_snapshot ,get_gear_price,函数。
 
所以只能使用handle_data(Context,data) 里面的data里。
 
而handle_data 里面的data数据,使用方法如下:

 


import datetime

target_list = [
'600000.SS',
'000333.SZ'
]

def execution(context, data):
now = context.current_dt.strftime('%H:%M')
for code in target_list:
tick_info = data[code]
price = tick_info['price']
print('now: {} code : {} price:{}'.format(now,code ,price))




# 标准
def initialize(context):
log.info("公众号:可转债量化分析 ---- start ----")


def handle_data(context, data):
execution(context, data)

 

获取数据结果:
2024-09-20 14:42:00 - INFO - now: 14:42 code : 000333.SZ price:66.22
2024-09-20 14:43:00 - INFO - now: 14:43 code : 000333.SZ price:66.26
2024-09-20 14:44:00 - INFO - now: 14:44 code : 000333.SZ price:66.19
2024-09-20 14:45:00 - INFO - now: 14:45 code : 000333.SZ price:66.2
2024-09-20 14:46:00 - INFO - now: 14:46 code : 000333.SZ price:66.19
2024-09-20 14:47:00 - INFO - now: 14:47 code : 000333.SZ price:66.18
2024-09-20 14:48:00 - INFO - now: 14:48 code : 000333.SZ price:66.14
2024-09-20 14:49:00 - INFO - now: 14:49 code : 000333.SZ price:66.25
2024-09-20 14:50:00 - INFO - now: 14:50 code : 000333.SZ price:66.19
2024-09-20 14:51:00 - INFO - now: 14:51 code : 000333.SZ price:66.18
2024-09-20 14:52:00 - INFO - now: 14:52 code : 000333.SZ price:66.19
2024-09-20 14:53:00 - INFO - now: 14:53 code : 000333.SZ price:66.2
2024-09-20 14:54:00 - INFO - now: 14:54 code : 000333.SZ price:66.19
2024-09-20 14:55:00 - INFO - now: 14:55 code : 000333.SZ price:66.25
2024-09-20 14:56:00 - INFO - now: 14:56 code : 000333.SZ price:66.27
2024-09-20 14:57:00 - INFO - now: 14:57 code : 000333.SZ price:66.28
2024-09-20 14:58:00 - INFO - now: 14:58 code : 000333.SZ price:66.28
2024-09-20 14:59:00 - INFO - now: 14:59 code : 000333.SZ price:66.28
2024-09-20 15:00:00 - INFO - now: 15:00 code : 000333.SZ price:66.06

 用同花顺,对了一下结果,是满足的了。
 

 

QMT获取不到行情,一般是什么原因?或者获取行情有中断的情况

QMT李魔佛 发表了文章 • 0 个评论 • 113 次浏览 • 2024-09-29 10:27 • 来自相关话题

8-9成原因是 因为你选择的行情服务器掉线了





 
或者你获取的5档tick行情,但是你的行情菜单那里,选择的是 最新价,这样你也是无法获取到 5档tick数据的。





 
然后还有一个问题,如果你用get_market_data 或者get_market_data_ex 这个函数,获取的股票数量很多(比如全市场的股票),那么第一次的启动数据会非常的慢,并且你的内存消耗非常大,整个QMT像死机了一样。
 
如何解决? 下回分解
  查看全部
8-9成原因是 因为你选择的行情服务器掉线了

20231120204016.png

 
或者你获取的5档tick行情,但是你的行情菜单那里,选择的是 最新价,这样你也是无法获取到 5档tick数据的。

20240929102328.png

 
然后还有一个问题,如果你用get_market_data 或者get_market_data_ex 这个函数,获取的股票数量很多(比如全市场的股票),那么第一次的启动数据会非常的慢,并且你的内存消耗非常大,整个QMT像死机了一样。
 
如何解决? 下回分解
 

LOF基金出现大量套利机会,微信发送套利提示机会

李魔佛 发表了文章 • 0 个评论 • 47 次浏览 • 2024-10-05 17:54 • 来自相关话题

节前A股行情火爆,节中港股继续开市,港股行情火爆。

对于踏空的投资来说,简直比满仓套牢还难受。

虽然行情火爆,但头脑依然要保持清醒,不要看到什么热门就一股脑冲进去。

错误的方式,让你赚到了大钱,实际会后患无穷。

“有勇敢的飞行员,有年老的飞行员,但鲜有勇敢的年老飞行员"

行情爆发,大部分人连指数都追不上,所以索性直接打板指数。以至于各种指数10CM,甚至20CM。





 
实际指数的成分股并没有出现全部涨停那么夸张。

所以这时出现不少溢价的LOF基金,基金价格高于其净值。于是就出现了套利的机会。


溢价率越高,其安全垫也就越高。对于当前空仓或者轻仓的投资者而言,是一个不错的介入机会。(具体套利操作就是,场内净值申购,T+2或者T+3到账后,场内现价卖出)


这里笔者根据之前的LOF监控程序,程序自动获取限购-溢价LOF基金套利,并推送到微信消息,获取了目前溢价率大于5%的LOF基金,然后按照其成交量从大到小排序,得到下表:
 




 
成交量越大的,说明该LOF越活跃,这样就不至于在套利大军进场的时候,承接不住,被砸到跌停出不去。

目前成交量最大的是中概互联LOF164906,成交量1.9亿。成交量最少的是鼎弘LOF167003,成交量只有4万块不到,即使有14%的溢价率的肉垫,但容量太少,随便一个大户砸下来就跌停了。

所以这里也建议要介入额投资者,不仅仅只看溢价率,同时也要关注成交量。


同时也要注意申购状态那一列,积极配置FOF和原油LOF易方达 目前处于暂停申购状态,也就是当前是无法进行套利的。

而恒生LOF 是限购状态,限购5000元,因为港股假期猛涨了一波,所以大概率这个基金周二开盘会直接顶住涨停的。该基金是深市基金,可以6+1拖拉机拉满。申购7户,35000元。




结合之前的程序,LOF溢价率监控+微信推送,可以做到收盘前推送数据:








当然你用飞书,钉钉也行。如果要用微信,早期开通的api还能继续用,新开的就需要备案的服务器了,手续就麻烦一点。
 
广告时间:需要低佣免5开户的可以公众号菜单联系,支持Ptrade,QMT,miniQMT,套利拖拉机。
  查看全部
节前A股行情火爆,节中港股继续开市,港股行情火爆。

对于踏空的投资来说,简直比满仓套牢还难受。

虽然行情火爆,但头脑依然要保持清醒,不要看到什么热门就一股脑冲进去。

错误的方式,让你赚到了大钱,实际会后患无穷。

“有勇敢的飞行员,有年老的飞行员,但鲜有勇敢的年老飞行员"

行情爆发,大部分人连指数都追不上,所以索性直接打板指数。以至于各种指数10CM,甚至20CM。

Screenshot_2024_1005_171022.png

 
实际指数的成分股并没有出现全部涨停那么夸张。

所以这时出现不少溢价的LOF基金,基金价格高于其净值。于是就出现了套利的机会。


溢价率越高,其安全垫也就越高。对于当前空仓或者轻仓的投资者而言,是一个不错的介入机会。(具体套利操作就是,场内净值申购,T+2或者T+3到账后,场内现价卖出)


这里笔者根据之前的LOF监控程序,程序自动获取限购-溢价LOF基金套利,并推送到微信消息,获取了目前溢价率大于5%的LOF基金,然后按照其成交量从大到小排序,得到下表:
 
20241005170056.png

 
成交量越大的,说明该LOF越活跃,这样就不至于在套利大军进场的时候,承接不住,被砸到跌停出不去。

目前成交量最大的是中概互联LOF164906,成交量1.9亿。成交量最少的是鼎弘LOF167003,成交量只有4万块不到,即使有14%的溢价率的肉垫,但容量太少,随便一个大户砸下来就跌停了。

所以这里也建议要介入额投资者,不仅仅只看溢价率,同时也要关注成交量。


同时也要注意申购状态那一列,积极配置FOF和原油LOF易方达 目前处于暂停申购状态,也就是当前是无法进行套利的。

而恒生LOF 是限购状态,限购5000元,因为港股假期猛涨了一波,所以大概率这个基金周二开盘会直接顶住涨停的。该基金是深市基金,可以6+1拖拉机拉满。申购7户,35000元。




结合之前的程序,LOF溢价率监控+微信推送,可以做到收盘前推送数据:


Screenshot_2024_1005_173638.jpg



当然你用飞书,钉钉也行。如果要用微信,早期开通的api还能继续用,新开的就需要备案的服务器了,手续就麻烦一点。
 
广告时间:需要低佣免5开户的可以公众号菜单联系,支持Ptrade,QMT,miniQMT,套利拖拉机。