# QmtTrader **Repository Path**: traderlink/qmt-trader ## Basic Information - **Project Name**: QmtTrader - **Description**: 封装MiniQmt相关函数,聚焦于策略开发,助力开发者高效实现策略构建 - **Primary Language**: Python - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 20 - **Forks**: 6 - **Created**: 2025-05-07 - **Last Updated**: 2025-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QmtTrader 封装MiniQmt相关函数,聚焦于策略开发,助力开发者高效实现策略构建,index.py部分未开源,可以添加作者微信获取源码:closex1001 > 声明:本项目仅用于学习和研究,不保证交易收益,不作为投资建议,风险自负,请充分使用QMT模拟盘测试。 ## 欢迎加入知识星球 知识星球有雪球、聚宽、大宽、东财等平台依托此框架实现的跟单程序 ![知识星球](images/zsxq.jpg) ## 欢迎关注微信公众号 公众号有许多果仁、聚宽、掘金、QMT等平台策略复现文章 微信公众号 ### 安装教程 ```python 1、Python安装教程 https://blog.csdn.net/weixin_55701118/article/details/144055539 2、PyCharm安装教程 https://blog.csdn.net/zhang120529/article/details/147143234 3、QmtTrader源码下载 https://gitee.com/traderlink/qmt-trader 4、运行根目录下的脚本 安装依赖.bat 6、运行示例策略 示例策略.py ``` ### 运行效果 ![知识星球](images/run1.png) ## 定时任务 需要在init函数中定义 ```python # 两秒执行一次 ContextInfo.run_time(func1,'2nSecond') # 两分钟执行一次 ContextInfo.run_time(func2,'2nMinute') # 一小时执行一次 ContextInfo.run_time(func3,'2nHour') # 每天14:00执行 ContextInfo.run_daily(func4,'14:00') ``` ## 账户函数 ```python # 查询所有持仓 ContextInfo.get_positions() # 查询指定标的持仓 ContextInfo.get_position(security='002789.SZ') # 查询指定标的仓位 ContextInfo.get_security_percent(security='002789.SZ') # 查询指定标的可用数量 ContextInfo.get_security_available(security='002789.SZ') # 查询账户资产信息 ContextInfo.get_asset() # 查询账户总资产 ContextInfo.get_total_asset() # 查询账户总持仓市值 ContextInfo.get_total_market_value() # 查询账户总持仓仓位 ContextInfo.get_total_percent() # 查询账户可用余额 ContextInfo.get_total_cash() ``` ## 下单函数 ```python # 市价买入 000001.SZ 100股 ContextInfo.order(security='000001.SZ', amount=100, price=0) # 市价卖出 000001.SZ 100股 ContextInfo.order(security='000001.SZ', amount=-100, price=0) # 限价买入 000001.SZ 100股 ContextInfo.order(security='000001.SZ', amount=100, price=11.09) # 限价卖出 002789.SZ 100股 ContextInfo.order(security='002789.SZ', amount=-100, price=11.09) # 市价调整持仓至目标数量 002789.SZ 1000股 ContextInfo.order_target(security='002789.SZ', amount=1000, price=0) # 限价调整持仓至目标数量 000001.SZ 1000股 ContextInfo.order_target(security='000001.SZ', amount=1000, price=11.09) # 市价卖出指定市值 000001.SZ 11040.12元 ContextInfo.order_value(security='000001.SZ', value=-11040.12, price=0) # 限价卖出指定市值 002789.SZ 6666.66元 ContextInfo.order_value(security='002789.SZ', value=-6666.66, price=6.66) # 市价买入指定市值 000001.SZ 11040.12元 ContextInfo.order_value(security='000001.SZ', value=11040.12, price=0) # 限价买入指定市值 002789.SZ 6666.66元 ContextInfo.order_value(security='002789.SZ', value=6666.66, price=6.66) # 市价调整持仓至目标市值 002789.SZ 6666.66元 ContextInfo.order_target_value(security='002789.SZ', value=6666.66, price=0) # 限价调整持仓至目标市值 000001.SZ 11040.12元 ContextInfo.order_target_value(security='000001.SZ', value=11040.12, price=11.09) # 市价卖出指定仓位 000001.SZ 20% ContextInfo.order_position(security='000001.SZ', percent=-0.2, price=0) # 限价卖出指定仓位 002789.SZ 20% ContextInfo.order_position(security='002789.SZ', percent=-0.2, price=6.66) # 市价买入指定指定仓位 000001.SZ 20% ContextInfo.order_position(security='000001.SZ', percent=0.2, price=0) # 限价买入指定仓位 002789.SZ 20% ContextInfo.order_position(security='002789.SZ', percent=0.2,price=6.66) # 市价调整持仓至目标仓位 002789.SZ 10% ContextInfo.order_target_position(security='002789.SZ', percent=0.1, price=0) # 限价调整持仓至目标仓位 000001.SZ 10% ContextInfo.order_target_position(security='000001.SZ', percent=0.1, price=11.09) # 策略名称 策略备注 ContextInfo.order(security='000001.SZ', amount=100, price=0, strategy_name='策略名称', remark='策略备注') ``` ## 订单函数 ```python # 查询委托订单 ContextInfo.get_orders() # 查询所有委托订单 ContextInfo.get_orders() # 查询可撤委托订单 ContextInfo.get_orders(cancelable_only=True) # 根据订单编号查询可撤订单 ContextInfo.get_order_no(order_id='13243463456',cancelable_only=True) # 根据订单备注查询可撤订单 ContextInfo.get_order_no(remark='13243463456',cancelable_only=True) # 查询成交订单 ContextInfo.get_trades() # 根据订单编号查询成交订单 ContextInfo.get_trades_no(order_id='13243463456',cancelable_only=True) # 根据订单备注查询成交订单 ContextInfo.get_trades_no(remark='13243463456',cancelable_only=True) # 根据订单编号撤单 ContextInfo.cancel_order(order_id='0001') # 撤销所有可撤订单 ContextInfo.cancel_all_order() # 撤销指定标的所有订单 ContextInfo.cancel_security_order(security ='000001.SZ') ``` ## 数据函数 ```python # 获取指定标的最新价 ContextInfo.get_latest_price(security ='000001.SZ') # 获取指定标的名称 ContextInfo.get_security_name(security ='000001.SZ') ``` ## 策略示例 ### 三秒运行一次的策略 ```python import trader def init(ContextInfo): """ 初始化方法 策略启动时执行 定义股票池 固定参数 """ # 三秒执行一次 ContextInfo.run_time(trade,'3nSecond') def trade(ContextInfo): """ 三秒执行一次 """ trader.logger.info("执行了") trader.start( mode=0, strategy_name='示例策略', account_id='550109xx', mini_qmt_path=r'E:\国金QMT交易端模拟\userdata_mini', init_event=init ) ``` ### 每天两点运行的策略 ```python import trader def init(ContextInfo): """ 初始化方法 策略启动时执行 定义股票池 固定参数 """ # 每天14:00执行 ContextInfo.run_daily(trade, '14:00') def trade(ContextInfo): """ 每天14:00执行 """ ContextInfo.order(security='000001.SZ', amount=100, price=0) trader.start( mode=0, strategy_name='示例策略', account_id='550109xx', mini_qmt_path=r'E:\国金QMT交易端模拟\userdata_mini', init_event=init ) ``` ### 每天两点买入100股 ```python import trader def init(ContextInfo): """ 初始化方法 策略启动时执行 定义股票池 固定参数 """ # 每天14:00执行 ContextInfo.run_daily(trade, '14:00') def trade(ContextInfo): """ 每天14:00执行 """ trader.logger.info("执行了") trader.start( mode=0, strategy_name='示例策略', account_id='550109xx', mini_qmt_path=r'E:\国金QMT交易端模拟\userdata_mini', init_event=init ) ``` ### 企业微信通知 利用企业微信机器人发送通知 设置群机器人参看:https://open.work.weixin.qq.com/help2/pc/14931 ```python import trader def init(ContextInfo): """ 初始化方法 策略启动时执行 定义股票池 固定参数 """ # 每天14:00执行 ContextInfo.run_daily(trade, '14:00') def trade(ContextInfo): """ 每天14:00执行 """ trader.logger.info("执行了") def webhook(): trader.add_webhook_handler( "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx") trader.start( mode=0, strategy_name='示例策略', account_id='550109', mini_qmt_path=r'E:\国金QMT交易端模拟\userdata_mini', init_event=init, add_notify_handler=webhook ) ``` ![微信机器人](images/wxbot.png) ![消息示例](images/msg.png) ## 参数说明 ```python trader.start( mode = 0, account_id=account_id, mini_qmt_path=mini_qmt_path, interval=interval, init_event=init, trade_event=trade, before_event=before, after_event=after, add_notify_handler=add_notify_handler ) ``` ### mode mode = 0 模拟模式不产生实际交易 mode = 1 实盘模式 产生交易,非交易时间不运行 ### strategy_name 策略名称 ### account_id qmt账号 ### mini_qmt_path miniqmt路径 ### interval 轮询间隔时间(秒) ### time_rule 执行时间(每天) ### init_event 初始化方法回调 ### trade_event 交易执行方法回调 ### before_event 盘前执行方法回调 ### after_event 盘后执行方法回调 ### add_notify_handler 推送方法回调