最近帮一个朋友整理交易记录去报税,本来以为就导个数据的事,结果折腾了大半天。MT4这个软件吧,功能都藏在犄角旮旯里,尤其是跟数据导出相关的东西,不翻遍菜单根本找不全。
事情是这样的,我朋友需要用CSV格式的三年的交易明细,拿去做Python分析。我第一反应就是MT4不是有个"保存为详细户口结单"吗?右键一点,HTML文件出来了,打开一看排版还挺漂亮,资金曲线图、月度统计、盈亏比什么的都有。但我朋友说:我要的是CSV,不是HTML。
好家伙,这就开始了我的探索之路。
方法一:人人都会的HTML导出(但也是最鸡肋的)
先说这个最基础的。打开MT4,按Ctrl+T调出终端窗口,点"账户历史"标签,右键,选"保存为详细户口结单"。系统会让你选个保存位置,然后生成一个HTML文件。
这个文件的好处是信息全:
缺点?HTML格式,机器读起来费劲。就算你复制粘贴到Excel,格式也容易乱。偶尔用一次还行,每周都要导出的话,这方法能把人逼疯。
方法二:官方文档里提到的MQL4脚本导出(这才是正解)
我开始翻MQL4的官方文档,发现其实可以用File函数直接把历史记录写成CSV文件。这才是我们要的东西啊。
我写了一个脚本,代码如下。你把它复制到MetaEditor里,编译成
.ex4文件,放到MQL4/Scripts文件夹,然后在MT4里拖到任意图表上就能跑。``
cpp
//+------------------------------------------------------------------+
//| ExportHistoryToCSV.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright "Your Name"
#property link "https://www.yoursite.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int filehandle = FileOpen("AccountHistory.csv", FILE_WRITE | FILE_CSV);
if(filehandle != INVALID_HANDLE)
{
// 写入表头
string header = "Ticket,Symbol,Type,OpenTime,CloseTime,Lots,OpenPrice,ClosePrice,SL,TP,Profit,Commission,Swap,Magic,Comment\n";
FileWriteString(filehandle, header);
// 遍历所有历史订单
for(int i = 0; i < OrdersHistoryTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
string row = "";
row += IntegerToString(OrderTicket()) + ",";
row += OrderSymbol() + ",";
row += (OrderType() == OP_BUY ? "Buy" : "Sell") + ",";
row += TimeToString(OrderOpenTime(), TIME_DATE | TIME_SECONDS) + ",";
row += TimeToString(OrderCloseTime(), TIME_DATE | TIME_SECONDS) + ",";
row += DoubleToString(OrderLots(), 2) + ",";
row += DoubleToString(OrderOpenPrice(), Digits) + ",";
row += DoubleToString(OrderClosePrice(), Digits) + ",";
row += DoubleToString(OrderStopLoss(), Digits) + ",";
row += DoubleToString(OrderTakeProfit(), Digits) + ",";
row += DoubleToString(OrderProfit(), 2) + ",";
row += DoubleToString(OrderCommission(), 2) + ",";
row += DoubleToString(OrderSwap(), 2) + ",";
row += IntegerToString(OrderMagicNumber()) + ",";
row += OrderComment() + "\n";
FileWriteString(filehandle, row);
}
}
FileClose(filehandle);
Print("导出完成!文件保存在 MQL4/Files/AccountHistory.csv");
}
else
{
Print("打开文件失败,错误码:", GetLastError());
}
}
//+------------------------------------------------------------------+
`
跑完之后,CSV文件会保存在MQL4/Files文件夹里。用Excel打开就是规规矩矩的表格,用Python的pandas读起来也毫无压力。我朋友拿到数据之后当晚就把他的分析跑完了。
这里有个坑要提醒一下。如果你的历史记录有几千笔,脚本运行的时候MT4可能会卡几秒钟。别慌,不是在死机,是在干活。我拿一个5000多笔记录的账户试过,普通Win10机器上大概3秒左右就完成了,慢一点的VPS上也就10来秒。
方法三:DDE实时数据导出(跟历史记录没关系,但顺带提一嘴)
查资料的时候发现MT4还支持DDE协议,可以实时把报价推送到Excel等支持DDE的应用里。在工具 > 选项 > DDE里勾选"启用DDE服务器"就能用。
这个功能主要是导实时报价的,跟账户历史半毛钱关系没有。如果你是想在Excel里做一个实时更新的报价板,可以研究一下。格式大概是这样的:=MT4|BID!EURUSD就能拿到EURUSD的当前买价。但如果是导历史记录,别走这条路,走不通。
那个让我差点砸电脑的问题:历史记录是空的
回到开头说的帮朋友导出数据,当时遇到一个特别恶心的问题——账户历史标签里一片空白,右键选"所有历史"、"最近3个月"、"自定义时间段",什么都不显示。
后来才发现原因:新装的MT4或者刚换的经纪商,终端还没从服务器把历史数据下载下来。你数据都没下载,当然导不出来。
解决办法其实很简单:右键点"账户历史",选"自定义时间段",手动选一个有交易的时间范围,点确定。MT4这时候会去服务器拉数据,数据下来了,导出按钮才有东西可导。这个操作在官方帮助里其实有提到,但很多教程都跳过了这一步,搞得人一脸懵。
还有个细节我踩过坑:就算这次导出来了,下次打开MT4如果网络不好,历史记录又不见了。所以建议导出之后立刻把CSV文件备份到别的地方。MT4的MQL4/Files文件夹在重装或者切换账户的时候可能会被清掉,别问我怎么知道的。
选哪个方法?
三个方法各有用途:
HTML报告:适合给人看,发给会计师或者打印出来存档,排版漂亮自带图表。
MQL4脚本CSV导出:适合给机器读,做量化分析、Python处理、定期备份,一次配置终身受用。
DDE:只适合实时报价推送,别拿来导历史记录。
我自己的做法是:写好了那个脚本放在Scripts`文件夹里,每次要导出的时候拖到图表上跑一下,几秒钟拿到CSV,然后存到云盘备份。用了大半年了,靠谱。参考来源:MetaTrader 4帮助 – 文件菜单与数据导出(metatrader4.com),MQL4官方文档 – File函数(docs.mql4.com),OANDA Lab – 使用File函数保存交易数据(oanda.com)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。