乐于分享
好东西不私藏

miniQMT零基础教程:从安装配置到实盘一站式体验(文末附带源代码及免费开通路径)

miniQMT零基础教程:从安装配置到实盘一站式体验(文末附带源代码及免费开通路径)

在量化交易的广阔领域里,个人投资者往往面临着工具选择难、技术门槛高的挑战。迅投推出的QMT/miniQMT 量化交易软件,为这类投资者量身打造的实用工具,尤其适合那些熟悉 Python 编程语言的量化爱好者。这款软件全面支持沪深市场、两融业务、港股通以及期权期货等多种交易类型,集成了模拟交易、策略编码、回测验证及实盘交易等完整流程,为用户提供一站式量化交易解决方案。

Python 的简洁易懂,加上QMT/miniQMT 提供的丰富 API 接口,使得个人投资者能够轻松构建、测试并运行自己的量化策略。此外,QMT/miniQMT 与高效的交易柜台 UFT/LDP 紧密集成,确保了交易的快速执行。低至约 10 毫秒的交易延迟,对于追求交易时效性的个人投资者而言,无疑是巨大的优势。今天给大家详细介绍一下miniQMT

QMT的运行逻辑

QMT 系统内置了 3.6 版本的 python 运行环境,提供行情数据与交易下单两大核心功能。通过编写 python 脚本,可以完成指标计算、策略编写、策略回测、实盘下单等需求。
回测模型:在历史 k 线上,自左向右逐根遍历 k 线,以模拟的资金账号记录每日的买卖信号,持仓盈亏,最终展示策略在历史上的净值走势结果。
实盘模型:在盘中收最新的动态行情,即时发送买卖信号到交易所,判断委托状态,需要实时重复报撤的模型。

什么是miniQMT?

miniQMT 是 QMT 内部的极简版,可以摆脱很多限制实现策略代码本地运行,对于个人量化投资者来说这是一个低门槛享受机构投资者量化交易的软件。
QMT模式需要将策略编写在QMT客户端软件内运行,而miniQMT模式直接使用xtquant这个Python包,在软件外部编写Python程序与QMT客户端连接,从而实现程序化下单。这样一来,QMT客户端就完全转变为一个交易终端,量化程序可以独立于QMT运行,只要确保极简客户端处于运行状态就可以了。
miniQMT 登录进入界面十分简洁,左侧省去了行情、策略研究、策略交易,只保留了基本的买卖功能。

miniQMT的核心接口

MiniQMT 的核心其实就在于其 XTQuant 功能,XtQuant封装了策略交易所需要的Python API接口,可以和MiniQMT客户端交互进行报单、撤单、查询资产、查询委托、查询成交、查询持仓以及收到资金、委托、成交和持仓等变动的主推消息。XTQuant 主要包含两个部分:

XTdata 提供数据接口,它允许用户即使在没有登录资金账户的情况下也能从 QMT 实盘客户端获取数据。通过这种方式,各类数据可以轻松地以 Python 库的形式添加到各种交易策略中。

Xtrader 这是提供了交易接口,要激活并使用这项功能,用户需要在券商开通账户,便能通过此接口进行实盘交易。

如何配置miniQMT?

配置miniQMT的逻辑就是就是将XTquant包放在本地作为python的第三方库。具体流程就是:

1、点击桌面QMT文件夹位置

2、找到文件夹里面的sit_pages文件

3、复制xtquant到python的安装路径下的sit_pages文件下面。

注意:更详细的安装教程何xtquant文件可以找我领取!

如何使用miniQMT?

当 miniQMT 完成配置后,就正式进入连接账户、读取账户信息的关键环节。首先,打开 miniQMT 客户端,输入正确的账号密码登录,确保客户端与券商服务器建立稳定连接。登录成功后,在策略代码中,通过 xtquant 库提供xttrader模块调函数初始化交易接口,传入配置好的交易路径和客户端信息,即可完成程序与交易账户的对接。

1、连接账户代码示例:

def connect(self):        '''        连接        path qmt userdata_min是路径        session_id 账户的标志,随便        account账户,        account_type账户内类型        '''        print('链接qmt')        # path为mini qmt客户端安装目录下userdata_mini路径        path = self.path        # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号        session_id = self.session_id        xt_trader = XtQuantTrader(path, session_id)        # 创建资金账号为1000000365的证券账号对象        account=self.account        account_type=self.account_type        acc = StockAccount(account_id=account,account_type=account_type)        # 创建交易回调类对象,并声明接收回调        callback = MyXtQuantTraderCallback()        xt_trader.register_callback(callback)        # 启动交易线程        xt_trader.start()        # 建立交易连接,返回0表示连接成功        connect_result = xt_trader.connect()        if connect_result==0:            # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功            subscribe_result = xt_trader.subscribe(acc)            print(subscribe_result)            self.xt_trader=xt_trader            self.acc=acc            return xt_trader,acc        else:            print('qmt连接失败')

2、读取账户底层源代码

def balance(self):        '''        对接同花顺        '''        try:            asset = self.xt_trader.query_stock_asset(account=self.acc)            df=pd.DataFrame()            if asset:                df['账号类型']=[asset.account_type]                df['资金账户']=[asset.account_id]                df['可用金额']=[asset.cash]                df['冻结金额']=[asset.frozen_cash]                df['持仓市值']=[asset.market_value]                df['总资产']=[asset.total_asset]                return df        except:            print('获取账户失败,读取上次数据,谨慎使用')            df=pd.DataFrame()            return df

