You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MQL5编写EA程序:如何获取最后一笔平仓订单的订单编号?

获取MQL5中最后一笔平仓订单编号的解决方案

你的问题出在直接通过索引取历史交易,这种方式依赖交易顺序,随机平仓时就失效了。正确的做法是遍历历史交易,筛选出平仓类型的订单,再找到时间最新的那一笔。

实现步骤

  • 调用HistorySelect()加载历史交易数据,建议指定合理的时间范围(比如最近30天,避免加载过多数据影响效率)
  • 遍历所有历史交易,通过HistoryDealGetInteger()获取交易的类型标识(DEAL_ENTRY),筛选出平仓单(DEAL_ENTRY_OUT)
  • 记录所有平仓单的订单编号和时间,保留时间最新的那笔订单编号

代码示例

ulong GetLastCloseTicket()
{
    ulong lastCloseTicket = 0;
    datetime lastCloseTime = 0;
    
    // 加载最近30天的历史交易数据,可根据需求调整时间范围
    if(HistorySelect(TimeCurrent() - 30*86400, TimeCurrent()))
    {
        int totalDeals = HistoryDealsTotal();
        // 从最新到最旧遍历交易
        for(int i = totalDeals - 1; i >= 0; i--)
        {
            ulong dealTicket = HistoryDealGetTicket(i);
            // 判断是否为平仓单
            ENUM_DEAL_ENTRY dealEntry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(dealTicket, DEAL_ENTRY);
            if(dealEntry == DEAL_ENTRY_OUT)
            {
                datetime dealTime = (datetime)HistoryDealGetInteger(dealTicket, DEAL_TIME);
                // 找到时间最新的平仓单
                if(dealTime > lastCloseTime)
                {
                    lastCloseTime = dealTime;
                    lastCloseTicket = dealTicket;
                }
                // 从最新开始遍历,找到第一个平仓单即可直接返回,提升效率
                break;
            }
        }
    }
    return lastCloseTicket;
}

代码说明

  • 从历史交易的最新条目开始遍历,找到第一个平仓单就直接返回,比遍历全部数据效率更高
  • 通过DEAL_ENTRY_OUT准确识别平仓交易,完全不受开平仓顺序影响
  • 可根据实际需求调整HistorySelect()的时间范围,缩小数据加载量

内容的提问来源于stack exchange,提问作者Abbotton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:32:37