Ptrade|QMT|银行股息率轮动 实盘自动化交易

李魔佛 发表了文章 • 0 个评论 • 272 次浏览 • 2024-03-05 09:33 • 来自相关话题

看有没有人需要,前排占坑 -- Task -- 
看有没有人需要,前排占坑 -- Task -- 

miniQMT安装包路径 | 下载地址

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

安装好QMT之后,在QMT的设置里面选择安装python。
 
等待几分钟,python文件下载好了之后。
 
找到qmt的安装目录,
 
进去这里面
 
\bin.x64\Lib\site-packages\xtquant
 
把这个目录复制到你的python路径的site-package 下面, 就可以在你的python环境下运行miniQMT了。
 
当然首先还是要启动你的QMT客户端,勾选极速模式。 (不开的话连不到券商服务器,这以为这无法再linux上单独跑,wine额外另说)
 
比如下面的获取行情的示例代码,还有直接下单代码
 # 用前须知

## xtdata提供和MiniQmt的交互接口,本质是和MiniQmt建立连接,由MiniQmt处理行情数据请求,再把结果回传返回到python层。使用的行情服务器以及能获取到的行情数据和MiniQmt是一致的,要检查数据或者切换连接时直接操作MiniQmt即可。

## 对于数据获取接口,使用时需要先确保MiniQmt已有所需要的数据,如果不足可以通过补充数据接口补充,再调用数据获取接口获取。

## 对于订阅接口,直接设置数据回调,数据到来时会由回调返回。订阅接收到的数据一般会保存下来,同种数据不需要再单独补充。

# 代码讲解

# 从本地python导入xtquant库,如果出现报错则说明安装失败
from xtquant import xtdata
import time

# 设定一个标的列表
code_list = ["000001.SZ"]
# 设定获取数据的周期
period = "1d"

# 下载标的行情数据
if 1:
## 为了方便用户进行数据管理,xtquant的大部分历史数据都是以压缩形式存储在本地的
## 比如行情数据,需要通过download_history_data下载,财务数据需要通过
## 所以在取历史数据之前,我们需要调用数据下载接口,将数据下载到本地
for i in code_list:
xtdata.download_history_data(i,period=period,incrementally=True) # 增量下载行情数据(开高低收,等等)到本地

xtdata.download_financial_data(code_list) # 下载财务数据到本地
xtdata.download_sector_data() # 下载板块数据到本地
# 更多数据的下载方式可以通过数据字典查询

# 读取本地历史行情数据
history_data = xtdata.get_market_data_ex(,code_list,period=period,count=-1)
print(history_data)
print("=" * 20)

# 如果需要盘中的实时行情,需要向服务器进行订阅后才能获取
# 订阅后,get_market_data函数于get_market_data_ex函数将会自动拼接本地历史行情与服务器实时行情

# 向服务器订阅数据
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1) # 设置count = -1来取到当天所有实时行情

# 等待订阅完成
time.sleep(1)

# 获取订阅后的行情
kline_data = xtdata.get_market_data_ex(,code_list,period=period)
print(kline_data)

# 获取订阅后的行情,并以固定间隔进行刷新,预期会循环打印10次
for i in range(10):
# 这边做演示,就用for来循环了,实际使用中可以用while True
kline_data = xtdata.get_market_data_ex(,code_list,period=period)
print(kline_data)
time.sleep(3) # 三秒后再次获取行情

# 如果不想用固定间隔触发,可以以用订阅后的回调来执行
# 这种模式下当订阅的callback回调函数将会异步的执行,每当订阅的标的tick发生变化更新,callback回调函数就会被调用一次
# 本地已有的数据不会触发callback

# 定义的回测函数
## 回调函数中,data是本次触发回调的数据,只有一条
def f(data):
# print(data)

code_list = list(data.keys()) # 获取到本次触发的标的代码

kline_in_callabck = xtdata.get_market_data_ex(,code_list,period = period) # 在回调中获取klines数据
print(kline_in_callabck)

for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1,callback=f) # 订阅时设定回调函数

# 使用回调时,必须要同时使用xtdata.run()来阻塞程序,否则程序运行到最后一行就直接结束退出了。
xtdata.run()





 
异步下单#coding:utf-8
import time, datetime, traceback, sys
from xtquant import xtdata
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant

#定义一个类 创建类的实例 作为状态的容器
class _a():
pass
A = _a()
A.bought_list =
A.hsa = xtdata.get_stock_list_in_sector('沪深A股')

def interact():
"""执行后进入repl模式"""
import code
code.InteractiveConsole(locals=globals()).interact()
xtdata.download_sector_data()

def f(data):
now = datetime.datetime.now()
for stock in data:
if stock not in A.hsa:
continue
cuurent_price = data[stock]['lastPrice']
pre_price = data[stock]['lastClose']
ratio = cuurent_price / pre_price - 1 if pre_price > 0 else 0
if ratio > 0.09 and stock not in A.bought_list:
print(f"{now} 最新价 买入 {stock} 200股")
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, 200, xtconstant.LATEST_PRICE, -1, 'strategy_name', stock)
A.bought_list.append(stock)

class MyXtQuantTraderCallback(XtQuantTraderCallback):
def on_disconnected(self):
"""
连接断开
:return:
"""
print(datetime.datetime.now(),'连接断开回调')

def on_stock_order(self, order):
"""
委托回报推送
:param order: XtOrder对象
:return:
"""
print(datetime.datetime.now(), '委托回调', order.order_remark)


def on_stock_trade(self, trade):
"""
成交变动推送
:param trade: XtTrade对象
:return:
"""
print(datetime.datetime.now(), '成交回调', trade.order_remark)


def on_order_error(self, order_error):
"""
委托失败推送
:param order_error:XtOrderError 对象
:return:
"""
# print("on order_error callback")
# print(order_error.order_id, order_error.error_id, order_error.error_msg)
print(f"委托报错回调 {order_error.order_remark} {order_error.error_msg}")

def on_cancel_error(self, cancel_error):
"""
撤单失败推送
:param cancel_error: XtCancelError 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)

def on_order_stock_async_response(self, response):
"""
异步下单回报推送
:param response: XtOrderResponse 对象
:return:
"""
print(f"异步委托回调 {response.order_remark}")

def on_cancel_order_stock_async_response(self, response):
"""
:param response: XtCancelOrderResponse 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)

def on_account_status(self, status):
"""
:param response: XtAccountStatus 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)


if __name__ == '__main__':
print("start")
#指定客户端所在路径
path = r'D:\qmt\sp3\迅投极速交易终端 睿智融科版\userdata_mini'
# 生成session id 整数类型 同时运行的策略不能重复
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
# 开启主动请求接口的专用线程 开启后在on_stock_xxx回调函数里调用XtQuantTrader.query_xxx函数不会卡住回调线程,但是查询和推送的数据在时序上会变得不确定
# 详见: http://docs.thinktrader.net/vip/pages/ee0e9b/#开启主动请求接口的专用线程
# xt_trader.set_relaxed_response_order_enabled(True)

# 创建资金账号为 800068 的证券账号对象
acc = StockAccount('800068', 'STOCK')
# 创建交易回调类对象,并声明接收回调
callback = MyXtQuantTraderCallback()
xt_trader.register_callback(callback)
# 启动交易线程
xt_trader.start()
# 建立交易连接,返回0表示连接成功
connect_result = xt_trader.connect()
print('建立交易连接,返回0表示连接成功', connect_result)
# 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
subscribe_result = xt_trader.subscribe(acc)
print('对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功', subscribe_result)

#这一行是注册全推回调函数 包括下单判断 安全起见处于注释状态 确认理解效果后再放开
# xtdata.subscribe_whole_quote(["SH", "SZ"], callback=f)
# 阻塞主线程退出
xt_trader.run_forever()
# 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
interact()


需要开通miniQMT(低门槛,低费率)的朋友,
可以扫码联系:或者添加 技术公众号:

 
公众号:
 

 
  查看全部
安装好QMT之后,在QMT的设置里面选择安装python。
 
等待几分钟,python文件下载好了之后。
 
找到qmt的安装目录,
 
进去这里面
 
\bin.x64\Lib\site-packages\xtquant
 
把这个目录复制到你的python路径的site-package 下面, 就可以在你的python环境下运行miniQMT了。
 
当然首先还是要启动你的QMT客户端,勾选极速模式。 (不开的话连不到券商服务器,这以为这无法再linux上单独跑,wine额外另说)
 
比如下面的获取行情的示例代码,还有直接下单代码
 
# 用前须知

## xtdata提供和MiniQmt的交互接口,本质是和MiniQmt建立连接,由MiniQmt处理行情数据请求,再把结果回传返回到python层。使用的行情服务器以及能获取到的行情数据和MiniQmt是一致的,要检查数据或者切换连接时直接操作MiniQmt即可。

## 对于数据获取接口,使用时需要先确保MiniQmt已有所需要的数据,如果不足可以通过补充数据接口补充,再调用数据获取接口获取。

## 对于订阅接口,直接设置数据回调,数据到来时会由回调返回。订阅接收到的数据一般会保存下来,同种数据不需要再单独补充。

# 代码讲解

# 从本地python导入xtquant库,如果出现报错则说明安装失败
from xtquant import xtdata
import time

# 设定一个标的列表
code_list = ["000001.SZ"]
# 设定获取数据的周期
period = "1d"

# 下载标的行情数据
if 1:
## 为了方便用户进行数据管理,xtquant的大部分历史数据都是以压缩形式存储在本地的
## 比如行情数据,需要通过download_history_data下载,财务数据需要通过
## 所以在取历史数据之前,我们需要调用数据下载接口,将数据下载到本地
for i in code_list:
xtdata.download_history_data(i,period=period,incrementally=True) # 增量下载行情数据(开高低收,等等)到本地

xtdata.download_financial_data(code_list) # 下载财务数据到本地
xtdata.download_sector_data() # 下载板块数据到本地
# 更多数据的下载方式可以通过数据字典查询

# 读取本地历史行情数据
history_data = xtdata.get_market_data_ex(,code_list,period=period,count=-1)
print(history_data)
print("=" * 20)

# 如果需要盘中的实时行情,需要向服务器进行订阅后才能获取
# 订阅后,get_market_data函数于get_market_data_ex函数将会自动拼接本地历史行情与服务器实时行情

# 向服务器订阅数据
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1) # 设置count = -1来取到当天所有实时行情

# 等待订阅完成
time.sleep(1)

# 获取订阅后的行情
kline_data = xtdata.get_market_data_ex(,code_list,period=period)
print(kline_data)

# 获取订阅后的行情,并以固定间隔进行刷新,预期会循环打印10次
for i in range(10):
# 这边做演示,就用for来循环了,实际使用中可以用while True
kline_data = xtdata.get_market_data_ex(,code_list,period=period)
print(kline_data)
time.sleep(3) # 三秒后再次获取行情

# 如果不想用固定间隔触发,可以以用订阅后的回调来执行
# 这种模式下当订阅的callback回调函数将会异步的执行,每当订阅的标的tick发生变化更新,callback回调函数就会被调用一次
# 本地已有的数据不会触发callback

# 定义的回测函数
## 回调函数中,data是本次触发回调的数据,只有一条
def f(data):
# print(data)

code_list = list(data.keys()) # 获取到本次触发的标的代码

kline_in_callabck = xtdata.get_market_data_ex(,code_list,period = period) # 在回调中获取klines数据
print(kline_in_callabck)

for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1,callback=f) # 订阅时设定回调函数

# 使用回调时,必须要同时使用xtdata.run()来阻塞程序,否则程序运行到最后一行就直接结束退出了。
xtdata.run()





 
异步下单
#coding:utf-8
import time, datetime, traceback, sys
from xtquant import xtdata
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant

#定义一个类 创建类的实例 作为状态的容器
class _a():
pass
A = _a()
A.bought_list =
A.hsa = xtdata.get_stock_list_in_sector('沪深A股')

def interact():
"""执行后进入repl模式"""
import code
code.InteractiveConsole(locals=globals()).interact()
xtdata.download_sector_data()

def f(data):
now = datetime.datetime.now()
for stock in data:
if stock not in A.hsa:
continue
cuurent_price = data[stock]['lastPrice']
pre_price = data[stock]['lastClose']
ratio = cuurent_price / pre_price - 1 if pre_price > 0 else 0
if ratio > 0.09 and stock not in A.bought_list:
print(f"{now} 最新价 买入 {stock} 200股")
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, 200, xtconstant.LATEST_PRICE, -1, 'strategy_name', stock)
A.bought_list.append(stock)

class MyXtQuantTraderCallback(XtQuantTraderCallback):
def on_disconnected(self):
"""
连接断开
:return:
"""
print(datetime.datetime.now(),'连接断开回调')

def on_stock_order(self, order):
"""
委托回报推送
:param order: XtOrder对象
:return:
"""
print(datetime.datetime.now(), '委托回调', order.order_remark)


def on_stock_trade(self, trade):
"""
成交变动推送
:param trade: XtTrade对象
:return:
"""
print(datetime.datetime.now(), '成交回调', trade.order_remark)


def on_order_error(self, order_error):
"""
委托失败推送
:param order_error:XtOrderError 对象
:return:
"""
# print("on order_error callback")
# print(order_error.order_id, order_error.error_id, order_error.error_msg)
print(f"委托报错回调 {order_error.order_remark} {order_error.error_msg}")

def on_cancel_error(self, cancel_error):
"""
撤单失败推送
:param cancel_error: XtCancelError 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)

