很多人用了好几年MT4,都不知道这个平台其实自带一个数据广播功能。大家想导出行情数据的时候,第一反应要么是去历史中心右键"保存",要么是到处找第三方的数据导出工具。其实MT4里面有个东西叫DDE(Dynamic Data Exchange),从Windows 3.1时代就存在的技术,一直躺在设置菜单里,但百分之九十五的人从来没碰过它。
我之所以发现这个功能,是因为几年前有个客户找我,他说不想一直盯着MT4的图表看,但又想随时知道几个主要货币对的实时价格,最好能在Excel里自己弄一个简单的盯盘面板。我当时第一反应是找第三方插件,后来翻文档的时候才注意到MetaTrader 4官方帮助里有一页叫"导出报价",里面提到了DDE服务器这个东西 。
官方文档不会告诉你的第一步
按照官方文档的说法,你得先在终端设置里把DDE服务器打开 。路径是
工具 > 选项,然后找"服务器"或者"图表"选项卡(不同版本位置不太一样),勾上"启用DDE服务器",确定后重启终端。这一步本身不难,但很多人卡在下一步。我遇到过好几个用户跟我说"我开了DDE服务器了,但Excel里还是取不到数据"。这是因为DDE服务器是"被动"的,它不会主动往外推数据,得等外部程序先来问它要,它才给。你开了这个开关,Excel里还得写公式去请求,数据才会过来。
Excel里写公式的几个坑
官方文档里给出的基本公式格式是这样的:
=MT4|BID!EURUSD 获取买价,=MT4|ASK!EURUSD 获取卖价,=MT4|TIME!EURUSD 获取时间戳 。把这个公式贴到Excel的单元格里,理论上就能看到实时价格了。但这个"理论上"有个前置条件,文档里其实写了,但很多人没注意到——"Quotes are given through DDE only at incoming of new ticks (ADVISE mode), but not immediately on request (REQUEST mode) where the latest price is shown. N/A is shown on the first REQUEST, and after the new price has been income, quotes will appear" 。翻译成人话就是:你第一次把公式贴进去的时候,Excel里显示的是
N/A,得等到MT4那边来一个新Tick,价格才会刷出来。很多人第一次看到N/A以为是自己设置错了,其实不是,等几秒钟就好了。一个官方文档没写的多品种导出坑
这是我自己踩了无数次坑之后才总结出来的经验。如果只导一个品种,
=MT4|BID!EURUSD这个写法完全够用。但如果你想同时看EURUSD、GBPUSD、USDJPY、EURJPY、AUDUSD……你会发现Excel有时候刷得动,有时候刷不动,有些格子更新了,有些格子死活不更新,看起来毫无规律。我后来发现,Excel里每个
=MT4|...这样的公式,都会和MT4的DDE服务器建立一条独立的连接。而MT4的DDE服务器能同时维持的连接数是有限制的。我在Win10机器上测大概是10到12条连接左右是稳定上限,超过这个数就开始丢数据。Win11上更夸张,我试过只挂了8个品种,每个品种取BID和ASK两个值,总共16条连接,Excel直接卡死了。我自己摸索出来的替代方案
这个方案在MetaQuotes的任何官方文档里都没找到,是我自己用了三年多验证出来的。文档里其实提到了另一种请求格式:
=MT4|QUOTE!EURUSD 。这个格式返回的不是单个价格,而是一个包含"日期 时间 买价 卖价 最后价"的长字符串。关键就在于用这个格式,每个品种只占一条DDE连接,而不是四条。然后在Excel里用
LEFT()、MID()、RIGHT()这些字符串拆分函数,从这一个格子里把买价、卖价、时间分别提取出来。这样一来,同样10个品种,原来需要40条DDE连接,现在只需要10条,稳定性和刷新速度完全不是一个级别的。我在Win10和Win11两台机器上对比测试过这个方案。Win10上两种方式差别不大,但Win11上,多请求方式挂8个品种就卡死,
QUOTE方式挂到20个品种Excel依然流畅。我不知道这是MT4在Win11上的DDE实现有什么差异,但实际结果摆在那里。关于自动刷新的那点事
如果你想让Excel定时刷新这些DDE数据,网上最常见的方案是用VBA写个
Application.Calculate来强制重算。但我自己试下来,Application.Calculate不一定能触发DDE更新。微软官方关于Excel DDE的文档里提到,用Application.OnTime定时刷新公式单元格本身,比用Calculate更可靠。我实测确实如此。这是我目前在用的一个最简单的刷新宏:
``
vba
Public Sub RefreshDDE()
Dim targetCell As Range
Set targetCell = Range("A1") ' 放DDE公式的那个格子
targetCell.Formula = targetCell.Formula ' 重新写入公式,强制刷新
Call Application.OnTime(Now + TimeValue("00:00:02"), "RefreshDDE")
End Sub
``每两秒刷新一次,数据基本跟得上Tick速度,又不会把Excel跑崩。
关于VPS的一个额外提醒
如果是在VPS上跑这个方案,有一个问题需要留意——Excel的自动保存可能会引发DDE连接的中断。我跑测试的时候发现,Excel如果打开了自动保存,每隔几分钟往网络盘写一次文件,MT4的DDE服务器可能因为文件系统延迟而断开连接。我的解决方式很简单:Excel文件保存在VPS本地磁盘上,不要放在网络映射盘。如果需要在本地电脑上看数据,用远程桌面连上去看就行了。这个经验来自我用的VPS服务商的技术文档里的一条性能建议,在DDE这种老技术上体现得特别明显。
这整套方案从我开始用到今天,前后给三个客户搭过类似的数据面板,成本为零,效果稳定。它不算什么高科技,但在第三方数据工具动辄收几十美金一个月的背景下,多花二十分钟把DDE调通,省下的钱拿去交保证金不香吗。
参考来源:MetaTrader 4帮助中心 – 导出报价(metatrader4.com),微软技术支持 – Excel DDE相关说明(learn.microsoft.com)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。