Summary: 从一次帮朋友导出三年交易记录的经历出发,详细对比MT4账户历史的HTML报告导出、MQL4脚本CSV导出和DDE三种方法,并解决历史记录加载不出来的常见问题。




最近帮一个朋友整理交易记录去报税,本来以为就导个数据的事,结果折腾了大半天。MT4这个软件吧,功能都藏在犄角旮旯里,尤其是跟数据导出相关的东西,不翻遍菜单根本找不全。

事情是这样的,我朋友需要用CSV格式的三年的交易明细,拿去做Python分析。我第一反应就是MT4不是有个"保存为详细户口结单"吗?右键一点,HTML文件出来了,打开一看排版还挺漂亮,资金曲线图、月度统计、盈亏比什么的都有。但我朋友说:我要的是CSV,不是HTML。

好家伙,这就开始了我的探索之路。

方法一:人人都会的HTML导出(但也是最鸡肋的)



先说这个最基础的。打开MT4,按Ctrl+T调出终端窗口,点"账户历史"标签,右键,选"保存为详细户口结单"。系统会让你选个保存位置,然后生成一个HTML文件。

这个文件的好处是信息全:
  • 所有已平仓交易的清单(开仓时间、平仓时间、品种、手数、盈亏、佣金、库存费等)

  • 统计汇总(总盈利、总亏损、净盈利、盈利因子、预期报酬)

  • 资金曲线图(这个其实挺直观的,省得自己用Excel画)


  • 缺点?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,原创内容,未经授权禁止转载。