def on_order_stock_async_response(self, response):
"""
异步下单回报推送
:param response: XtOrderResponse 对象
:return:
"""
print(f"异步委托回调 {response.order_remark}")

def on_cancel_order_stock_async_response(self, response):
"""
:param response: XtCancelOrderResponse 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)

def on_account_status(self, status):
"""
:param response: XtAccountStatus 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)


if __name__ == '__main__':
print("start")
#指定客户端所在路径
path = r'D:\qmt\sp3\迅投极速交易终端 睿智融科版\userdata_mini'
# 生成session id 整数类型 同时运行的策略不能重复
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
# 开启主动请求接口的专用线程 开启后在on_stock_xxx回调函数里调用XtQuantTrader.query_xxx函数不会卡住回调线程,但是查询和推送的数据在时序上会变得不确定
# 详见: http://docs.thinktrader.net/vip/pages/ee0e9b/#开启主动请求接口的专用线程
# xt_trader.set_relaxed_response_order_enabled(True)

# 创建资金账号为 800068 的证券账号对象
acc = StockAccount('800068', 'STOCK')
# 创建交易回调类对象,并声明接收回调
callback = MyXtQuantTraderCallback()
xt_trader.register_callback(callback)
# 启动交易线程
xt_trader.start()
# 建立交易连接,返回0表示连接成功
connect_result = xt_trader.connect()
print('建立交易连接,返回0表示连接成功', connect_result)
# 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
subscribe_result = xt_trader.subscribe(acc)
print('对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功', subscribe_result)

#这一行是注册全推回调函数 包括下单判断 安全起见处于注释状态 确认理解效果后再放开
# xtdata.subscribe_whole_quote(["SH", "SZ"], callback=f)
# 阻塞主线程退出
xt_trader.run_forever()
# 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
interact()


需要开通miniQMT(低门槛,低费率)的朋友,
可以扫码联系:或者添加 技术公众号:

 
公众号:
 

 
 

银河证券1拖7

股票李魔佛 发表了文章 • 0 个评论 • 401 次浏览 • 2024-02-23 15:16 • 来自相关话题

最近大家套利印度基金LOF如火如荼。
 
基本大家都用的银河证券或者华宝证券的1拖6,也就是一个证券账户,加挂 3个 深A,3个场内基金,6个账号可以同时申购 100元的印度基金。因为印度基金目前是限购状态,限购100元。
 
所以1拖6就可以申购600元。
 
目前每天稳定的溢价率为6-7%,一次的收益率为 6-7%,也就是30-40元一个账户一天。一周下来就有150-200元





 
 
这个看起来是个蚊子肉。
 
但如果你的证券账户足够多,比如你有10个证券账户(你女友,家人,亲戚,同事,朋友)
 
一周就有2000元。
 
所以限购套利的核心是 拖拉机+多账号
 
而很少人知道,其实可以1拖7,再多一个申购途径,就是场外申购。
 
比如支付宝,天天基金等渠道申购。不过要转入场内比较麻烦,而银河证券,华宝证券,内置了场外基金,可以很方便在券商app里面的场外基金买入(申购)。
 
步骤也很简单,





 
申购完成之后:





 
然后绑定场内和场外关系
 





 
然后要等T+2 之后,再在银河证券app里面 把印度基金从场外转到场内:





 
然后T+2之后,你的基金要继续等T+2之后才能到达你的证券账户。然后才能够在场内卖出。
 
所以通过场外转场内进行套利,要比场内支持申购,要晚2天到账的哦。
 
目前银河证券 低费率多多, 万0.854 免五,0.1元起,申购LOF基金1折,LOF卖出费率为万0.5,0.1元起。
逆回购1折。各个费率基本在同样档位里面是最低的了。
 
需要的朋友可以扫码联系开通: 查看全部
最近大家套利印度基金LOF如火如荼。
 
基本大家都用的银河证券或者华宝证券的1拖6,也就是一个证券账户,加挂 3个 深A,3个场内基金,6个账号可以同时申购 100元的印度基金。因为印度基金目前是限购状态,限购100元。
 
所以1拖6就可以申购600元。
 
目前每天稳定的溢价率为6-7%,一次的收益率为 6-7%,也就是30-40元一个账户一天。一周下来就有150-200元

微信图片_20240221114516.jpg

 
 
这个看起来是个蚊子肉。
 
但如果你的证券账户足够多,比如你有10个证券账户(你女友,家人,亲戚,同事,朋友)
 
一周就有2000元。
 
所以限购套利的核心是 拖拉机+多账号
 
而很少人知道,其实可以1拖7,再多一个申购途径,就是场外申购。
 
比如支付宝,天天基金等渠道申购。不过要转入场内比较麻烦,而银河证券,华宝证券,内置了场外基金,可以很方便在券商app里面的场外基金买入(申购)。
 
步骤也很简单,

微信图片_20240222124738.jpg

 
申购完成之后:

微信图片_20240222125035.jpg

 
然后绑定场内和场外关系
 

v2-6f50d47051bfa9b36e93b46319e3e002_1440w_副本_副本_副本.png

 
然后要等T+2 之后,再在银河证券app里面 把印度基金从场外转到场内:

微信图片_20240222124738_副本_副本.jpg

 
然后T+2之后,你的基金要继续等T+2之后才能到达你的证券账户。然后才能够在场内卖出。
 
所以通过场外转场内进行套利,要比场内支持申购,要晚2天到账的哦。
 
目前银河证券 低费率多多, 万0.854 免五,0.1元起,申购LOF基金1折,LOF卖出费率为万0.5,0.1元起。
逆回购1折。各个费率基本在同样档位里面是最低的了。
 
需要的朋友可以扫码联系开通:

QMT获取全市场股票,排除ST退市风险股票

QMT李魔佛 发表了文章 • 0 个评论 • 361 次浏览 • 2024-02-07 22:25 • 来自相关话题

因为QMT不能获取北交所的股票历史数据,所以也把北交所的股票也排除了。
 
def get_all_market_code(ContextInfo):

all_market_codes = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
return filter_ST_stock(ContextInfo, all_market_codes)


def filter_ST_stock(ContextInfo, code_list):
result = []
for code in code_list:
if re.search('(st)|(ST)|(\*st)|(\*ST)|(退)',ContextInfo.get_stock_name(code)):
print('排除 : ',ContextInfo.get_stock_name(code),code)
continue
result.append(code)
return result

global_dict = {}

def init(ContextInfo):
now = time.ctime()
print('策略初始化{}'.format(now))
need_download = 1
global_dict['start_date'] = '20231201'
global_dict['end_date'] = ''
global_dict['code_list'] = get_all_market_code(ContextInfo)

 有问题可以咨询公众号或者知识星球
提供策略代写服务
  查看全部
因为QMT不能获取北交所的股票历史数据,所以也把北交所的股票也排除了。
 
def get_all_market_code(ContextInfo):

all_market_codes = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
return filter_ST_stock(ContextInfo, all_market_codes)


def filter_ST_stock(ContextInfo, code_list):
result = []
for code in code_list:
if re.search('(st)|(ST)|(\*st)|(\*ST)|(退)',ContextInfo.get_stock_name(code)):
print('排除 : ',ContextInfo.get_stock_name(code),code)
continue
result.append(code)
return result

global_dict = {}

def init(ContextInfo):
now = time.ctime()
print('策略初始化{}'.format(now))
need_download = 1
global_dict['start_date'] = '20231201'
global_dict['end_date'] = ''
global_dict['code_list'] = get_all_market_code(ContextInfo)

 有问题可以咨询公众号或者知识星球
提供策略代写服务
 

QMT实时获取涨停股,筛选流通盘大于X的股票

QMT李魔佛 发表了文章 • 0 个评论 • 330 次浏览 • 2024-02-07 18:28 • 来自相关话题

基于官方例子修复了一下bug,比如移除了北交所的股票,因为目前qmt获取不了北交所的股票历史数据。
 
直接上代码:# coding:gbk
import time


class G():
pass


g = G()


def init(ContextInfo):
g.hsa = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
g.vol_dict = {}
for stock in g.hsa:
g.vol_dict[stock] = ContextInfo.get_last_volume(stock)
ContextInfo.run_time("execution", "1nSecond", "2019-10-14 13:20:00")


