MT4用久了都知道,在"账户历史"那里右键点一下"保存为详细户口结单",就能导出一份HTML格式的交易报告。但如果你需要的是CSV格式——方便Excel做透视表、导入Python分析、或者喂给其他交易系统——那就得自己动手写脚本了。MT4自带的报告功能不直接输出CSV,这条路走不通。
上个月接了个活,客户想把过去两年800多笔交易记录导进自己写的Python风控面板里做分析。HTML格式解析起来太麻烦,手工复制粘贴就更不现实了。折腾了一下午,最后用MQL4写了个脚本搞定。这里把完整过程和踩过的坑记下来。
第一步:搞清楚文件到底能存哪
写脚本之前,得先知道MT4允许你把文件存到什么位置。MQL4官方文档对文件操作有明确说明,工作文件只能保存在几个特定的文件夹里:
Terminal_folder\MQL4\Files\ —— 通用文件夹Terminal_folder\Tester\Files\ —— 测试期间用的文件Terminal_folder\history\服务器名称\ —— 历史数据文件(用FileOpenHistory)第三种路径最值得细说。MQL4官方文档里专门有一段写FileOpenHistory函数:"可以用于为非标准品种和/或周期生成自己的历史数据",并且"在历史文件夹中生成的文件可以离线打开,不需要数据推送就能显示图表"。
这个功能很多人都不知道。你生成的不只是一个普通数据文件,是MT4自己能认的离线图表数据源。
第二步:最直接的方案——FileOpen写CSV
最简单的做法就是用标准的FileOpen()函数。下面这个脚本是我最后交付给客户用的版本,会把所有已平仓订单导出到
MQL4\Files文件夹下的CSV文件里:``
cpp
//+------------------------------------------------------------------+
//| ExportHistoryToCSV.mq4 |
//| 导出账户历史到CSV文件的脚本 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025"
#property link "https://www.fxear.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| 脚本入口函数 |
//+------------------------------------------------------------------+
void OnStart()
{
// 设定日期范围
datetime fromDate = D'2024.01.01 00:00';
datetime toDate = TimeCurrent();
// 在MQL4\Files文件夹中打开文件
int fileHandle = FileOpen("AccountHistory.csv",
FILE_WRITE|FILE_CSV|FILE_SHARE_READ,
',');
if(fileHandle == INVALID_HANDLE)
{
Print("打开文件失败,错误码: ", GetLastError());
return;
}
// 写入表头
FileWrite(fileHandle, "订单号","品种","方向","手数","开仓时间",
"平仓时间","开仓价","平仓价","止损","止盈",
"盈亏","隔夜利息","佣金");
// 遍历历史订单
int totalOrders = OrdersHistoryTotal();
for(int i = totalOrders - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
// 跳过持仓订单(平仓时间为0)
if(OrderCloseTime() == 0) continue;
string orderType = (OrderType() == OP_BUY) ? "Buy" :
(OrderType() == OP_SELL) ? "Sell" : "其他";
FileWrite(fileHandle,
OrderTicket(),
OrderSymbol(),
orderType,
DoubleToString(OrderLots(), 2),
TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS),
TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS),
DoubleToString(OrderOpenPrice(), Digits),
DoubleToString(OrderClosePrice(), Digits),
DoubleToString(OrderStopLoss(), Digits),
DoubleToString(OrderTakeProfit(), Digits),
DoubleToString(OrderProfit(), 2),
DoubleToString(OrderSwap(), 2),
DoubleToString(OrderCommission(), 2));
}
}
FileClose(fileHandle);
Print("导出完成,文件保存在 MQL4\\Files\\AccountHistory.csv");
}
`
第三步:进阶玩法——用FileOpenHistory做离线图表
如果你想把历史数据存成MT4能直接识别的格式,那就得上FileOpenHistory了。MQL4官方文档里有这么一段示例代码:
`cpp
int handle=FileOpenHistory("USDX240.HST",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
if(handle<1)
{
Print("Cannot open file USDX240.HST");
return(false);
}
// 处理文件
// ...
FileClose(handle);
`
这段代码打开的是history\服务器名称目录下的文件。.HST是二进制格式——MT4的原生历史数据格式。只要你按正确的数据结构往里写,就能在MT4里开出一个自定义品种的离线图表。
有一个坑是官方文档里没写的:Windows 11的权限模型比Win10严格。如果你往history\服务器名称里写文件的时候遇到权限错误,检查一下你的MT4是不是跑在受限的AppContainer环境里。把整个MT4挪到非系统目录(比如C:\MT4)通常能解决这个问题。这个经验是我在客户的Win11机器上反复试出来的,官方文档里没有提及。
第四步:脚本里控制日期范围
手动操作的话,是在"账户历史"里右键选"自定义时间段"来加载特定时间范围的数据。脚本里其实也可以控制,通过OrderSelect()配合MODE_HISTORY,在遍历的时候用时间条件做过滤就行——上面那个脚本里就是这么干的。
有个容易被忽略的细节:OrdersHistoryTotal()返回的是当前终端里已经加载到"账户历史"选项卡中的订单数量。如果你没有通过UI手动加载过某个时间段,那么脚本里能取到的可能就只有最近几个月的记录。所以要么先在界面上加载好你要的时间范围,要么在脚本里循环调用OrderSelect()`时做更严谨的处理——这取决于你的MT4版本和经纪商服务器的配置。第五步:急着用数据的话——HTML报告也能凑合用
如果你不想写代码,只是想快速拿到数据看一眼,MT4自带的HTML报告其实包含了所有你需要的信息:
报告最底下会显示一系列关键指标:毛利润、净利润、盈利因子、各种回撤百分比、还有资金曲线图。如果只是为了看一眼账户表现,这些数据足够了。但如果你需要逐笔交易的原始数据来做程序化分析,还是老老实实写脚本吧。
参考来源:MQL4官方文档 – FileOpenHistory(docs.mql4.com),MQL4手册 – 文件操作(book.mql4.com),MetaQuotes帮助中心 – 账户历史报告(help.metaquotes.net)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。