最近 Posts
迅投QMT量化交易系统新手指南及常见问题
迅投QMT门槛
迅投QMT量化交易系统是一款基于python语言开发的程序化交易(量化交易)平台,它提供了丰富的量化交易功能,包括策略开发、回测、实盘交易等。
迅投QMT量化交易系统的门槛相对较低,只需要具备一定的编程基础,资金门槛很低,就可以开始使用。
其实迅投QMT还是比较适合入门级和中级个人投资者的,如果是那种特别专业的个人投资者或者机构的投资者,不一定会选择迅投QMT,还有其他的量化交易平台,比如大家经常能在龙虎榜上面看到的华鑫某某某,当然华鑫的门槛会更高,对资金和对技术能力都会有更高的门槛。
获取QMT的方法
首先就是开通一个券商,选择的券商要能支持QMT的接入,然后开通QMT的账号,就可以开始使用了。有一些券商基本没什么开户门槛,可以开通QMT,如果有需要,可以通过底部的微信二维码,与我联系,可以与我的客户经理联系,其实也就只是帮个忙,不是全职干这个的哈。
QMT的安装
安装包要从你的券商那里下载,安装很简单,就普通安装一个软件有一样。一定不要随便从网上自己下载。要使用windows的平台设备, win 10, win 11 , win server等。
QMT的登陆
需要从自己的券商那里获取,有一个用户名和一个密码,然后登陆即可。一般在开通QMT交易权限的时候,券商会告诉你用户名和密码。
python版本
QMT策略编写使用的语言是python,版本为3.6。如果完全不懂python的话,要么赶紧学习,要么这个帖子就是一个劝退帖。他并不是那种点一点鼠标就能写策略的,必须要有python编写能力。
关于线程和进程
QMT中,python无法使用多线程和多进程,而且所有策略都在同一线程中执行,所以策略中应该尽量避免阻塞类的写法,否则会影响其他策略的执行。
QMT自带python库
QMT里面内置了一些常用的python库,包括:
- numpy, pandas, patsy, scipy, statsmodels, TA_Lib 其中多种指标如 ADX, MACD, RSI, 布林轨道等;K 线形态识别,如黄昏之星,锤形线等等可以使用TA_Lib库。
如果你想要使用其他的python库,有的券商qmt是支持自行安装的,有的可能需要联系券商给你打开权限。
QMT自带策略
QMT里面自带了一些策略,包括:
- 均线策略
- 日内交易策略
- 国债逆回购策略
等等,当然这些仅供参考,基本上大家都要自己编写自己的策略。不过有了这些自带策略作为例子,学习起来会轻松很多。
QMT的运行环境
需要一台Windows电脑,win10, win11, 也可以使用云服务器 win server,电脑的性能取决于你自己的策略,如果策略的数量不多,且策略并不复杂,其实普通的电脑都没有问题。对于新手来说,完全可以使用一台现有的电脑开始使用,如果后面上了复杂的策略,慢慢的再增加性能更好的电脑硬件。我自己的策略比较简单,我把我的电脑的一些硬件,比如USB接口只开启了一个,声卡什么用不到的硬件都关闭了,只保留了必须的硬件,这样可以保证电脑的性能,也可以保证电脑的稳定性,同时电耗也会比较低,目前我的电耗每天不到0.5度。
我的帖子,分享如何低成本的选择迅投QMT的服务器/电脑,低成本运行? 开始阅读
QMT的运行,很多时候,我们并不是一直盯着的,会需要在电脑上/云服务器上面安装一个远程协助软件,这样可以随时远程连接到QMT,然后进行一些操作。
QMT与手机的通信
QMT与手机的通信是非常重要的,因为很多时候,QMT运行的电脑并不是实时由人工监管的,可能会出现程序报错,或者策略不符合预期等。我们需要在程序中添加代码,将错误信息通过短信、邮件、app推送等方式通知发送到手机,这样我们可以及时的处理出现的问题。
目前常用的方法有:
- 短信推送 (要收费)
- 邮件推送
- 飞书推送
- 微信公众号推送 等等
我有时间的时候,再单独写文章讲如何使用这些推送方法。
一些Bug与解决方案
关于这个bug我又单独的写了两个文章,一个是关于QMT的服务器延迟问题,一个是关于QMT的账号成交状态变化主推 deal_callback() , 当账号成交状态有变化时,这个函数被客户端调用。
迅投QMT量化交易系统服务器连接 中断与再连接 开始阅读
迅投QMT交易系统 延迟 委托/成交/持仓/账号信息延迟 get_trade_detail_data延迟 开始阅读
讯投 QMT 使用小技巧 -如何判断今天是不是交易日
在讯投QMT中判断今天是否为交易日
在讯投QMT平台中,你可以通过以下几种方法来判断当天是否为交易日:
方法一:使用ContextInfo.get_trading_dates()函数
def is_trading_day():
# 获取最近一段时间的交易日历
trading_dates = ContextInfo.get_trading_dates('SH', 0, 10) # 获取从今天开始的10个交易日
# 获取当前日期
today = datetime.datetime.now().strftime('%Y%m%d')
# 判断今天是否在交易日列表中
return today in trading_dates
方法二:使用xtdata模块(如果可用)
import xtdata
def is_trading_day():
# 获取今天的日期
today = datetime.datetime.now().strftime('%Y%m%d')
# 查询上证指数的交易日历
trading_dates = xtdata.get_trading_dates('SH', today, today)
return len(trading_dates) > 0
方法三:使用系统时间函数
def is_trading_day():
# 获取当前时间
now = datetime.datetime.now()
# 判断是否为工作日(周一到周五)
if now.weekday() >= 5: # 5=周六,6=周日
return False
# 进一步检查是否是节假日(需要维护节假日表)
# 这里可以添加你的节假日判断逻辑
return True
注意事项
- 第一种方法是最可靠的,因为它直接从交易所获取交易日历
- 节假日需要特别处理,中国的节假日调休会导致非周末的工作日也可能不是交易日
- 建议在开盘前运行检查,因为有些函数在非交易时间可能返回不同结果
- 以上代码仅供参考,大家需要根据自己的实际情况判断这些代码是否满足自己的要求。
你可以根据你的QMT版本和可用模块选择最适合的方法。第一种方法通常是首选,因为它直接查询交易所的交易日历。
讯投 QMT 使用小技巧:判断当前时段是交易/非交易/竞价/盘后等时间段
A股的交易时间段
A股的交易时段分为开盘集合竞价、连续竞价(早盘、午盘)和收盘集合竞价三个阶段,具体时间如下:
1. 交易日安排
- 周一至周五(法定节假日除外)
- 不交易:周末(周六、周日)和法定节假日(如春节、国庆节等)。
2. 交易时段明细
时段 | 时间 | 备注 |
---|---|---|
开盘集合竞价 | 9:15 - 9:25 | - 9:15-9:20:可申报或撤单。- 9:20-9:25:可申报,不可撤单。 |
早盘连续竞价 | 9:30 - 11:30 | 正常交易时段,可自由买卖。 |
午间休市 | 11:30 - 13:00 | 不接受委托,未成交的订单仍有效。 |
午盘连续竞价 | 13:00 - 14:57 | 正常交易时段。 |
收盘集合竞价 | 14:57 - 15:00 | 可申报,不可撤单,以最大成交量撮合收盘价。 |
3. 其他规则
- 科创板(688开头) & 创业板(300开头):
- 新增盘后固定价格交易(15:05-15:30),按当日收盘价成交(需手动挂单)。
- 大宗交易:
- 通常为15:00-15:30,需满足最低交易数量或金额门槛。
注意事项
- 非交易时段(如夜间)的委托单会被暂存,次日9:15进入系统。
- 集合竞价的成交价格遵循“最大成交量”原则,所有交易按同一价格成交。
QMT中的函数判断
以下是一个 Python 函数,用于判断当前时间属于 A 股的哪个交易时段(包括科创板和创业板的盘后交易),如果不是交易时段则返回 “非交易时段”:
import datetime
def get_a_share_trading_period():
now = datetime.datetime.now()
current_time = now.time()
weekday = now.weekday() # 0-4 是周一到周五
# 检查是否为交易日(周一至周五,非节假日)
if weekday >= 5: # 周六、周日
return "非交易时段(周末休市)"
# 定义交易时段
trading_periods = [
{"name": "开盘集合竞价", "start": "09:15:00", "end": "09:25:00", "can_cancel": True},
{"name": "早盘连续竞价", "start": "09:30:00", "end": "11:30:00", "can_cancel": True},
{"name": "午间休市", "start": "11:30:00", "end": "13:00:00", "can_cancel": False},
{"name": "午盘连续竞价", "start": "13:00:00", "end": "14:57:00", "can_cancel": True},
{"name": "收盘集合竞价", "start": "14:57:00", "end": "15:00:00", "can_cancel": False},
]
# 科创板和创业板的盘后交易(15:05-15:30)
kechuang_cyb_period = {"name": "科创/创业板盘后交易", "start": "15:05:00", "end": "15:30:00", "can_cancel": False}
# 检查当前是否在交易时段
for period in trading_periods:
start_time = datetime.datetime.strptime(period["start"], "%H:%M:%S").time()
end_time = datetime.datetime.strptime(period["end"], "%H:%M:%S").time()
if start_time <= current_time <= end_time:
return f"{period['name']}(可撤单: {'是' if period['can_cancel'] else '否'})"
# 检查是否在科创/创业板盘后交易时段
kechuang_start = datetime.datetime.strptime(kechuang_cyb_period["start"], "%H:%M:%S").time()
kechuang_end = datetime.datetime.strptime(kechuang_cyb_period["end"], "%H:%M:%S").time()
if kechuang_start <= current_time <= kechuang_end:
return f"{kechuang_cyb_period['name']}(按收盘价交易,不可撤单)"
# 不在任何交易时段
return "非交易时段"
# 测试
print(get_a_share_trading_period())
输出示例
- 如果当前时间是 09:20:00,返回:
开盘集合竞价(可撤单: 是)
- 如果当前时间是 12:30:00,返回:
午间休市(可撤单: 否)
- 如果当前时间是 15:15:00,返回:
科创/创业板盘后交易(按收盘价交易,不可撤单)
- 如果当前时间是 16:00:00 或周末,返回:
非交易时段
功能说明
- 判断交易日:仅周一到周五有效,周末返回非交易时段。
- 标准交易时段:包括集合竞价、连续竞价和收盘竞价。
- 科创/创业板盘后交易:15:05-15:30 额外判断。
- 撤单规则:集合竞价部分时段不可撤单(如 9:20-9:25)。
如果需要进一步扩展(如节假日判断),当天是不是交易日,请阅读我们提供的另外一个讯投qmt使用小技巧: 如何判断今天是不是交易日 开始阅读。