def execution(ContextInfo):
t0 = time.time()
full_tick = ContextInfo.get_full_tick(g.hsa)
total_market_value = 0
total_ratio = 0
count = 0
for stock in g.hsa:
if full_tick[stock]['lastClose'] == 0:
continue
ratio = full_tick[stock]['lastPrice'] / full_tick[stock]['lastClose'] - 1
rise_price = round(full_tick[stock]['lastClose'] * 1.2, 2) if stock[0] == '3' or stock[:3] == '688' else round(
full_tick[stock]['lastClose'] * 1.1, 2)
# 如果要打印涨停品种
if abs(full_tick[stock]['lastPrice'] - rise_price) <0.01:
print(f"涨停股票 {stock} {ContextInfo.get_stock_name(stock)}")

market_value = full_tick[stock]['lastPrice'] * g.vol_dict[stock]
total_ratio += ratio * market_value
total_market_value += market_value
count += 1
# print(count)
total_ratio /= total_market_value
total_ratio *= 100
print(f'A股加权涨幅 {round(total_ratio, 2)}% 函数运行耗时{round(time.time() - t0, 5)}秒')






 
欢迎关注公众号:
可转债量化分析 查看全部
基于官方例子修复了一下bug,比如移除了北交所的股票,因为目前qmt获取不了北交所的股票历史数据。
 
直接上代码:
# coding:gbk
import time


class G():
pass


g = G()


def init(ContextInfo):
g.hsa = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
g.vol_dict = {}
for stock in g.hsa:
g.vol_dict[stock] = ContextInfo.get_last_volume(stock)
ContextInfo.run_time("execution", "1nSecond", "2019-10-14 13:20:00")


def execution(ContextInfo):
t0 = time.time()
full_tick = ContextInfo.get_full_tick(g.hsa)
total_market_value = 0
total_ratio = 0
count = 0
for stock in g.hsa:
if full_tick[stock]['lastClose'] == 0:
continue
ratio = full_tick[stock]['lastPrice'] / full_tick[stock]['lastClose'] - 1
rise_price = round(full_tick[stock]['lastClose'] * 1.2, 2) if stock[0] == '3' or stock[:3] == '688' else round(
full_tick[stock]['lastClose'] * 1.1, 2)
# 如果要打印涨停品种
if abs(full_tick[stock]['lastPrice'] - rise_price) <0.01:
print(f"涨停股票 {stock} {ContextInfo.get_stock_name(stock)}")

market_value = full_tick[stock]['lastPrice'] * g.vol_dict[stock]
total_ratio += ratio * market_value
total_market_value += market_value
count += 1
# print(count)
total_ratio /= total_market_value
total_ratio *= 100
print(f'A股加权涨幅 {round(total_ratio, 2)}% 函数运行耗时{round(time.time() - t0, 5)}秒')


20240207182920.png

 
欢迎关注公众号:
可转债量化分析

迅投QMT投研版 有必要开吗?

QMT李魔佛 发表了文章 • 0 个评论 • 372 次浏览 • 2024-02-06 15:03 • 来自相关话题

没必要。
处处透出一股割韭菜的味道。
 
到处拉人进群,然后群里问问题,他们会让你私聊,加你,说服你开通投研版。
 
投研版无非多一些数据,你用tushare或者自己爬虫就可以获取,他们非要放到投研版里面,付费使用。
 
价格是一年8,9千,感觉没有一点性价比。
 
qmt,minniqmt有交易功能,有数据获取功能,也可以自己接入外部数据。没必要花那些冤枉钱去按年付费买一个不实用的数据。
真的没有数据,或者没有能力获取,付费找人写个api接口,爬虫数据,也不贵。 可以终身使用。 不好过按年付费???
 
关键那群qmt的人水平也不咋地,看他们的文档就知道,变量用A,B,C,D,人品也不咋地,星球上还抄袭我的星球文章,足以说明水平和人品。





 
群里问点问题,就让你开个投研版咨询哈。 还不如来我的qmt ptrade技术群的,free且有求必应哈。
  查看全部
没必要。
处处透出一股割韭菜的味道。
 
到处拉人进群,然后群里问问题,他们会让你私聊,加你,说服你开通投研版。
 
投研版无非多一些数据,你用tushare或者自己爬虫就可以获取,他们非要放到投研版里面,付费使用。
 
价格是一年8,9千,感觉没有一点性价比。
 
qmt,minniqmt有交易功能,有数据获取功能,也可以自己接入外部数据。没必要花那些冤枉钱去按年付费买一个不实用的数据。
真的没有数据,或者没有能力获取,付费找人写个api接口,爬虫数据,也不贵。 可以终身使用。 不好过按年付费???
 
关键那群qmt的人水平也不咋地,看他们的文档就知道,变量用A,B,C,D,人品也不咋地,星球上还抄袭我的星球文章,足以说明水平和人品。

Screenshot_2024_0206_150138.jpg

 
群里问点问题,就让你开个投研版咨询哈。 还不如来我的qmt ptrade技术群的,free且有求必应哈。
 

qmt获取北交所实时行情数据

QMT李魔佛 发表了文章 • 0 个评论 • 388 次浏览 • 2024-01-24 13:39 • 来自相关话题

之前没有试过用qmt交易北交所的股票,后面闻了一下券商,他们说是qmt支持北交所股票交易。
 
首先试试获取实时的行情:
我获取的是这个北交所股票的数据:






获取北交所行情数据如下:
 
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
info = ContextInfo.get_full_tick(stock_code=["838402.BJ"])
print(info)
返回下面的数据:





 
对了下时间戳,是正确的。
 
然后试了下获取北交所的历史数据行情:
#-*-coding:gbk-*-
import datetime

code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
download_history_data(code,"1d","20240105","")

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
print(date)
hist = ContextInfo.get_market_data_ex(['close'],[code], period = "1d",count = 1)
print(hist)

代码里面我想用 download_history_data(code,"1d","20240105","") 下载历史数据。
在数据目录里面也能够获取到这个股票的历史数据文件。
 
可是在qmt里面却输出的是个空的dataframe。






数据目录下面是有数据的。。




感觉是qmt里面的功能还没有完善对北交所股票的支持。
  查看全部
之前没有试过用qmt交易北交所的股票,后面闻了一下券商,他们说是qmt支持北交所股票交易。
 
首先试试获取实时的行情:
我获取的是这个北交所股票的数据:

20240124132926.png


获取北交所行情数据如下:
 
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
info = ContextInfo.get_full_tick(stock_code=["838402.BJ"])
print(info)

返回下面的数据:

20240124132856.png

 
对了下时间戳,是正确的。
 
然后试了下获取北交所的历史数据行情:
#-*-coding:gbk-*-
import datetime

code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
download_history_data(code,"1d","20240105","")

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
print(date)
hist = ContextInfo.get_market_data_ex(['close'],[code], period = "1d",count = 1)
print(hist)

代码里面我想用 download_history_data(code,"1d","20240105","") 下载历史数据。
在数据目录里面也能够获取到这个股票的历史数据文件。
 
可是在qmt里面却输出的是个空的dataframe。

20240124133450.png


数据目录下面是有数据的。。
20240124133533.png

感觉是qmt里面的功能还没有完善对北交所股票的支持。
 

华泰matic能在虚拟机运行吗?

李魔佛 发表了文章 • 0 个评论 • 361 次浏览 • 2024-01-05 09:36 • 来自相关话题

答:vmware上不行。登录的时候会直接提示说,matic禁止在虚拟机运行。
 
但matic却可以在hyper X虚拟机上运行。笔者在win11家庭版的hyper x测试过的。
 





 
 
答:vmware上不行。登录的时候会直接提示说,matic禁止在虚拟机运行。
 
但matic却可以在hyper X虚拟机上运行。笔者在win11家庭版的hyper x测试过的。
 

20240105093504.png

 
 

ptrade调试经验分享(坑) 委托成交回调函数

Ptrade李魔佛 发表了文章 • 0 个评论 • 461 次浏览 • 2023-12-22 10:30 • 来自相关话题

特么的在里面的报错了是不会有任何显示!!!!!!
 





 
之前的代码里面,由于少了一个if,导致如果code不在
g.start_buy_sell_queue 
这个集合里面的话,就会报错。(但正常情况下都会有值,但问题就出现在一些特殊情况下)
 
不然你试试在 
on_trade_response
里面直接raise一个Exception出来,日志里也不会有任何显示。
 
切近!! 
on_trade_response 里面做好安全防护!! 最好是有些业务逻辑完成了在里面print一下,以确保是执行到后面的。 查看全部
特么的在里面的报错了是不会有任何显示!!!!!!
 

20231222102356.png

 
之前的代码里面,由于少了一个if,导致如果code不在
g.start_buy_sell_queue 
这个集合里面的话,就会报错。(但正常情况下都会有值,但问题就出现在一些特殊情况下)
 
不然你试试在 
on_trade_response
里面直接raise一个Exception出来,日志里也不会有任何显示。
 
切近!! 
on_trade_response 里面做好安全防护!! 最好是有些业务逻辑完成了在里面print一下,以确保是执行到后面的。

ptrade精确参与集合竞价交易 时间设置问题

Ptrade李魔佛 发表了文章 • 0 个评论 • 778 次浏览 • 2023-11-16 10:10 • 来自相关话题

最近几次的集合竞价都没有卖出成功。
 
查了下日志。run_daily 设置的9:25运行,下单委托的时间在9:25:01 这个时间就被推到9:30开盘去成交了。
所以实际没有参与到9:25的集合竞价。
 
所以要参与集合竞价,需要设定在9:24分开始,然后不断在一个循环里面,用更小的时间颗粒,比如100ms去监听。
 
等到9:24:59的时间,才去下单。





 





 
具体代码可以参照我的知识星球

 
 
  查看全部
最近几次的集合竞价都没有卖出成功。
 
查了下日志。run_daily 设置的9:25运行,下单委托的时间在9:25:01 这个时间就被推到9:30开盘去成交了。
所以实际没有参与到9:25的集合竞价。
 
所以要参与集合竞价,需要设定在9:24分开始,然后不断在一个循环里面,用更小的时间颗粒,比如100ms去监听。
 
等到9:24:59的时间,才去下单。

20231116100349-v1.png

 

20231116100758-v1.png

 
具体代码可以参照我的知识星球

 
 
 

迅投官网的示例代码真的无眼看。。。

QMT李魔佛 发表了文章 • 0 个评论 • 678 次浏览 • 2023-11-10 01:17 • 来自相关话题

如果拿去做code review,估计会被喷的体无完肤。
 
变量名,类名用A ,B,C 噗, 没有一点含义,做什么鬼
 class a():
pass
A = a()而且也不符合python风格。。。python类名推荐的大写字母开头,实例化对象用小写字母。
所以退一万步讲,上面的代码正常点的程序员写也应该是这样的。
 class A():
pass
a = A()
  
其实正确的应该class GlobalCls():
pass

g = GlobalCls()
其他地方也是有这个毛病。
把代码喂给GPT,让它来分析一下:
得到如下结果:文件编码声明: #coding:gbk 是指定源文件的编码格式为GBK。在Python 3中,通常使用UTF-8作为文件编码格式,因此可以将该行删除或更改为#coding:utf-8。

