VBA公式模型
QMT 的 VBA 公式系统是其量化交易版里的公式编写系统,用类 VB 的公式语言写指标、选股、图表化和程序化交易策略。从通达信、文华麦语言、同花顺等公式平台迁移过来的交易者最容易上手——它的「数据引用」「跨周期调用」思路和那些平台一脉相承。本章讲清编写规则、数据引用和两种运行原理。
本篇需要读者对 VB 类语言的写法有基本了解。
模型的编写规则
在系统面板左侧模型树右键,可对模型策略 新建/编辑/导入。新建模型时,编辑器主界面定义以下内容:
| 设定 | 说明 |
|---|---|
| 名称 | 中文/字母/数字组成,同类公式中必须唯一 |
| 描述 | 一段文字,简述公式含义,列表显示用,不宜过长 |
| 位置 | 主图叠加(如 MA、BOLL)还是副图 |
| 参数 | 计算参数:参数名、最小值、最大值、缺省值、步长——替代公式里的常数,方便调参不改代码 |
| 其他 | 加密、快速计算、刷新间隔等(支持凭密码导出加密公式) |
| 用法注释 | 详细说明如何使用、注意事项、计算方法 |
| 交易参数 | 单股模型通过接口直接下单的交易参数设置 |
所有公式系统遵守统一的运算法则和格式。例如:
A:=X+Y;
B:=A/Z;
C:=B*0.618;
数据类型:变量与常量
公式中的基本数据来源于接收的行情数据,按是否随时间变化分两类:
- 变量:随时间变化的数据,如成交量、收盘价。
- 常量:永远不变的数据,如数字
5。
函数对参数类型有要求,不能乱用。例如均线 MA(CLOSE, 5):
MA第一个参数要求是变量,CLOSE返回的正是变量——正确。MA第二个参数要求是常量,5是常量——正确。- 所以不能写成
MA(5, CLOSE)——参数顺序和类型都错了。
函数计算的结果一般是一个变量(序列)。
赋值与输出
| 符号 | 含义 |
|---|---|
:= | 赋值,中间变量,不画线 |
: | 输出,画一条指标线 |
MA5:=MA(CLOSE,5); // 中间变量,不画
MA20:MA(CLOSE,20); // 输出,画一条线
特殊数据引用
1. 引用其它指标
调用别的指标公式,格式 "指标.指标线"(参数):
| 写法 | 含义 |
|---|---|
"MACD.DEA"(26,12,9) | MACD 的 DEA 线,参数 26/12/9 |
"MACD"(26,12,9) | MACD 的最后一条线 |
"MACD" | MACD 最后一条线,用默认参数 |
指标和指标线之间用顿号分开,参数在末尾用括号括起、逗号分隔,整个表达式用引号引住。
2. 跨周期引用指标
引用不同分析周期上的指标,基本格式 "指标.指标线#周期"(参数):
| 周期代码 | 含义 | 周期代码 | 含义 | |
|---|---|---|---|---|
MIN1 | 1 分钟 | DAY | 日线 | |
MIN5 | 5 分钟 | WEEK | 周线 | |
MONTH/YEAR | 月线/年线 |
"MACD.DEA#WEEK"(26,12,9):当天所在本周的 MACD DEA。"MACD.DEA##WEEK"(26,12,9):扩展格式,上一周的数据(##比#多回退一个周期)。
⚠️ 系统翻看品种时可以自动补数据,但无法自动补被引用品种或不同周期的数据。首次使用或不确定数据齐全时,务必手工补充数据。
3. 跨品种引用
引用其它个股或大盘数据,格式 "品种代码$数据":
"SZ000002$VOL" // 000002 本周期成交量
"SH000001$CLOSE" // 上证指数本周期收盘(大盘当个股处理)
更灵活的跨品种/周期引用用函数:
CALLSTOCK:引用其它证券或合约的部分基础数据。STKINDI:引用任意品种、任意周期、任意指标的输出(模型编辑器函数列表里有详细说明)。
两种运行模式
这是 VBA 公式系统的核心区别——同一个公式可以按两种原理运行:
序列模式
整个序列(所有 K 线)一次性参与计算,公式像对数组做运算。适合纯技术指标计算,速度快,但不能写复杂的逐根逻辑(如循环、依赖前一根状态的递推)。
逐 K 线模式
自左向右逐根 K 线驱动,每根 K 线触发一次公式计算。可以使用循环、条件判断、引用历史 K 线的状态,表达力强,适合写交易策略(需要根据持仓和历史信号做判断)。
写程序化交易策略大多用逐 K 线模式,因为它能逐根判断信号、记录状态;纯画指标用序列模式更快。
一个简单的公式示例
双均线金叉死叉的公式雏形:
{参数:FAST(5,1,100,5), SLOW(20,1,100,20)}
MA_FAST:=MA(CLOSE,FAST);
MA_SLOW:=MA(CLOSE,SLOW);
GOLD:CROSS(MA_FAST,MA_SLOW); // 金叉:快线上穿慢线,输出信号
DEAD:CROSS(MA_SLOW,MA_FAST); // 死叉:慢线上穿快线
CROSS(A,B)是上穿判断函数(A 上穿 B 返回 1)。- 在模型编辑器里把它设为「条件选股」或「程序化交易」,配合交易参数即可用于选股和下单。
何时选 VBA,何时选 Python
| 情况 | 推荐 |
|---|---|
| 从通达信/文华/同花顺公式迁移,逻辑已用公式表达 | VBA 公式 |
| 跨周期、多指标叠加的技术分析 | VBA(跨周期引用方便) |
| 选股、条件预警、图表化指标 | VBA |
| 复杂的资金管理、动态仓位、多品种组合 | 内置 Python |
| 需要丰富第三方库(统计/机器学习) | 内置 Python / XtQuant |
VBA 公式和内置 Python 可以分工:公式做信号和指标,Python 做下单和组合管理。
下一步
公式和 Python 都会了。要查具体品种的字段、代码格式、因子,看 数据字典与品种数据。