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
相关产品推荐
相关产品推荐