类名和函数名: 根据PEP 8命名约定,类名应该使用大写字母开头的驼峰命名法(例如A改为A)。同样,函数名应该使用小写字母开头的小写命名法(例如init改为init,f改为f)。

类和实例: 在代码中定义了一个空类a,但没有给它任何属性或方法。如果不需要这个类,可以将其删除。

缩进和代码格式: Python非常依赖于正确的缩进,以指示代码块的层次结构。请确保代码的缩进是一致的,并使用适当的缩进级别(通常是4个空格)。

代码注释: 代码中有一些注释,但是大部分是被注释掉的。良好的注释可以增加代码的可读性和可维护性,建议在关键部分添加更多有用的注释。

异常处理: 代码中没有包含任何异常处理机制。在实际应用中,建议对可能引发异常的操作进行适当的异常处理,以提高代码的健壮性。
 
然后里面计算涨停是这样的: rise_price = round(full_tick[stock]['lastClose'] *1.2,2) if stock[0] == '3' or stock[:3] == '688' else round(full_tick[stock]['lastClose'] *1.1,2)


用昨收价* 1.2和1.1判断当前是否涨跌停。 首先,没有考虑到ST股,部分ST是5%涨停的。 
其次,是直接用的昨收价,如果当天是分红除权日,昨收价没有做除权处理,得到的涨跌幅也是不准的。
 
当然这个文档最大的问题是,很多示例代码运行是直接报错的!!
 

  查看全部
20231110001.jpg

如果拿去做code review,估计会被喷的体无完肤。
 
变量名,类名用A ,B,C 噗, 没有一点含义,做什么鬼
 
class a():
pass
A = a()
而且也不符合python风格。。。python类名推荐的大写字母开头,实例化对象用小写字母。
所以退一万步讲,上面的代码正常点的程序员写也应该是这样的。
 
class A():
pass
a = A()

  
其实正确的应该
class GlobalCls():
pass

g = GlobalCls()

其他地方也是有这个毛病。
把代码喂给GPT,让它来分析一下:
得到如下结果:
文件编码声明: #coding:gbk 是指定源文件的编码格式为GBK。在Python 3中,通常使用UTF-8作为文件编码格式,因此可以将该行删除或更改为#coding:utf-8。

类名和函数名: 根据PEP 8命名约定,类名应该使用大写字母开头的驼峰命名法(例如A改为A)。同样,函数名应该使用小写字母开头的小写命名法(例如init改为init,f改为f)。

类和实例: 在代码中定义了一个空类a,但没有给它任何属性或方法。如果不需要这个类,可以将其删除。

缩进和代码格式: Python非常依赖于正确的缩进,以指示代码块的层次结构。请确保代码的缩进是一致的,并使用适当的缩进级别(通常是4个空格)。

代码注释: 代码中有一些注释,但是大部分是被注释掉的。良好的注释可以增加代码的可读性和可维护性,建议在关键部分添加更多有用的注释。

异常处理: 代码中没有包含任何异常处理机制。在实际应用中,建议对可能引发异常的操作进行适当的异常处理,以提高代码的健壮性。

 
然后里面计算涨停是这样的:
		rise_price = round(full_tick[stock]['lastClose'] *1.2,2) if stock[0] == '3' or stock[:3] == '688' else round(full_tick[stock]['lastClose'] *1.1,2)


用昨收价* 1.2和1.1判断当前是否涨跌停。 首先,没有考虑到ST股,部分ST是5%涨停的。 
其次,是直接用的昨收价,如果当天是分红除权日,昨收价没有做除权处理,得到的涨跌幅也是不准的。
 
当然这个文档最大的问题是,很多示例代码运行是直接报错的!!
 

 

QMT | Ptrade 量化策略代写服务

李魔佛 发表了文章 • 0 个评论 • 1068 次浏览 • 2023-11-01 10:43 • 来自相关话题

 迅投的QMT和恒生电子的Ptrade, 还有掘金, 量化策略编程, 实盘和回测都行。只要你的需求明确,白纸黑字描述清楚,都可以做。股票,ETF,可转债都行。
 
多年交易经验,量化交易与开发经验。所以很多策略,其实用户大体描述,就知道要注意哪些地方,会提出一些建议,用户要注意,需不需要添加一些判读条件等等。(当然,策略的具体参数都是设置可以调节的,你不需要把实际的参数告诉我,代码给你后,你自己运行策略的时候把你策略的真正参数填上去就好了。)
 
有偿,收费,价格美丽。根据策略实际的复杂程度与预估的工时,收费。(不根据代码数量,因为我写代码很精简)
 
我也帮你们咨询过了迅投的客服。 因为他们官网也有提供策略代写服务。他们是不问你策略,直接是5000起步哦。然后根据策略,在5000的基础上不断加。
 









咨询完,我都感觉我自己以前的报价太低了,呜。
 
PS: 之前还有迅投的前员工私底下接单写策略,然后到我的星球里面白嫖我的代码,调用我接口数据,被我发现后举报到星球的。后面那个客户发现代码里面藏有我的公众号信息哈,找到我让我修改接口数据哈。
 
需要的代写策略的盆友,可以关注公众号,在菜单栏那里的“代写量化程序”或者 后台回复:策略代写,获取联系方式哦
 
扫码关注公众号:

  查看全部

Ptrade-QMT_副本.png


 迅投的QMT和恒生电子的Ptrade, 还有掘金, 量化策略编程, 实盘和回测都行。只要你的需求明确,白纸黑字描述清楚,都可以做。股票,ETF,可转债都行。
 
多年交易经验,量化交易与开发经验。所以很多策略,其实用户大体描述,就知道要注意哪些地方,会提出一些建议,用户要注意,需不需要添加一些判读条件等等。(当然,策略的具体参数都是设置可以调节的,你不需要把实际的参数告诉我,代码给你后,你自己运行策略的时候把你策略的真正参数填上去就好了。)
 
有偿,收费,价格美丽。根据策略实际的复杂程度与预估的工时,收费。(不根据代码数量,因为我写代码很精简)
 
我也帮你们咨询过了迅投的客服。 因为他们官网也有提供策略代写服务。他们是不问你策略,直接是5000起步哦。然后根据策略,在5000的基础上不断加。
 
Screenshot_2023_1101_102306_副本.jpg


Screenshot_2023_1101_102257_副本.jpg

咨询完,我都感觉我自己以前的报价太低了,呜。
 
PS: 之前还有迅投的前员工私底下接单写策略,然后到我的星球里面白嫖我的代码,调用我接口数据,被我发现后举报到星球的。后面那个客户发现代码里面藏有我的公众号信息哈,找到我让我修改接口数据哈。
 
需要的代写策略的盆友,可以关注公众号,在菜单栏那里的“代写量化程序”或者 后台回复:策略代写,获取联系方式哦
 
扫码关注公众号:

 

QMT获取A股全市场股票代码

QMT李魔佛 发表了文章 • 0 个评论 • 846 次浏览 • 2023-10-25 15:23 • 来自相关话题

QMT可以通过板块获取A股的全市场股票代码.
 
"沪深A股"
 
完整代码:#-*-coding:gbk-*-
import time
start = False
ACCOUNT = ''

def init(ContextInfo):
now = time.ctime()
print(now)
ContextInfo.run_time("execution","30nSecond","2023-04-14 13:20:00")


def execution(ContextInfo):
data = ContextInfo.get_stock_list_in_sector('沪深A股')
print(len(data))

def handlebar(ContextInfo):
pass
当前共有5047只股票【2023-10-25 15:18:45.533】 start trading mode
【2023-10-25 15:18:45.533】 Wed Oct 25 15:18:45 2023

