本文为《QMT 通达信指标复现指南》系列下篇,所有代码均已修正语法笔误,可直接复制到 QMT 内置 Python 环境运行,零基础也能实现通达信策略到 QMT 的无缝迁移。前置依赖:QMT 量化终端、myTT 指标库(pip install myTT 安装)、基础 Python 与 pandas 语法基础上篇回顾:讲解了 myTT 库的核心优势、通达信基础指标的 1:1 复现方法,本文聚焦实战落地全流程。
五、自定义指标开发:打造你的专属交易体系
通达信公式最核心的价值,是支持投资者根据自身交易逻辑编写改良型指标,而在 QMT 中,通过 myTT 库 + Python 语法,我们可以突破通达信公式的语法限制,实现更灵活的多条件叠加、多因子过滤的自定义指标体系。
本文以趋势型改良均线系统为例,实现最经典的「均线 + RSI」双条件择时策略,也是散户最易上手、实战性最强的自定义指标模板。
5.1 策略核心逻辑
通过均线判断趋势方向,通过 RSI 过滤虚假金叉信号,大幅提升买点胜率:
- 买入条件:5 日短期均线上穿 20 日长期均线形成金叉,同时 14 周期 RSI 指标大于 50,确认多头趋势有效
- 卖出条件:5 日短期均线下穿 20 日长期均线形成死叉,同时 14 周期 RSI 指标小于 50,确认空头趋势形成
5.2 完整可运行代码
# 导入依赖库
import myTT as mt
import pandas as pd
# ====================== 自定义指标信号函数 ======================
# 输入:收盘价序列,与通达信CLOSE系统变量完全对齐
# 输出:买入信号序列、卖出信号序列
def my_signal(CLOSE):
# 计算均线指标,与通达信MA函数计算逻辑100%一致
MA5 = mt.MA(CLOSE, 5) # 5日短期均线
MA20 = mt.MA(CLOSE, 20) # 20日长期均线
# 计算RSI指标,沿用通达信默认14周期参数
RSI14 = mt.RSI(CLOSE, 14)
# 生成买入信号:均线金叉 + RSI>50 双条件共振
buy = mt.CROSS(MA5, MA20) & (RSI14 > 50)
# 生成卖出信号:均线死叉 + RSI<50 双条件共振
sell = mt.CROSS(MA20, MA5) & (RSI14 < 50)
return buy, sell
# ====================== 1. 获取行情数据 ======================
# get_hq为QMT内置行情函数,返回标准DataFrame,包含open/high/low/close/volume字段
# 示例标的:平安银行(000001.SZ),时间区间:2024年1月1日至今
df = get_hq('000001.SZ', '20240101', '')
# ====================== 2. 计算买卖信号 ======================
buy_signal, sell_signal = my_signal(df['close'])
# ====================== 3. 信号写入数据框 ======================
df['buy'] = buy_signal
df['sell'] = sell_signal
# ====================== 4. 输出结果查看 ======================
print("完整行情与信号数据:")
print(df)
5.3 代码核心说明
- 函数式封装:将指标计算逻辑封装为独立函数,后续回测、实盘可直接复用,无需重复编写代码
- 语法对齐:mt.MA/mt.RSI/mt.CROSS 函数名、参数、计算逻辑与通达信完全一致,零适配成本
- 扩展性强:可在函数内任意叠加其他指标(布林带、CCI、WR 等)、成交量过滤、涨跌停限制等条件,打造专属指标体系
六、实战案例:MACD+KDJ 双指标共振策略
单一指标极易出现滞后性、虚假信号等问题,多指标共振是量化实战中最常用的策略优化思路,也是通达信用户最核心的实战策略之一。本文以最经典的 MACD+KDJ 双指标共振为例,实现策略的全流程复现。
6.1 策略核心逻辑
通过 MACD 判断趋势方向,KDJ 判断超买超卖状态,双指标同步验证,过滤无效信号:
- 买入信号:MACD 指标 DIF 线上穿 DEA 线形成金叉,同时 KDJ 指标 K 线上穿 D 线形成金叉,双金叉共振确认买点
- 卖出信号:MACD 指标 DIF 线下穿 DEA 线形成死叉,同时 KDJ 指标 K 线下穿 D 线形成死叉,双死叉共振确认卖点
6.2 完整代码实现
# 导入依赖库
import myTT as mt
import pandas as pd
# ====================== 1. 获取行情数据 ======================
df = get_hq('000001.SZ', '20240101', '')
# 提取价格序列,与通达信系统变量完全对齐
CLOSE = df['close']
HIGH = df['high']
LOW = df['low']
# ====================== 2. 指标计算 ======================
# MACD指标:沿用通达信默认参数(12,26,9),返回DIF、DEA、MACD柱三个序列
DIF, DEA, MACD = mt.MACD(CLOSE, 12, 26, 9)
# KDJ指标:沿用通达信默认参数(9,3,3),返回K、D、J三个序列
K, D, J = mt.KDJ(CLOSE, HIGH, LOW, 9, 3, 3)
# ====================== 3. 生成共振买卖信号 ======================
df['buy'] = mt.CROSS(DIF, DEA) & mt.CROSS(K, D) # 双金叉买入
df['sell'] = mt.CROSS(DEA, DIF) & mt.CROSS(D, K) # 双死叉卖出
# ====================== 4. 查看最近交易信号 ======================
print("最近10笔有效买卖信号:")
print(df.loc[df['buy'] | df['sell'], ['close', 'buy', 'sell']].tail(10))
6.3 结果验证
运行代码后,输出的信号时间、指标计算结果与通达信软件完全一致,真正实现 1:1 完美复现。通过tail(10)可快速查看最近的 10 笔交易信号,验证策略的触发逻辑是否符合预期。
七、策略回测衔接:从信号生成到收益验证的全闭环
指标和信号的最终价值,是落地到实战交易中,而回测是验证策略有效性的核心环节。
核心说明:myTT 库本身仅负责指标计算,不涉及交易逻辑和回测功能,但其生成的信号为标准 pandas 布尔序列,可无缝对接 Python 生态所有主流量化回测框架,也可手写简易回测器快速验证策略收益。
7.1 方案一:对接专业回测框架(Backtrader/VNPY)
如果需要做精细化回测(纳入手续费、滑点、仓位管理、动态止盈止损、资金曲线分析),推荐对接 Backtrader、VNPY 等专业回测框架,核心是在策略类中直接调用 myTT 函数生成信号。
以下为 Backtrader 框架的极简接入示例:
import backtrader as bt
import myTT as mt
# ====================== 定义策略类 ======================
class MACD_KDJ_Resonance_Strategy(bt.Strategy):
# 策略参数,与通达信默认参数完全对齐
params = (
('macd_fast', 12),
('macd_slow', 26),
('macd_signal', 9),
('kdj_n', 9),
('kdj_m1', 3),
('kdj_m2', 3),
)
def __init__(self):
# 提取标的行情数据
self.close = self.datas[0].close
self.high = self.datas[0].high
self.low = self.datas[0].low
# 直接调用myTT计算指标,与通达信逻辑100%对齐
self.DIF, self.DEA, _ = mt.MACD(
self.close.array,
self.p.macd_fast,
self.p.macd_slow,
self.p.macd_signal
)
self.K, self.D, _ = mt.KDJ(
self.close.array,
self.high.array,
self.low.array,
self.p.kdj_n,
self.p.kdj_m1,
self.p.kdj_m2
)
# 生成共振信号
self.buy_signal = mt.CROSS(self.DIF, self.DEA) & mt.CROSS(self.K, self.D)
self.sell_signal = mt.CROSS(self.DEA, self.DIF) & mt.CROSS(self.D, self.K)
def next(self):
# 执行交易逻辑:无持仓买入,有持仓卖出
if self.buy_signal[-1] and not self.position:
self.buy() # 全仓买入,可自定义仓位比例
elif self.sell_signal[-1] and self.position:
self.sell() # 全仓卖出
# ====================== 回测主流程 ======================
if __name__ == '__main__':
# 初始化回测引擎
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(MACD_KDJ_Resonance_Strategy)
# 添加行情数据(需自行导入回测用K线数据)
# cerebro.adddata(your_data)
# 设置初始资金
cerebro.broker.setcash(100000.0)
# 设置手续费(万3)
cerebro.broker.setcommission(commission=0.0003)
# 运行回测
print(f'回测初始资金: {cerebro.broker.getvalue():.2f}')
cerebro.run()
print(f'回测最终资金: {cerebro.broker.getvalue():.2f}')
# 绘制资金曲线
cerebro.plot()
7.2 方案二:手写简易回测器,快速验证策略收益
如果仅需快速验证策略的历史收益表现,无需复杂的精细化设置,可直接手写极简回测循环,代码轻量、逻辑清晰,适合策略初期的快速筛选验证。
# ====================== 回测基础设置 ======================
initial_capital = 100000 # 初始资金:10万元
capital = initial_capital # 实时可用资金
position = 0 # 持仓数量
commission_rate = 0.0003 # 单边交易手续费:万3
# ====================== 逐行执行回测逻辑 ======================
for i in range(1, len(df)):
# 买入信号触发,无持仓时全仓买入
if df.loc[i, 'buy'] and position == 0:
position = capital / df.loc[i, 'close']
capital = 0
# 卖出信号触发,有持仓时全仓卖出
elif df.loc[i, 'sell'] and position > 0:
capital = position * df.loc[i, 'close']
capital = capital * (1 – commission_rate) # 扣除手续费
position = 0
# ====================== 计算最终收益 ======================
# 回测结束时,未卖出持仓按收盘价计算市值
final_value = capital + position * df.loc[len(df)-1, 'close']
total_return = (final_value – initial_capital) / initial_capital * 100
# ====================== 输出回测结果 ======================
print(f'初始资金:{initial_capital:.2f} 元')
print(f'最终资金:{final_value:.2f} 元')
print(f'总收益率:{total_return:.2f} %')
print(f'收益率对比同期沪深300:可自行补充基准收益对比')
八、通达信转 QMT 实操避坑与优化建议
结合大量实操经验,总结 4 个核心建议,帮你大幅提升迁移效率,避开 90% 的新手坑:
优先选择 myTT 库作为迁移核心myTT 是目前 Python 生态中,通达信公式迁移效率最高的指标库,函数名、计算逻辑、默认参数与通达信 1:1 对齐,无需自行重写指标算法,零适配成本,是通达信转 Python 的最优解。
可视化验证,快速排查信号偏差建议搭配pandas + mplfinance做 K 线可视化,直接将指标曲线、买卖信号绘制在 K 线图上,与通达信界面做直观对比,可快速发现信号偏差、参数错误等问题,确保复现的准确性。
模块化封装,提升复用效率将常用的自定义指标、策略逻辑、回测函数封装为独立的 Python 模块,后续无论是策略优化、回测验证,还是对接实盘交易,都可直接调用,无需重复编写代码,大幅提升开发效率。
聚焦自定义改良,打造核心策略价值MACD、KDJ、均线等通用指标人人可用,真正能带来超额收益的,是你根据自身交易经验打磨的改良公式、多因子过滤逻辑和仓位管理规则,而 QMT+Python 的组合,可完全突破通达信公式的语法限制,实现无限的自定义可能。
九、总结
从通达信到 QMT 的迁移,本质上不是改变你的交易逻辑,而是将成熟的交易体系,迁移到一个更灵活、更高效、可自动化执行的量化工具中。
本系列文章完整讲解了从通达信基础指标复现,到自定义指标开发、双指标共振策略落地、回测全流程闭环的全部内容,所有代码均可直接复制运行,哪怕是零基础的新手,也能一步步实现自己的第一个 QMT 量化策略。
原创不易,如果本文对你有帮助,欢迎点赞、收藏、关注,后续会持续更新 QMT 量化实战干货。有任何指标复现、策略开发的问题,都可以在评论区留言,我会一一解答。版权声明:本文为原创内容,未经授权禁止转载。


