Summary: 通过MQL4脚本实现MT4账户历史交易数据导出为CSV文件,涵盖FileOpen和FileOpenHistory两种方法,以及Windows 11下的权限处理经验。




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报告其实包含了所有你需要的信息:

  • 在"账户历史"里右键

  • 选"自定义时间段",设定起止日期

  • 再次右键,选"保存为详细户口结单"

  • 用浏览器打开保存的HTML文件


  • 报告最底下会显示一系列关键指标:毛利润、净利润、盈利因子、各种回撤百分比、还有资金曲线图。如果只是为了看一眼账户表现,这些数据足够了。但如果你需要逐笔交易的原始数据来做程序化分析,还是老老实实写脚本吧。

    参考来源:MQL4官方文档 – FileOpenHistory(docs.mql4.com),MQL4手册 – 文件操作(book.mql4.com),MetaQuotes帮助中心 – 账户历史报告(help.metaquotes.net)。

    本文首发于FXEAR.com,原创内容,未经授权禁止转载。