【2023-10-25 15:18:45.533】 5074
['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ', '000012.SZ', '000014.SZ', '000016.SZ', '000017.SZ', '000019.SZ', '000020.SZ', '000021.SZ', '000023.SZ', '000025.SZ', '000026.SZ', '000027.SZ', '000028.SZ', '000029.SZ', '000030.SZ', '000031.SZ', '000032.SZ', '000034.SZ', '000035.SZ', '000036.SZ', '000037.SZ', '000039.SZ', '000040.SZ', '000042.SZ', '000045.SZ', '000046.SZ', '000048.SZ', '000049.SZ', '000050.SZ', '000055.SZ', '000056.SZ', '000058.SZ', '000059.SZ', '000060.SZ', '000061.SZ', '000062.SZ', '000063.SZ', '000065.SZ', '000066.SZ', '000068.SZ', '000069.SZ', '000070.SZ', '000078.SZ', '000088.SZ', '000089.SZ', '000090.SZ', '000096.SZ', '000099.SZ', '000100.SZ', '000151.SZ', '000153.SZ', '000155.SZ', '000156.SZ', '000157.SZ', '000158.SZ', '000159.SZ', '000166.SZ', '000301.SZ', '000333.SZ', '000338.SZ', '000400.SZ', '000401.SZ', '000402.SZ', '000403.SZ', '000404.SZ', '000407.SZ', '000408.SZ', '000409.SZ', '000410.SZ', '000411.SZ', '000413.SZ', '000415.SZ', '000416.SZ', '000417.SZ', '000419.SZ', '000420.SZ', '000421.SZ', '000422.SZ', '000423.SZ', '000425.SZ', '000426.SZ',省略若干...
 
点击查看大图




 
是否遇到QMT或Ptrade的问题, 无从入手? 或者咨询无门 ?
来加入 知识星球 , 获取专业的技术解答, 量化实盘代码, 技术交流群

  查看全部
QMT可以通过板块获取A股的全市场股票代码.
 
"沪深A股"
 
完整代码:
#-*-coding:gbk-*-
import time
start = False
ACCOUNT = ''

def init(ContextInfo):
now = time.ctime()
print(now)
ContextInfo.run_time("execution","30nSecond","2023-04-14 13:20:00")


def execution(ContextInfo):
data = ContextInfo.get_stock_list_in_sector('沪深A股')
print(len(data))

def handlebar(ContextInfo):
pass

当前共有5047只股票
【2023-10-25 15:18:45.533】  start trading mode
【2023-10-25 15:18:45.533】 Wed Oct 25 15:18:45 2023

【2023-10-25 15:18:45.533】 5074
['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ', '000012.SZ', '000014.SZ', '000016.SZ', '000017.SZ', '000019.SZ', '000020.SZ', '000021.SZ', '000023.SZ', '000025.SZ', '000026.SZ', '000027.SZ', '000028.SZ', '000029.SZ', '000030.SZ', '000031.SZ', '000032.SZ', '000034.SZ', '000035.SZ', '000036.SZ', '000037.SZ', '000039.SZ', '000040.SZ', '000042.SZ', '000045.SZ', '000046.SZ', '000048.SZ', '000049.SZ', '000050.SZ', '000055.SZ', '000056.SZ', '000058.SZ', '000059.SZ', '000060.SZ', '000061.SZ', '000062.SZ', '000063.SZ', '000065.SZ', '000066.SZ', '000068.SZ', '000069.SZ', '000070.SZ', '000078.SZ', '000088.SZ', '000089.SZ', '000090.SZ', '000096.SZ', '000099.SZ', '000100.SZ', '000151.SZ', '000153.SZ', '000155.SZ', '000156.SZ', '000157.SZ', '000158.SZ', '000159.SZ', '000166.SZ', '000301.SZ', '000333.SZ', '000338.SZ', '000400.SZ', '000401.SZ', '000402.SZ', '000403.SZ', '000404.SZ', '000407.SZ', '000408.SZ', '000409.SZ', '000410.SZ', '000411.SZ', '000413.SZ', '000415.SZ', '000416.SZ', '000417.SZ', '000419.SZ', '000420.SZ', '000421.SZ', '000422.SZ', '000423.SZ', '000425.SZ', '000426.SZ',
省略若干...
 
点击查看大图
20231025152005.png

 
是否遇到QMT或Ptrade的问题, 无从入手? 或者咨询无门 ?
来加入 知识星球 , 获取专业的技术解答, 量化实盘代码, 技术交流群

 

国金证券 国盛证券 QMT仿真客户端 PTrade仿真客户端 QMT测试版 Ptrade测试版

李魔佛 发表了文章 • 0 个评论 • 1397 次浏览 • 2023-10-22 12:54 • 来自相关话题

 下面是国金证券提供的试用账户:

国金证券 - QMT测试账号信息: 登录账号:*********** 登录密码:**********

QMT交易测试客户端下载链接 链接:
 
https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar

 
国金证券 - ptrade测试账号信息: 登录账号:*********  登录密码:********

ptrade交易测试客户端下载链接 链接:
 
https://download.gjzq.com.cn/temp/organ/gjzqptrade_ceshi.rar
 
测试时间10:00--17:00 如有什么问题,请和我们联系。谢谢!
 

 
下面是国盛证券提供的试用账户:

国盛证券 - 国盛智投软件下载(测试版)Ptrade

https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip

仿真账户:******* / ********
量化回测:支持1分钟、日线回测。
量化交易:支持LEVEL1 tick股票交易。
量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
 
国盛证券-迅投QMT软件下载(测试版) 
 
https://download.gszq.com/xt/XtItClient_x64_QMT_test_1.0.0.22650.exe

仿真账户:*******/********
支持VBA、Python开发策略 可以安装第三方库 软件帮助有文档,测试版历史数据不是很准确,以熟悉界面为主。

如果需要测试账号, 需要开通券商账号后找券商经理获取.
可以扫码联系开通

  查看全部
20231022131835-v1.png

 下面是国金证券提供的试用账户:

国金证券 - QMT测试账号信息: 登录账号:*********** 登录密码:**********

QMT交易测试客户端下载链接 链接:
 
https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar

 
国金证券 - ptrade测试账号信息: 登录账号:*********  登录密码:********

ptrade交易测试客户端下载链接 链接:
 
https://download.gjzq.com.cn/temp/organ/gjzqptrade_ceshi.rar
 
测试时间10:00--17:00 如有什么问题,请和我们联系。谢谢!
 

 
下面是国盛证券提供的试用账户:

国盛证券 - 国盛智投软件下载(测试版)Ptrade

https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip

仿真账户:******* / ********
量化回测:支持1分钟、日线回测。
量化交易:支持LEVEL1 tick股票交易。
量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
 
国盛证券-迅投QMT软件下载(测试版) 
 
https://download.gszq.com/xt/XtItClient_x64_QMT_test_1.0.0.22650.exe

仿真账户:*******/********
支持VBA、Python开发策略 可以安装第三方库 软件帮助有文档,测试版历史数据不是很准确,以熟悉界面为主。

如果需要测试账号, 需要开通券商账号后找券商经理获取.
可以扫码联系开通

 

ptrade 全局对象g持久化对象保存失败

Ptrade李魔佛 发表了文章 • 0 个评论 • 495 次浏览 • 2023-10-18 09:36 • 来自相关话题

 2023-10-18 09:25:12 - ERROR - 全局对象g持久化对象保存失败,对象名:TARGET_STOCK_CODE,错误原因:Traceback (most recent call last):
  File "./fly_docker/IQEngine/utils/global_variable.py", line 50, in save
_pickle.PicklingError: Can't pickle <class 'IQEngine.user_module.PositionManager'>: attribute lookup PositionManager on IQEngine.user_module failed

 
原因是全局变量g 不能被持久化, 需要前面加__, 比如g.Name 要改成 g.__Name
 
全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头;
涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;
全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存;
 






 
具体可以参加 API文档:
https://ptradeapi.com 查看全部


 2023-10-18 09:25:12 - ERROR - 全局对象g持久化对象保存失败,对象名:TARGET_STOCK_CODE,错误原因:Traceback (most recent call last):
  File "./fly_docker/IQEngine/utils/global_variable.py", line 50, in save
_pickle.PicklingError: Can't pickle <class 'IQEngine.user_module.PositionManager'>: attribute lookup PositionManager on IQEngine.user_module failed


 
原因是全局变量g 不能被持久化, 需要前面加__, 比如g.Name 要改成 g.__Name
 
全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头;
涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;
全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存;
 

20231018095102.png


 
具体可以参加 API文档:
https://ptradeapi.com

ptrade/qmt 判断股票是否涨停

Ptrade李魔佛 发表了文章 • 0 个评论 • 904 次浏览 • 2023-10-09 11:03 • 来自相关话题

 1. 可以直接用代码实现:
以ptrade为例:
 
先通过 get_snapshot - 取行情快照
 
其中里面有2个字段:
up_px:涨停价格(str:float);
down_px:跌停价格(str:float);用当前的最新价格和涨停跌停价格比较:
 
last_px:最新成交价(str:float);
 
if last_px>=up_px 就是达到涨停价, 
 
还有判断此时的卖一上是否有挂单. 如果还有卖单, 说明此时的涨停板并没有封住, 被人砸开了.
 
跌停板的判断也是如此.
 
 
2. 使用现有的API函数, 更加简单方便, 这个方法只适用于ptrade, qmt没有类似的函数.
 
check_limit - 代码涨跌停状态判断
 
使用场景
该函数仅在交易模块可用。

接口说明
该接口用于标识当日股票的涨跌停情况。

注意事项:



参数
security:单只股票代码或者多只股票代码组成的列表,必填字段(list[str]/str);

返回
正常返回一个dict类型数据,包含每只股票代码的涨停状态。多只股票代码查询时其中部分股票代码查询异常则该代码返回既不涨停也不跌停状态0。(dict[str:int])

涨跌停状态说明:

2:触板涨停(已经是涨停价格,但还有卖盘);
1:涨停;
0:既不涨停也不跌停;
-1:跌停;
-2:触板跌停(已经是跌停价格,但还有买盘);
示例代码:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
# 代码涨跌停状态
stock_flag = check_limit(g.security)
log.info(stock_flag)
公众号: 可转债量化分析

 
  查看全部
 1. 可以直接用代码实现:
以ptrade为例:
 
先通过 get_snapshot - 取行情快照
 
其中里面有2个字段:
up_px:涨停价格(str:float);
down_px:跌停价格(str:float);
用当前的最新价格和涨停跌停价格比较:
 
last_px:最新成交价(str:float);
 
if last_px>=up_px 就是达到涨停价, 
 
还有判断此时的卖一上是否有挂单. 如果还有卖单, 说明此时的涨停板并没有封住, 被人砸开了.
 
跌停板的判断也是如此.
 
 
2. 使用现有的API函数, 更加简单方便, 这个方法只适用于ptrade, qmt没有类似的函数.
 
check_limit - 代码涨跌停状态判断
 
使用场景
该函数仅在交易模块可用。

接口说明
该接口用于标识当日股票的涨跌停情况。

注意事项:



参数
security:单只股票代码或者多只股票代码组成的列表,必填字段(list[str]/str);

返回
正常返回一个dict类型数据,包含每只股票代码的涨停状态。多只股票代码查询时其中部分股票代码查询异常则该代码返回既不涨停也不跌停状态0。(dict[str:int])

涨跌停状态说明:

2:触板涨停(已经是涨停价格,但还有卖盘);
1:涨停;
0:既不涨停也不跌停;
-1:跌停;
-2:触板跌停(已经是跌停价格,但还有买盘);

示例代码:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
# 代码涨跌停状态
stock_flag = check_limit(g.security)
log.info(stock_flag)

公众号: 可转债量化分析

 
 

小市值轮动-量化交易-程序化交易-Ptrade实盘

Ptrade李魔佛 发表了文章 • 0 个评论 • 1066 次浏览 • 2023-10-07 14:14 • 来自相关话题

运行了一段时间的实盘策略。中途不断加条件,避免买入暴雷的品种;遇到一字板涨停的不要急于轮动卖出。等破板再卖出。
 
当前策略持有30只。




点击查看大图




点击查看大图

基于股票的策略不敢多买,属于试验阶段,后期仍然会不断根据市场调仓; 主仓依然在可转债。
 
公众号:可转债量化分析

如果需要策略代写,(ptrade、qmt,其他量化平台)
可以公众号后台回复:
策略代写

  查看全部
运行了一段时间的实盘策略。中途不断加条件,避免买入暴雷的品种;遇到一字板涨停的不要急于轮动卖出。等破板再卖出。
 
当前策略持有30只。

20231007002.jpg
点击查看大图

20231007003.jpg
点击查看大图

基于股票的策略不敢多买,属于试验阶段,后期仍然会不断根据市场调仓; 主仓依然在可转债。
 
公众号:可转债量化分析

如果需要策略代写,(ptrade、qmt,其他量化平台)
可以公众号后台回复:
策略代写

 

一个因为蓝盾退债引起的报错【Ptrade/QMT】

李魔佛 发表了文章 • 0 个评论 • 537 次浏览 • 2023-09-25 02:49 • 来自相关话题

最近发现Ptrade上运行的策略停止了。
 
上去一看。
每一个tick都在报错:





 
好家伙? 怎么会有个 404001.SS的可转债代码的?
 
于是顺着代码去调试。 这个代码是从我的接口传过去的。
 
于是我看了下数据库。
 





 
赫然发现了一个蓝盾退债的玩意, 代码正是 404001, 无语中。 怎么这个代码不按常理来的呢。 虽说是三板的股票,可是转债代码改成4字头, 也是奇葩。
 
刚好也碰巧我的拼接后缀代码:
def modify_code(self, x):
return x + '.SZ' if x.startswith('12') else x + '.SS'
401开头,于是拼接了个.SS 后缀,导致ptrade无法正确识别这个代码行情。
 
可能用401001.SZ 可以拿到行情呢。
  查看全部
最近发现Ptrade上运行的策略停止了。
 
上去一看。
每一个tick都在报错:

20230925001.jpg

 
好家伙? 怎么会有个 404001.SS的可转债代码的?
 
于是顺着代码去调试。 这个代码是从我的接口传过去的。
 
于是我看了下数据库。
 

20230925024354.png

 
赫然发现了一个蓝盾退债的玩意, 代码正是 404001, 无语中。 怎么这个代码不按常理来的呢。 虽说是三板的股票,可是转债代码改成4字头, 也是奇葩。
 
刚好也碰巧我的拼接后缀代码:
    def modify_code(self, x):
return x + '.SZ' if x.startswith('12') else x + '.SS'

401开头,于是拼接了个.SS 后缀,导致ptrade无法正确识别这个代码行情。
 
可能用401001.SZ 可以拿到行情呢。
 

ptrade最多支持同时运行多少个策略?

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

Ptrade上支持写无限个策略。





 
但同时运行的策略只有5个。





 
如果不需要的策略,可以把它暂停了,记住,不要随意暂停。 因为暂停了,重启后你的日志就会随之被清空。
平时也应该做好日志备份的习惯。 部分券商可以连接mysql,可以把数据导出,也可以顺便把日志也导出。





 
需要开通Ptrade或者代写的朋友可以咨询:

  查看全部
Ptrade上支持写无限个策略。

20230921170144-v1.png

 
但同时运行的策略只有5个。

20230921170529-v2.png

 
如果不需要的策略,可以把它暂停了,记住,不要随意暂停。 因为暂停了,重启后你的日志就会随之被清空。
平时也应该做好日志备份的习惯。 部分券商可以连接mysql,可以把数据导出,也可以顺便把日志也导出。

20230921171333-v1.png

 
需要开通Ptrade或者代写的朋友可以咨询:

 

Ptrade跟踪雪球组合自动调仓

Ptrade李魔佛 发表了文章 • 0 个评论 • 787 次浏览 • 2023-09-19 20:25 • 来自相关话题

Task: 
根据指定的雪球组合, 自动跟踪组合的调仓与比例.





 
图随便截取的,具体跟踪的组合,客户自己可以直接配置.
 
目前是每10分钟刷新一次 组合数据,如果有更新就马上根据调仓.
 
盘前和收盘前2分钟, 会定期扫码, 以免到了收盘来不及成交,  留够足够的时间下单与撤单.
 

PS:图片与策略无关
 
耗时地方仍然是调试. 
  查看全部
Task: 
根据指定的雪球组合, 自动跟踪组合的调仓与比例.

20230919201907.png

 
图随便截取的,具体跟踪的组合,客户自己可以直接配置.
 
目前是每10分钟刷新一次 组合数据,如果有更新就马上根据调仓.
 
盘前和收盘前2分钟, 会定期扫码, 以免到了收盘来不及成交,  留够足够的时间下单与撤单.
 

PS:图片与策略无关
 
耗时地方仍然是调试. 
 

ptrade量化策略:低位首板启动板-首板+低吸+单阳不破

Ptrade李魔佛 发表了文章 • 0 个评论 • 852 次浏览 • 2023-09-05 22:44 • 来自相关话题

低位的首板通常是启动板,首板+低吸+单阳不破,胜率还过得去。毛估估大于55%
 
Ptrade实现实盘自动交易代码。
 
(图片截图非本策略,随意贴的)

 
里面细节比较多。
 
得慢慢调。 查看全部
低位的首板通常是启动板,首板+低吸+单阳不破,胜率还过得去。毛估估大于55%
 
Ptrade实现实盘自动交易代码。
 
(图片截图非本策略,随意贴的)

 
里面细节比较多。
 
得慢慢调。

国金QMT测试版|模拟盘 安装程序 下载

QMT李魔佛 发表了文章 • 0 个评论 • 2065 次浏览 • 2023-09-02 12:16 • 来自相关话题

国金证券QMT测试账号信息: 
登录账号:******* 登录密码:*********

QMT交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
 

 
 
在线接口文档:
https://qmt.ptradeapi.com
 
需要开通QMT的视频的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。费率万一,可半年后免五。
开户后可提供技术相关解答。
  查看全部

20230902004.jpg


国金证券QMT测试账号信息: 
登录账号:******* 登录密码:*********

QMT交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
 

 
 
在线接口文档:
https://qmt.ptradeapi.com
 
需要开通QMT的视频的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。费率万一,可半年后免五。
开户后可提供技术相关解答。
 

国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号

Ptrade李魔佛 发表了文章 • 0 个评论 • 1152 次浏览 • 2023-09-01 22:53 • 来自相关话题

国盛证券Ptrade有实盘正式版 和 测试版, 测试版提供的是模拟账户,里面的资金是模拟的,默认有500万,随意你操作,亏完拉倒重新设置就好了。
国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号
仿真客户端








国盛Ptrade测试版 模拟账户下载:
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
仿真账户: ***** / ****** 量化回测:支持1分钟、日线回测。 量化交易:支持LEVEL1 tick股票交易。 量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。





虽然ptrade有测试版本,但是个人还是非常不推荐使用测试版本。 以前在上面写过回测或者模拟盘,发现问题非常多,一个是数据缺了,数据错乱。以前被它坑过,后面基本都就不敢用了。 群里的兄弟大部分也被坑过,进群公告就是告诫他们,远离测试版。。。哈
 
实盘版本的需要开通才能申请,不同券商的门槛不一样。需要的朋友可以扫码咨询:
 

  查看全部
国盛证券Ptrade有实盘正式版 和 测试版, 测试版提供的是模拟账户,里面的资金是模拟的,默认有500万,随意你操作,亏完拉倒重新设置就好了。
国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号
仿真客户端
20230901004.jpg

20231022124203-v1.png

国盛Ptrade测试版 模拟账户下载:
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
 
仿真账户: ***** / ****** 量化回测:支持1分钟、日线回测。 量化交易:支持LEVEL1 tick股票交易。 量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。

20230901006.jpg


虽然ptrade有测试版本,但是个人还是非常不推荐使用测试版本。 以前在上面写过回测或者模拟盘,发现问题非常多,一个是数据缺了,数据错乱。以前被它坑过,后面基本都就不敢用了。 群里的兄弟大部分也被坑过,进群公告就是告诫他们,远离测试版。。。哈
 
实盘版本的需要开通才能申请,不同券商的门槛不一样。需要的朋友可以扫码咨询:
 

 

国金QMT实盘版本下载地址

QMT李魔佛 发表了文章 • 0 个评论 • 1968 次浏览 • 2023-08-22 22:00 • 来自相关话题

官网没有提供下载地址,QMT一般是找经理开户后,然后申请QMT开通权限后,会发送账号和下载链接,还有接口文档,使用手册。
 

 
QMT实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqqmt.rar​
 
 
安装路径最好不要有中文,和空格。
 
实盘版里面可以切换模拟和实盘。
 





 
在线接口文档:
https://qmt.ptradeapi.com
 
需要开通QMT的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。
开户后可提供技术相关解答。
 

 
 附一个国金Ptrade的下载地址:
Ptrade实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqptd.rar
  查看全部
官网没有提供下载地址,QMT一般是找经理开户后,然后申请QMT开通权限后,会发送账号和下载链接,还有接口文档,使用手册。
 

 
QMT实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqqmt.rar​
 
 
安装路径最好不要有中文,和空格。
 
实盘版里面可以切换模拟和实盘。
 

Screenshot_2023_0822_215654.png

 
在线接口文档:
https://qmt.ptradeapi.com
 
需要开通QMT的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。
开户后可提供技术相关解答。
 

 
 附一个国金Ptrade的下载地址:
Ptrade实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqptd.rar
 

股票|可转债|基金|股指期货 数据白嫖 之 掘金量化版

李魔佛 发表了文章 • 0 个评论 • 672 次浏览 • 2023-08-21 10:23 • 来自相关话题

股票|可转债|基金|股指期货 数据白嫖 之 掘金版

一些刚刚入门的星友可能会缺乏一些股票数据,转债数据或者接口源。之前星球分享不过不同的数据源:tushare,akshare,通达信pytdx,miniqmt,ptrade等等。

今天为大家介绍一个新的数据源,可以白嫖不用开户,只需要简单注册一个账号就可以拉取数据,注册过程花费30秒都不到。

https://www.myquant.cn/terminal 
掘金量化

注册后用掘金量化终端登录,账号管理里有你的token,后续的数据调用都需要用的这个token,用于区分不同的用户。








有了token我们就可以开始白嫖数据了。from __future__ import print_function, absolute_import
from gm.api import *
set_token(juejin_token)
 获取可转债的分钟数据







就这么简单,没有多余的参数。

不过分钟数据只能拿到最近180天的数据。而日线则可以拿到所有的数据。

另外一个获取历史数据的函数:

get_history_instruments

除了拿到开盘,收盘,最低,最高加和成交量等数据,还可以获取可转债特性的数据,比如转股价,正股标的,上市日期,退市日期等。








剩余规模可以通过另外一个函数获取:

bnd_get_amount_change








获取指数成分股get_constituents(index='SHSE.000300', fields='symbol, weight', df=True)比如上面实例代码获取的是沪深300指数当前的成分股,以及每个个股的权重。








数据文档








期货数据

除此之外还有一些期货,指数数据可以获取的。比如获取中证1000股指期货IM2212合约数据im_data = get_history_symbol(symbol='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', df=True)
目前掘金量化也支持实盘交易,目前费率和门槛最低的是国盛证券,只需要入金5W就可以开通实盘版本,费率也是非常低的,最低可以到万一免五! 实盘掘金交易,股票需要再万一的基础上加0.2%,ETF,可转债这些品种还是原来的万0.5,简直良心券商!
 
需要开通的可以扫码咨询开通:
 

  查看全部
股票|可转债|基金|股指期货 数据白嫖 之 掘金版

一些刚刚入门的星友可能会缺乏一些股票数据,转债数据或者接口源。之前星球分享不过不同的数据源:tushare,akshare,通达信pytdx,miniqmt,ptrade等等。

今天为大家介绍一个新的数据源,可以白嫖不用开户,只需要简单注册一个账号就可以拉取数据,注册过程花费30秒都不到。

https://www.myquant.cn/terminal 
掘金量化

注册后用掘金量化终端登录,账号管理里有你的token,后续的数据调用都需要用的这个token,用于区分不同的用户。


20230820234218.png



有了token我们就可以开始白嫖数据了。
from __future__ import print_function, absolute_import
from gm.api import *
set_token(juejin_token)

 获取可转债的分钟数据

20230821000808.png



就这么简单,没有多余的参数。

不过分钟数据只能拿到最近180天的数据。而日线则可以拿到所有的数据。

另外一个获取历史数据的函数:

get_history_instruments

除了拿到开盘,收盘,最低,最高加和成交量等数据,还可以获取可转债特性的数据,比如转股价,正股标的,上市日期,退市日期等。


20230821003842.png



剩余规模可以通过另外一个函数获取:

bnd_get_amount_change


20230821004101.png



获取指数成分股get_constituents(index='SHSE.000300', fields='symbol, weight', df=True)比如上面实例代码获取的是沪深300指数当前的成分股,以及每个个股的权重。


20230821004940.png



数据文档


20230821093908.png



期货数据

除此之外还有一些期货,指数数据可以获取的。比如获取中证1000股指期货IM2212合约数据
im_data = get_history_symbol(symbol='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', df=True)

目前掘金量化也支持实盘交易,目前费率和门槛最低的是国盛证券,只需要入金5W就可以开通实盘版本,费率也是非常低的,最低可以到万一免五! 实盘掘金交易,股票需要再万一的基础上加0.2%,ETF,可转债这些品种还是原来的万0.5,简直良心券商!
 
需要开通的可以扫码咨询开通:
 

 

QMT iQuant miniQMT它们有什么区别?

李魔佛 发表了文章 • 0 个评论 • 1201 次浏览 • 2023-08-18 15:46 • 来自相关话题

QMT ,iQuant,miniQMT的区别

对于第一次接触的朋友来说,经常会问到几个问题,QMT和iQuant,miniQMT有什么区别。

首先,QMT和iQuant都是有迅投开发的。miniQMT是在QMT底下的运行的一个极简模式。



接下来将详细的讲讲。

QMT vs iQuant

一般券商采购了迅投的QMT,接入行情数据服务器和交易服务器,和用户资金账户,就可以让他成为自己的量化交易软件。



而iQuant是有国信定制开发的。iQuant它的大部分券商的QMT的功能基本一样。 不同的地方有:

iQuant移除了VBA模型

下图是国金QMT,在新建策略下面,有VBA模型和python模型



而在国信的iQuant的策略开发模式下,只支持python模型,VBA编写模型的功能被移除了。



对于VBA而言,实际是一门古老的语言,至少在互联网领域,已经没见过几个人在用的了。

不过我在查询了一下它的在QMT里面的实盘交易代码,其实它还是挺适合熟悉通达信公式的朋友使用,很多语法是从通达信的公式演变而来的。



iQuant支持投资研究,使用jupyter notebook逐行运行,为了便于调试。

而其他的QMT均没有这个功能。 不过这个功能我试了下,它只是调用我系统的jupyter notebook,而且它有严重的bug,居然运行不了任何代码。(ptrade也有个类似这样的功能,可以逐行调用内置的获取行情的函数,ptrade的是可以正常运行的)



少数券商的QMT无法在虚拟机运行

QMT可以在虚拟机运行,大部分券商的QMT可以在虚拟机里面运行,这也意味这可以云主机服务器运行,比如阿里云,腾讯云这种,在云服务器上网络和系统稳定性都要比你在家里放的主机要好,因为QMT需要一台正在运行的Windows系统,且网络畅通。

只有少数券商的QMT无法在虚拟机里面运行。



之前笔者粗略地对比了下QMT读取的系统信息,异同点字在于磁盘序列号,想要硬刚的读者朋友在可以尝试修改虚拟机的硬盘序列号。



在python编写策略的代码层面,QMT和iQuant的接口文档也基本一致的,可能在一些功能函数上会有些少出入。二者写的python代码可互相在彼此上运行。

QMT 与 miniQMT

miniQMT属于QMT的一个子功能,一个精简功能下的自动交易框架,只支持实盘交易,不支持回测。在miniQMT模式下,你的策略代码将不在固定在自带的那个QMT软件下编写,而是可以自由地使用pycharm,vscode等编辑器,运行的时候直接使用 python xxxx.py 这样的形式启动。

只是券商很少对它进行宣传,以至于用它的人不多。

进入miniQMT的方法: 点击QMT程序,登录时勾选极简模式



注意:极简模式下,需要一直保持者这个miniQMT的登录程序在运行,意味者miniQMT也只能在windows系统下运行。

XtQuant

miniQMT的核心是XtQuant,XtQuant能提供哪些服务?

XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。

XtQuant运行依赖环境

XtQuant目前提供的库包括Python3.6、3.7、3.8版本,不同版本的python导入时会自动切换。根据群友反馈,最新的版本可以支持到python3.11。

在运行使用XtQuant的程序前需要先启动MiniQMT客户端。

然后把你的QMT目录下的\bin.x64\Lib\site-packages\xtquant复制到你系统python目录下的site-packages。



然后就可以在你的代码里面导入QMT的函数,包括获取行情数据,下单函数。




它的帮助文档在bin.x64\Lib\site-packages\xtquant\doc 目录下。

从它的帮助文档来看,它是一套和QMT接口函数完全不一样的交易框架。



所以QMT的代码,无法直接拷贝到miniQMT中使用。虽然名字叫miniQMT,但感觉它提供的很多函数功能,要比QMT更为丰富,用户可以掌控的流程更多,更灵活。

iQuant版虽然也有精简版的miniQMT,但它对个人用户不提供下单功能呢,只有获取行情数据,财务数据等的数据权限。

还有一个与之配套的xtdata库,是专门用来获取行情数据的,而xttrade是专门用来交易下单的。



因为xtdata可以获取很多股票,可转债,ETF等等历史数据,所以即使你不用miniQMT做交易,你也可以白嫖它的数据,这比用积分的tushare简直不要太爽。比如可以获取到股票或可转债的日线,分钟线,甚至tick数据。

比如下面的代码就可以获取 众信转债 的某个时间的历史tick数据,并保存到文件。 只要稍微改造下,就可以获取全市场的转债的tick数据。
 import pandas as pd
import datetime


def get_tick(code, start_time, end_time, period='tick'):
from xtquant import xtdata

xtdata.download_history_data(code, period=period, start_time=start_time, end_time=end_time)
data = xtdata.get_local_data(field_list=, stock_code=, period=period, count=10)
result_list = data df = pd.DataFrame(result_list)

df['time_str'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x / 1000.0))
return df


def process_timestamp(df, filename):
df = df.set_index('time_str')
result = df.resample('3S').first().ffill()
result = result[(result.index >= '2022-07-20 09:30') & (result.index <= '2022-07-20 15:00')]
result = result.reset_index()
result.to_csv(filename + '.csv')


def dump_single_code_tick():
# 导出单个转债的tick数据
code='128022'
start_date = '20210113'
end_date = '20210130'

post_fix = 'SZ' if code.startswith('12') else 'SH'
code = '{}.{}'.format(code,post_fix)
filename = '{}'.format(code)
df = get_tick(code, start_date, end_date)

dump_single_code_tick()
 
把上面保存为main.py, 然后执行python main.py , 片刻就可以看到生成的文件数据了。

结语

为了便于读者快速浏览帮助文档,可以在公众号后台回复对应的关键词获取对应的帮助文档:

qmt文档

miniqmt文档

如果想要体验qmt或者miniqmt自动交易的朋友,可以后台回复:开通qmt

即可获取低门槛低费率的开通qmt/iQuant的券商开户方式。
 
 

 

知识星球: 查看全部
QMT ,iQuant,miniQMT的区别

对于第一次接触的朋友来说,经常会问到几个问题,QMT和iQuant,miniQMT有什么区别。

首先,QMT和iQuant都是有迅投开发的。miniQMT是在QMT底下的运行的一个极简模式。



接下来将详细的讲讲。

QMT vs iQuant

一般券商采购了迅投的QMT,接入行情数据服务器和交易服务器,和用户资金账户,就可以让他成为自己的量化交易软件。



而iQuant是有国信定制开发的。iQuant它的大部分券商的QMT的功能基本一样。 不同的地方有:

iQuant移除了VBA模型

下图是国金QMT,在新建策略下面,有VBA模型和python模型



而在国信的iQuant的策略开发模式下,只支持python模型,VBA编写模型的功能被移除了。



对于VBA而言,实际是一门古老的语言,至少在互联网领域,已经没见过几个人在用的了。

不过我在查询了一下它的在QMT里面的实盘交易代码,其实它还是挺适合熟悉通达信公式的朋友使用,很多语法是从通达信的公式演变而来的。



iQuant支持投资研究,使用jupyter notebook逐行运行,为了便于调试。

而其他的QMT均没有这个功能。 不过这个功能我试了下,它只是调用我系统的jupyter notebook,而且它有严重的bug,居然运行不了任何代码。(ptrade也有个类似这样的功能,可以逐行调用内置的获取行情的函数,ptrade的是可以正常运行的)



少数券商的QMT无法在虚拟机运行

QMT可以在虚拟机运行,大部分券商的QMT可以在虚拟机里面运行,这也意味这可以云主机服务器运行,比如阿里云,腾讯云这种,在云服务器上网络和系统稳定性都要比你在家里放的主机要好,因为QMT需要一台正在运行的Windows系统,且网络畅通。

只有少数券商的QMT无法在虚拟机里面运行。



之前笔者粗略地对比了下QMT读取的系统信息,异同点字在于磁盘序列号,想要硬刚的读者朋友在可以尝试修改虚拟机的硬盘序列号。



在python编写策略的代码层面,QMT和iQuant的接口文档也基本一致的,可能在一些功能函数上会有些少出入。二者写的python代码可互相在彼此上运行。

QMT 与 miniQMT

miniQMT属于QMT的一个子功能,一个精简功能下的自动交易框架,只支持实盘交易,不支持回测。在miniQMT模式下,你的策略代码将不在固定在自带的那个QMT软件下编写,而是可以自由地使用pycharm,vscode等编辑器,运行的时候直接使用 python xxxx.py 这样的形式启动。

只是券商很少对它进行宣传,以至于用它的人不多。

进入miniQMT的方法: 点击QMT程序,登录时勾选极简模式



注意:极简模式下,需要一直保持者这个miniQMT的登录程序在运行,意味者miniQMT也只能在windows系统下运行。

XtQuant

miniQMT的核心是XtQuant,XtQuant能提供哪些服务?

XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。

XtQuant运行依赖环境

XtQuant目前提供的库包括Python3.6、3.7、3.8版本,不同版本的python导入时会自动切换。根据群友反馈,最新的版本可以支持到python3.11。

在运行使用XtQuant的程序前需要先启动MiniQMT客户端。

然后把你的QMT目录下的\bin.x64\Lib\site-packages\xtquant复制到你系统python目录下的site-packages。



然后就可以在你的代码里面导入QMT的函数,包括获取行情数据,下单函数。




它的帮助文档在bin.x64\Lib\site-packages\xtquant\doc 目录下。

从它的帮助文档来看,它是一套和QMT接口函数完全不一样的交易框架。



所以QMT的代码,无法直接拷贝到miniQMT中使用。虽然名字叫miniQMT,但感觉它提供的很多函数功能,要比QMT更为丰富,用户可以掌控的流程更多,更灵活。

iQuant版虽然也有精简版的miniQMT,但它对个人用户不提供下单功能呢,只有获取行情数据,财务数据等的数据权限。

还有一个与之配套的xtdata库,是专门用来获取行情数据的,而xttrade是专门用来交易下单的。



因为xtdata可以获取很多股票,可转债,ETF等等历史数据,所以即使你不用miniQMT做交易,你也可以白嫖它的数据,这比用积分的tushare简直不要太爽。比如可以获取到股票或可转债的日线,分钟线,甚至tick数据。

比如下面的代码就可以获取 众信转债 的某个时间的历史tick数据,并保存到文件。 只要稍微改造下,就可以获取全市场的转债的tick数据。
 
import pandas as pd
import datetime


def get_tick(code, start_time, end_time, period='tick'):
from xtquant import xtdata

xtdata.download_history_data(code, period=period, start_time=start_time, end_time=end_time)
data = xtdata.get_local_data(field_list=, stock_code=
, period=period, count=10)
result_list = data
    df = pd.DataFrame(result_list)

df['time_str'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x / 1000.0))
return df


