有人把一段自编公式拿去问能不能改成 MT4 的写法,问题落回一句话:通达信公式和MT4区别到底在哪。回答之前先别急着比语法细节,先看两边各自解决的是哪一层问题。

这篇按两条线对照,一条是语法与函数体系,另一条是数据源与用途。两套软件服务的市场不同,把函数名摆在一起对面看,容易把不同层次的东西当成同一件事。

一、两套生态:一个面向信号,一个面向执行

通达信的公式跑在本地的行情客户端里。输入是本地行情库里的时间序列,开盘价、最高价、最低价、收盘价、成交量这些字段按 K 线逐根排列;输出是条件成立与否、图上的一条线,或者一次预警弹窗。落点在算出一个可以观察到的结果。

MT4 与 MT5 的 EA(Expert Advisor,智能交易程序)也跑在客户端上,核心接口是一组订单函数:发单、改单、平仓、查持仓与账户状态。落点在按规则把订单送到经纪商。判断和执行分属两层,公式负责判断,EA 负责把判断落成订单动作。

回到通达信公式和MT4区别这个问题,第一步是确认自己要的是哪一层。目标是筛出一批满足条件的标的来观察,通达信这边的函数更贴合这件事;目标是让一段逻辑按行情事件自动发单,那属于 EA 的范畴。两边的输入输出对不上,语法自然对不上。

二、语法对照:赋值、条件、循环、指标调用

四个语法点摆成一张表,差别看得清楚:赋值、条件、循环、指标调用。

对照项 通达信公式 MT4/MT5 的 EA
赋值 变量名加冒号与表达式,如 MA20:MA(CLOSE,20); 先声明数据类型再赋值,如 double ma20 一类写法
条件 取值形式,IF(条件, 真值, 假值),返回的是序列 语句形式,if(条件) 后面接执行块,控制的是流程
循环 面向序列,用 REF、SUM、COUNT 一类函数替代显式循环 用 for、while 显式遍历
指标调用 函数名加参数与周期,如 MA(CLOSE,20) 先取得指标句柄,再按缓冲区位置取值

这张表里,条件的差别容易被忽略。通达信的 IF 是取一个值,两个分支都会被算出来,只是取哪一个由条件决定;EA 的 if 是走一条分支,条件不成立的那段代码不执行。写条件时把这两种语义混在一起,是重写时出错的一个来源。

循环这一行也值得展开。通达信的序列函数对整段序列一次性作用,写法短,但每条 K 线的取值依赖它前后若干根;EA 的显式循环逐项遍历,控制粒度细,代价是边界要自己管。两边代码的可读性来自不同的地方。

三、函数体系:时间序列函数与订单函数

通达信的函数围绕序列组织。MA、EMA 做平滑,REF 做位移,HHV、LLV 取区间极值,COUNT、SUM 做区间统计,输入是序列,输出也是序列,按 K 线下标逐根推进。写一段条件,本质是对序列做逐根的判断。

EA 的函数分成几组。技术指标函数是一组,iMA、iRSI 这些;订单与账户函数是另一组,负责发单、平仓、查询;再往下是事件回调,OnTick 在新报价到达时触发,OnTimer 按定时器触发。前一组看着和通达信的函数有点像,取数方式不同:EA 里要先拿到指标句柄,再按缓冲区位置取值。

运行方式是两套体系的分水岭。EA 由事件驱动,行情每来一笔就触发一次回调;通达信公式随每根 K 线重算,没有等价的逐笔触发回调。要不要按笔响应,决定了逻辑该写在哪一边。

四、数据源:本地行情库与经纪商报价

通达信的行情来自本地行情库,盘后把数据下载到本地,公式在本地算。板块归属、财务字段这些由客户端提供,用板块类函数取到的是板块名字符串,用财务类函数按序号取到的是财务数值。这套数据的口径围绕 A 股编制。

MT4 与 MT5 走经纪商服务器的报价。同一个品种在不同经纪商那里的报价、点差、历史数据深度都可能不同,它面向的品种以外汇与差价合约为主。回到通达信公式和MT4区别,数据源这一层比语法更难对齐:两边的字段集合本来就不是一套。

A 股的十档盘口、逐笔成交这类字段,在通达信这边有对应取数;MT4 的品种里没有 A 股现货这一套。反过来,经纪商侧的成交回执与账户持仓,是通达信公式取不到的。取不到的数据,写不出对应的条件,这一层要单独确认。

通达信一侧(以通达信金融终端个人版为准)
条件示例   CROSS(CLOSE,MA(CLOSE,20))
取值示例   MA20:MA(CLOSE,20);
下穿写法   CLOSE < MA(CLOSE,20)

MT4/MT5 一侧
指标句柄   先取 iMA 一类函数的句柄
缓冲区     再按位置读取句柄对应的缓冲区
交易函数   以 MQL4/MQL5 官方文档列出的交易函数为准

五、公式能不能互转:不能直译,只能重写

把一段通达信公式逐行改名搬到 EA 里,这条路走不通。三处对不上:函数体系不同,运行模型不同,数据字段不同。能搬走的是逻辑意图,代码本身搬不走。

重写的做法是先抽意图,再分别表达。比如收盘价上穿 20 周期均线这层意思,在通达信这边写成 CROSS 加 MA,在 EA 那边写成 iMA 取均线值,再逐步比较相邻两根的收盘价与该均线值。同一个意图,两套写法。

重写时要核对三处口径。函数语义要核对,均线在 MT4 里要显式指定平滑模式,不同模式算出的曲线不同;周期口径要核对,K 线周期与数据起点不一致,同一个条件选出的时间点会不一样;单位要核对,价格的最小变动单位在两边不同,涉及阈值的判断要换算。

六、适用场景对照:先确认要解决什么

把选择还原成需求到落点的对照,判断会简单些。

现象/提示 含义 处理
只要在图上画线、出预警 需求落在信号层 用通达信公式,围绕时间序列函数与选股条件写
要让逻辑在行情事件里自动发单 需求落在执行层 属于 EA 范畴,交易函数与事件回调在 MT4/MT5 一侧
把一段公式贴过去改名 当成可直译 不可行,按函数语义与数据字段逐句重写
同一个指标两边算出来对不上 函数语义或数据口径不同 核对平滑方式、周期与数据起点,两边各自验证

这张表的第一行与第二行是分岔口。选了信号层,后面遇到的是函数与字段的问题;选了执行层,后面遇到的是事件模型与订单接口的问题。两边都要碰的人,把两段逻辑分开写,比强行合到一套里更好维护。

七、核对顺序与能力边界

要把通达信公式和MT4区别这件事落到自己的场景里,按下面的顺序走一遍。

  1. 先写下要解决的是信号还是执行,只写一句
  2. 再看目标平台提供哪些函数,通达信侧查公式管理器的函数说明,EA 侧查官方文档
  3. 把逻辑意图逐句表达,能对应的重写,对应不上的舍掉并记下原因
  4. 两边各自验证,通达信侧挂副图看输出,EA 侧在官方的策略测试器里看行为

这篇的边界写在前面:站方未在两套平台上逐项跑过每一组函数对照,本文给的是语法与数据源的对照路径,具体函数支持范围以各软件官方文档与版本说明为准,不同版本的函数集合与措辞有差异。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。回到最初那句场景提问,先答要解决的是信号还是执行,这个问题答完,通达信公式和MT4区别落到自己场景里的取法也就清楚了。

站内还有 指标资源选择 的其他条目,跨平台对比与公式转换 里讲公式怎么在平台之间搬,公式编写教程 里讲函数用法,可对照查看。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。