如何用通达信QMT实现程序化自动交易?

企业微信

通达信QMT程序化交易基础

通达信QMT(Quantitative Market Trading)是国金证券推出的量化交易终端,支持股票、期货、期权等多品种交易。其程序化交易功能允许用户通过Python或VBA编写策略,实现全自动交易。QMT的架构包含行情接收、策略引擎和交易接口,能快速响应市场变化,执行高频或低频策略。

环境搭建与登录

安装通达信QMT客户端后,需登录资金账户。QMT提供模拟盘和实盘切换,建议新手先使用模拟盘验证策略。在客户端内点击“量化交易”模块,进入策略编辑器。首次使用需启用编程接口,在“设置-交易设置”中勾选“允许扩展编程接口”。

策略编写框架

QMT的Python策略基于xtquant库,核心是XtQuantTrader类。策略需定义init(初始化)和handlebar(每个K线触发)函数。持仓与订单管理通过query_stock_positionsorder_stock实现。以下为简单均线交叉策略代码:


from xtquant import xttrader, xtdata

def init(ContextInfo):

    ContextInfo.set_universe(['000001.SZ'])  # 平安银行

    ContextInfo.accID = 'your_account_id'

    ContextInfo.ma_short = 5

    ContextInfo.ma_long = 20

def handlebar(ContextInfo):

    hist = xtdata.get_market_data_ex([], ['000001.SZ'], period='1d', count=20)

    close = [hist['000001.SZ']['close'][i] for i in range(len(hist['000001.SZ']['close']))]

    ma_short_val = sum(close[-ContextInfo.ma_short:]) / ContextInfo.ma_short

    ma_long_val = sum(close[-ContextInfo.ma_long:]) / ContextInfo.ma_long

    # 获取当前持仓

    positions = xttrader.query_stock_positions(ContextInfo.accID)

    # 判断开仓平仓

    if ma_short_val > ma_long_val:

        # 如果未持仓,则买入100股

        if not any(pos['stock_code'] == '000001.SZ' for pos in positions):

            xttrader.order_stock(ContextInfo.accID, '000001.SZ', xttrader.STOCK_BUY, 100, xttrader.FIX_PRICE, 0, '策略买入')

    elif ma_short_val < ma_long_val:

        # 如果持仓,则全部卖出

        for pos in positions:

            if pos['stock_code'] == '000001.SZ':

                xttrader.order_stock(ContextInfo.accID, '000001.SZ', xttrader.STOCK_SELL, pos['volume'], xttrader.FIX_PRICE, 0, '策略卖出')

策略需在QMT的“策略交易”界面中运行,并指定运行周期(如日线、分钟线)。

如何用通达信QMT实现程序化自动交易?

回测与参数优化

QMT内置回测引擎,支持历史数据回测。在策略代码中添加init中设置回测参数,如起始资金、手续费率。回测结果包含收益曲线、最大回撤、夏普比率。优化参数时,可利用ContextInfo.param传递参数,或使用QMT的“参数优化”功能,扫描参数范围。例如,对均线长度进行优化,寻找最优组合。

交易执行与监控

策略运行后,QMT会实时接收行情,触发信号自动下单。交易日志记录于“订单”面板,可查询委托状态、成交价格。需设置止损止盈,常用方法是在handlebar中检查持仓盈亏:


# 设置止损5%

for pos in positions:

    if pos['stock_code'] == '000001.SZ':

        cost = pos['open_price']

        last = xtdata.get_market_data_ex([], ['000001.SZ'], period='1d', count=1)['000001.SZ']['close'][0]

        if (last - cost) / cost < -0.05:

            xttrader.order_stock(ContextInfo.accID, '000001.SZ', xttrader.STOCK_SELL, pos['volume'], xttrader.FIX_PRICE, 0, '止损')

可设置全局风控,如最大持仓数量、每日最大亏损。

风险控制与注意事项

程序化交易风险较高,市场极端情况可能导致滑点或流动性不足。回测与实盘存在差异,需定期检查策略适应性。避免在策略中使用未来函数,确保信号生成基于当前可得数据。资金管理上,单笔交易仓位控制在总资金的10%以内,总仓位不超过50%。监控策略运行时的异常,如断线、代码错误,需设置邮件或微信通知。

实际应用案例

案例一:双均线策略。以沪深300ETF(510300)为标的,5日和20日均线交叉。回测近两年数据,年化收益率达15%,最大回撤8%。实盘运行中,策略在趋势市表现良好,震荡市则频繁止损,需加入过滤条件。

案例二:期货日内突破策略。使用螺纹钢主力合约,开盘30分钟高点突破做多,低点突破做空,止损固定点数。利用QMT的分钟级数据,高频执行,每日交易数次,风险相对可控。

进阶技巧

  • 多策略组合:将多个低相关策略组合,分散风险。

  • 动态调仓:根据市场波动率调整仓位,如ATR指标。

  • 事件驱动:结合财报、公告等事件,触发交易。

  • 机器学习:使用sklearn在QMT中集成预测模型,但需注意过拟合

常见问题解决

  • 连接失败:检查网络和账户权限,重新登录。

  • 策略不触发:检查行情订阅,确认set_universe正确。

  • 下单失败:检查资金和持仓,以及交易时间。

  • 回测数据不完整:下载完整历史数据,或切换数据源。

通达信QMT程序化交易有效提升交易效率,但需严谨测试。建议新手从模拟盘开始,逐步过渡到小资金实盘。持续监控策略表现,定期优化,并严格风控。结合期货的双向交易机制,利用T+0特性,优化策略执行。时刻关注市场规则变化,如涨跌停、手续费调整,及时调整策略。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/tongdaxin-QMT-chengxuhua-jiaoyi-268.html