def process_timestamp(df, filename):
df = df.set_index('time_str')
result = df.resample('3S').first().ffill()
result = result[(result.index >= '2022-07-20 09:30') & (result.index <= '2022-07-20 15:00')]
result = result.reset_index()
result.to_csv(filename + '.csv')


def dump_single_code_tick():
# 导出单个转债的tick数据
code='128022'
start_date = '20210113'
end_date = '20210130'

post_fix = 'SZ' if code.startswith('12') else 'SH'
code = '{}.{}'.format(code,post_fix)
filename = '{}'.format(code)
df = get_tick(code, start_date, end_date)

dump_single_code_tick()

 
把上面保存为main.py, 然后执行python main.py , 片刻就可以看到生成的文件数据了。

结语

为了便于读者快速浏览帮助文档,可以在公众号后台回复对应的关键词获取对应的帮助文档:

qmt文档

miniqmt文档

如果想要体验qmt或者miniqmt自动交易的朋友,可以后台回复:开通qmt

即可获取低门槛低费率的开通qmt/iQuant的券商开户方式。
 
 

 

知识星球:

哪些券商有miniqmt? 门槛如何

QMT李魔佛 发表了文章 • 0 个评论 • 1401 次浏览 • 2023-08-11 12:04 • 来自相关话题

