上周有个群友在问,说自己想把MT4的账户历史导出来做张资金曲线图,想看看回撤到底有多深。我顺手回了一句"右键复制就行",结果他发过来一张截图——全是平仓盈亏的单子,没有时间戳,也没有账户余额的连续变化。这就尴尬了。后来我才意识到,MT4自带的"保存为报表"功能生成的是HTML文件,里面虽然什么都有,但你要把它弄进Excel画图,得手动复制粘贴半天。至于那个"账户历史"右键另存为,只能导出成交单,不会帮你把权益的变化曲线算出来。
我两年前开始自己做资金曲线监控的时候,也掉过这个坑。当时我要给一家资方交作业,他们要的是每天收盘时的账户净值曲线,不是一张简单的月结单。我翻遍了MT4的菜单栏,愣是没找到一个叫"导出CSV"的按钮。
于是我自己动手写了个脚本。一开始我试图直接用
OrderHistorySelect()把所有订单捞出来,然后把每笔盈亏累加到初始余额上,生成一个逐笔的时间序列。逻辑上没问题,但跑起来发现数据量一大(我那个账户做了快三年,几千笔交易),脚本就跑得很慢。后来查MQL4官方文档,里面关于OrderSelect()函数的介绍就几句话,没提性能的事。我自己的独家经验是:在循环里每处理一笔订单后加一个
Sleep(1)或者Sleep(50),别让脚本把CPU吃满,反而整体执行效率更高,因为MT4的终端会把资源优先分配给图表刷新和网络通信。这个技巧在官方文档里是找不到的,是我反复测试了七八次才总结出来的。另外,AccountBalance()这个函数在脚本里如果频繁调用,返回的数据会有延迟,所以我改用累加计算的方式,用初始余额加上所有已平仓盈亏的累计和,这样算出来的每笔订单后的权益值才是准确的。具体操作步骤(带脚本逻辑):
- 用
OrderHistorySelect()获取全部历史订单。- 用一个变量
currentBalance记录当前权益,从AccountInfoDouble(ACCOUNT_BALANCE)获取初始值,然后按时间顺序遍历每一笔已平仓订单,把OrderProfit()加上OrderSwap()和OrderCommission()累加进去。- 每处理一笔,用
FileOpen()写入一行CSV:时间戳、当前权益、累计盈亏。FileOpen创建CSV文件时,注意用FILE_CSV|FILE_WRITE模式,分隔符建议用逗号,这样Excel直接双击打开就能识别。MQL4\Files文件夹里找到生成的CSV文件。顺带提一句,有些朋友会用历史数据中心(按F2)导出的数据来做回测分析,但那个导出的是价格K线数据,跟账户盈亏没有半毛钱关系,千万别搞混了。另外,如果你的交易品种带后缀(比如"GER30."),在脚本里处理字符串的时候记得把后缀去掉,否则
OrderSymbol()匹配不上,官方文档里关于SymbolInfoString()的示例代码没提这种特殊字符的处理,这也是个容易踩的坑。| 方法 | 是否包含盈亏数据 | 是否带时间戳 | 能否直接画资金曲线 |
| ---- | ---------------- | ------------ | ------------------ |
| 保存为报表(HTML) | 是 | 是 | 不能(格式问题) |
| 账户历史右键复制 | 是(仅交易记录) | 是 | 不能(没有权益计算) |
| 自定义脚本导出 | 是(含逐笔权益) | 是 | 能(标准CSV格式) |
参考来源:MQL4官方文档 - OrderSelect、OrderHistorySelect函数(docs.mql4.com);MetaQuotes帮助中心 - 账户信息相关说明(help.metaquotes.net)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。
```