3、读取持股底仓源代码

def position(self):        '''        对接同花顺        持股        '''        try:            positions = self.xt_trader.query_stock_positions(self.acc)            print("持仓数量:"len(positions))            data=pd.DataFrame()            if len(positions) != 0:                for i in range(len(positions)):                    df=pd.DataFrame()                    df['账号类型']=[positions[i].account_type]                    df['资金账号']=[positions[i].account_id]                    df['证券代码']=[positions[i].stock_code]                    df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                    df['股票余额']=[positions[i].volume]                    df['可用余额']=[positions[i].can_use_volume]                    df['成本价']=[positions[i].open_price]                    df['参考成本价']=[positions[i].open_price]                    df['市值']=[positions[i].market_value]                    data=pd.concat([data,df],ignore_index=True)                return data            else:                df=pd.DataFrame()                df['账号类型']=None                df['资金账号']=None                df['证券代码']=None                df['股票余额']=None                df['可用余额']=None                df['成本价']=None                df['市值']=None                df['选择']=None                df['持股天数']=None                df['交易状态']=None                df['明细']=None                df['证券名称']=None                df['冻结数量']=None                df['市价']=None                df['盈亏']=None                df['盈亏比(%)']=None                df['当日买入']=None                df['当日卖出']=None                return df        except:            df=pd.DataFrame()            return df
4、读取委托底仓源代码
def today_entrusts(self):        '''        对接同花顺        今天委托        '''        def select_data(x):            if x==48:                return '未报'            elif x==49:                return '待报'            elif x==50:                return '已报'            elif x==51:                return '已报待撤'            elif x==52:                return '部分待撤'            elif x==53:                return '部撤'            elif x==54:                return '已撤'            elif x==55:                return '部成'            elif x==56:                return '已成'            elif x==57:                return '废单'            else:                return '废单'        orders = self.xt_trader.query_stock_orders(self.acc)        print("委托数量"len(orders))        data=pd.DataFrame()        if len(orders) != 0:            for i in range(len(orders)):                df=pd.DataFrame()                df['账号类型']=[orders[i].account_type]                df['资金账号']=[orders[i].account_id]                df['证券代码']=[orders[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['订单编号']=[orders[i].order_id]                df['柜台合同编号']=[orders[i].order_sysid]                df['报单时间']=[orders[i].order_time]                df['委托类型']=[orders[i].order_type]                df['委托数量']=[orders[i].order_volume]                df['报价类型']=[orders[i].price_type]                df['委托价格']=[orders[i].price]                df['成交数量']=[orders[i].traded_volume]                df['成交均价']=[orders[i].traded_price]                df['委托状态']=[orders[i].order_status]                df['委托状态描述']=[orders[i].status_msg]                df['策略名称']=[orders[i].strategy_name]                df['委托备注']=[orders[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            data['报单时间']=df['报单时间'].apply(conv_time)            data['委托状态翻译']=data['委托状态'].apply(select_data)            data['未成交数量']=data['委托数量']-data['成交数量']            data['未成交价值']=data['未成交数量']*data['委托价格']            return data        else:            print('目前没有委托')            return data
5、读取成交源代码
def today_trades(self):        '''        对接同花顺        今日成交        '''        trades = self.xt_trader.query_stock_trades(self.acc)        print("成交数量:"len(trades))        data=pd.DataFrame()        if len(trades) != 0:            for i in range(len(trades)):                df=pd.DataFrame()                df['账号类型']=[trades[i].account_type]                df['资金账号']=[trades[i].account_id]                df['证券代码']=[trades[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['委托类型']=[trades[i].order_type]                df['成交编号']=[trades[i].traded_id]                df['成交时间']=[trades[i].traded_time]                df['成交均价']=[trades[i].traded_price]                df['成交数量']=[trades[i].traded_volume]                df['成交金额']=[trades[i].traded_amount]                df['订单编号']=[trades[i].order_id]                df['柜台合同编号']=[trades[i].order_sysid]                df['策略名称']=[trades[i].strategy_name]                df['委托备注']=[trades[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            def select_data(x):                if x==xtconstant.STOCK_BUY:                    return '证券买入'                elif x==xtconstant.STOCK_SELL:                    return '证券卖出'                else:                    return '无'            df['操作']=df['委托类型'].apply(select_data)            data['成交时间']=pd.to_datetime(data['成交时间'],unit='s')            return data        else:            print('今日没有成交')                 return data

如何开通miniQMT?

1、开通门槛
目前券商限时入金10万就可以开通
    2、佣金费率
    • 股票无条件万1,根据资金量最低可以做到万0.854
    • 融资无条4.5%,根据资金量,最低可以做到4%
    3、开通福利
    • 极速柜台:普通柜台毫秒级,极速柜台微秒级延时,理论上极速柜台并发处理能力在普通柜台5倍以上
    • VIP席位 :普通席位人数众多,同一价位排单量多,导致无法在理想价位买入。VIP席位人数少,可更加快实现成交。
    福利1:低佣开量化
    福利2:领取完整教程
    福利3:添加量化讨论群
    福利4提供专业量化问题解答

    福利5:量化工具安装使用教程、视频

    福利6:极速柜台,量化投资者专用,速度微秒级