miniqmt可以不在QMT的框架下编写代码,灵活性要高于QMT。
它属于一个精简版的QMT,把回测功能,UI界面操作功能去除。
 
你可以把miniqmt导入到你的项目里面,直接操作下单。
 from xtquant import xtdata
data = xtdata.get_market_data(field_list=['time', 'open', 'close', 'high', 'low', 'volume', 'amount'], stock_list=['603000.SH'], period='1d', start_time='20230101')
print(data)上面代码 可以直接在你的pycharm里面运行, 提前把 xtquant 这个包复制到系统路径,site-packages,或者自己加到环境变量。
 
 
MiniQMT支持新版本的Python
最新已经支持python3.6-3.11
更新方式:主QMT-设置-交易设置-模型设置里更新Python库
 
目前支持miniQTM的券商有哪些?
 
其实miniqmt是附属在QMT上的,正常有QMT的,默认就可以使用miniqmt,除非券商作妖,阉割了。
 
国金,国盛支持miniqmt,开通QMT后 miniqmt就是直接可以使用的。
 





 
而国信的miniqmt默认被阉割了,需要额外去申请。(可能还有些经理不敬业的,会和你说不支持miniqmt,曾经遇到过),不过国信的miniqmt开通后,个人只能拉取行情数据,是没有下单权限,下单券商是需要机构才可以申请。
 
国金的QMT,miniqmt的开通门槛会低一些,有入金2W就可以开通的营业部; 也有入金50W开通的营业部。 需要的盆友可以扫码咨询开通。
 
国盛的QMT,目前门槛比较高,需要资产100W才能开通。本身之前门槛还只是入金30W就可以的了,后面他们不断地提高门槛,提到50W,后面提高到100W,不过最近几天,营业部的经理和我说目前我这边开通只需要50W即可。
 
 所以平时有优惠费率的时候就不要犹犹豫豫,把账户和权限开了再说,因为好事不常有,过了这个桥就没有这个店。
 
 
需要开户的盆友可以扫码咨询

  查看全部
miniqmt可以不在QMT的框架下编写代码,灵活性要高于QMT。
它属于一个精简版的QMT,把回测功能,UI界面操作功能去除。
 
你可以把miniqmt导入到你的项目里面,直接操作下单。
 
from xtquant import xtdata
data = xtdata.get_market_data(field_list=['time', 'open', 'close', 'high', 'low', 'volume', 'amount'], stock_list=['603000.SH'], period='1d', start_time='20230101')
print(data)
上面代码 可以直接在你的pycharm里面运行, 提前把 xtquant 这个包复制到系统路径,site-packages,或者自己加到环境变量。
 
 
MiniQMT支持新版本的Python
最新已经支持python3.6-3.11
更新方式:主QMT-设置-交易设置-模型设置里更新Python库
 
目前支持miniQTM的券商有哪些?
 
其实miniqmt是附属在QMT上的,正常有QMT的,默认就可以使用miniqmt,除非券商作妖,阉割了。
 
国金,国盛支持miniqmt,开通QMT后 miniqmt就是直接可以使用的。
 

国金国盛.jpg

 
而国信的miniqmt默认被阉割了,需要额外去申请。(可能还有些经理不敬业的,会和你说不支持miniqmt,曾经遇到过),不过国信的miniqmt开通后,个人只能拉取行情数据,是没有下单权限,下单券商是需要机构才可以申请。
 
国金的QMT,miniqmt的开通门槛会低一些,有入金2W就可以开通的营业部; 也有入金50W开通的营业部。 需要的盆友可以扫码咨询开通。
 
国盛的QMT,目前门槛比较高,需要资产100W才能开通。本身之前门槛还只是入金30W就可以的了,后面他们不断地提高门槛,提到50W,后面提高到100W,不过最近几天,营业部的经理和我说目前我这边开通只需要50W即可。
 
 所以平时有优惠费率的时候就不要犹犹豫豫,把账户和权限开了再说,因为好事不常有,过了这个桥就没有这个店。
 
 
需要开户的盆友可以扫码咨询

 

ptrade qmt无法登录问题

李魔佛 发表了文章 • 0 个评论 • 901 次浏览 • 2023-08-08 14:44 • 来自相关话题

经常有新人进群后,就说ptrade,或者qmt无法登录。












 
实际上这是在周五晚上和周末出现的问题,这是计划内的维护。部分券商没有技术服务支持,用户可能连服务器日常维护服务通知都无法及时得到通知。
 
PS:其实,大部分券商基本也就那样,ptrade和qmt的技术支持基本等于0,不敢说全部,至少90%的情况是这样的。 以至于我自己维护了一个ptrade,qmt的技术群(审核才可以加),日常有空就在里面解决群友的问题。基本都是些基础问题,部分可能是券商数据问题,大部分是用户的代码问题。 查看全部
经常有新人进群后,就说ptrade,或者qmt无法登录。

Screenshot_2023_0814_011717.jpg



Screenshot_2023_0814_011646.jpg


 
实际上这是在周五晚上和周末出现的问题,这是计划内的维护。部分券商没有技术服务支持,用户可能连服务器日常维护服务通知都无法及时得到通知。
 
PS:其实,大部分券商基本也就那样,ptrade和qmt的技术支持基本等于0,不敢说全部,至少90%的情况是这样的。 以至于我自己维护了一个ptrade,qmt的技术群(审核才可以加),日常有空就在里面解决群友的问题。基本都是些基础问题,部分可能是券商数据问题,大部分是用户的代码问题。

20行代码实现Ptrade一键清仓

Ptrade李魔佛 发表了文章 • 0 个评论 • 779 次浏览 • 2023-07-28 02:16 • 来自相关话题

留着有用。

万一遇到特殊情况要核的话,管快,1秒清空
 def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0:
order_target(code, 0)

# 标准
def initialize(context):
# 初始化策略
run_daily(context, func, time='9:25')

def handle_data(context, data):
pass
实际只用11行代码。
 
如果只清除转债或者股票某个品种,可以在code那里加个判断def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0 and code.startswith(('12','11')): # 只清除转债
order_target(code, 0)  查看全部
留着有用。

万一遇到特殊情况要核的话,管快,1秒清空
 
def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0:
order_target(code, 0)

# 标准
def initialize(context):
# 初始化策略
run_daily(context, func, time='9:25')

def handle_data(context, data):
pass

实际只用11行代码。
 
如果只清除转债或者股票某个品种,可以在code那里加个判断
def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0 and code.startswith(('12','11')): # 只清除转债
order_target(code, 0)
 

ptrade重启策略后日志被清空,正常的操作方式

Ptrade李魔佛 发表了文章 • 0 个评论 • 724 次浏览 • 2023-07-25 04:36 • 来自相关话题

坑爹的设计。 一个不留神,改了个参数,然后就点了一下重启策略。。。。





 
然后就心满意足的退出Ptrade。
 
然后想起来有个日志想要查一下的。再进去一看,里面的几个月的日志就被清除了。 OMG
这个清除日志的操作虽然说是软件设置的。但是产品经理应该也要评估一下,哪怕我只是改一个时间,比如我把策略从9:15分执行改成9:16执行,只要改动,策略就需要被重启,才能生效。
 
试问,哪个策略能够几年不出错,不修改,一直在上面运行的呢? 退一万步讲,其实如果我知道我即将修改后重启策略,面对这几百个按时间切割的日志,我用什么工具导出呢? 
 
软件自带的导出功能只能按照天数的。
 
所以对于运行很久的策略,如果需要修改里面的内容,我的建议是,直接停止程序,而不是重启。
 
然后把你的策略复制到一个新的策略里面,在新的策略里面改动参数。
 
然后直接运行这个新的策略,这样之前那个策略因为没有被重启,只是停止了,它的日志依然保存在ptrade的日历里面,你只需要选择指定的日期,就可以看到对应的历史数据。
 





 
更多ptrade、qmt,掘金的量化交易技巧,请查看星球。

  查看全部
坑爹的设计。 一个不留神,改了个参数,然后就点了一下重启策略。。。。

20230725001.jpg

 
然后就心满意足的退出Ptrade。
 
然后想起来有个日志想要查一下的。再进去一看,里面的几个月的日志就被清除了。 OMG
这个清除日志的操作虽然说是软件设置的。但是产品经理应该也要评估一下,哪怕我只是改一个时间,比如我把策略从9:15分执行改成9:16执行,只要改动,策略就需要被重启,才能生效。
 
试问,哪个策略能够几年不出错,不修改,一直在上面运行的呢? 退一万步讲,其实如果我知道我即将修改后重启策略,面对这几百个按时间切割的日志,我用什么工具导出呢? 
 
软件自带的导出功能只能按照天数的。
 
所以对于运行很久的策略,如果需要修改里面的内容,我的建议是,直接停止程序,而不是重启。
 
然后把你的策略复制到一个新的策略里面,在新的策略里面改动参数。
 
然后直接运行这个新的策略,这样之前那个策略因为没有被重启,只是停止了,它的日志依然保存在ptrade的日历里面,你只需要选择指定的日期,就可以看到对应的历史数据。
 

20230725002.jpg

 
更多ptrade、qmt,掘金的量化交易技巧,请查看星球。