从历史中选择订单和交易

MetaTrader 5 允许你为 EA 交易或脚本创建特定时段的历史快照。该快照为订单和交易列表,可以通过适当的函数进一步访问。此外,可以请求与特定订单、交易或仓位相关的历史。

可通过 HistorySelect 函数显式(按日期)选择所需的时段。之后,可以分别使用 HistoryDealsTotalHistoryOrdersTotal 函数找到交易和订单列表的大小。可以使用 HistoryOrderGetTicket 函数检查订单列表的元素;使用 HistoryDealGetTicket 函数检查交易列表的元素。

必须区分活动(工作)订单和历史订单,即已执行、已取消或已拒绝的订单。要分析活动订单,请使用与 获取活动订单列表读取其特性相关章节中讨论的函数。

bool HistorySelect(datetime from, datetime to)

该函数可请求指定服务器时段(fromto (含),to >= from)内的交易和订单历史,如果成功,则返回 true

即使在请求的时段内没有订单和交易,如果没有错误,该函数也将返回 true。例如,错误可能是缺少用于构建订单或交易列表的内存。

请注意,订单有两个时间:设置 (ORDER_TIME_SETUP) 和执行 (ORDER_TIME_DONE)。函数 HistorySelect 可根据执行时间选择订单。

要提取整个账户历史,可以使用句法 HistorySelect(0, LONG_MAX)

访问部分历史的另一种方式是通过仓位 ID。

bool HistorySelectByPosition(ulong positionID)

该函数可请求 ORDER_POSITION_ID 和 DEAL_POSITION_ID 特性中具有指定仓位 ID 的交易和订单历史。

注意!该函数不会按结算运算的相反仓位的 ID 选择订单。换言之,尽管订单数据参与了仓位的形成,ORDER_POSITION_BY_ID 特性被忽略了。
 
例如,EA 交易可以在启用的对冲账户上完成买入(订单 #1)和卖出(订单 #2)。这将导致仓位 #1 和 #2 的形成。相反仓位平仓需要 ORDER_TYPE_CLOSE_BY (#3) 订单。因此,HistorySelectByPosition(#1) 调用将选择订单 #1 和 #3,这是我们所期望的。但是,HistorySelectByPosition(#2) 调用将仅选择订单 #2(尽管订单 #3 在ORDER_POSITION_BY_ID 特性中有 #2,严格而言,订单 #3 参与了仓位 #2 的平仓)。

在成功执行 HistorySelectHistorySelectByPosition 这两个函数中的任何一个后,终端将为 MQL 程序生成一个内部订单和交易列表。你还可以使用函数 HistoryOrderSelectHistoryDealSelect 来更改历史上下文,为此你需要预先知道相应对象的订单号(例如,从请求结果中保存该订单号)。

需要注意的是,HistoryOrderSelect 仅影响订单列表,而 HistoryDealSelect 仅影响交易列表。

所有上下文选择函数都会返回一个 bool 值,表示成功 (true) 或错误 (false)。可以在内置的 _LastError 变量中读取错误代码。

bool HistoryOrderSelect(ulong ticket)

HistoryOrderSelect 函数可根据订单号选择历史中的订单。然后,该订单将用于交易的进一步操作(读取特性)。

在应用 HistoryOrderSelect 函数的过程中,如果按订单号搜索订单成功,历史中选择的新订单列表将包含刚刚找到的唯一订单。换言之,先前选择的订单列表(如果有的话)会被重置。但是,该函数不会重置先前选择的交易历史,即,不选择与改订单相关联的交易。

bool HistoryDealSelect(ulong ticket)

函数 HistoryDealSelect 可选择历史中的交易,以便通过适当的函数进一步访问。该函数不会重置订单历史,即,不会选择与所选交易相关的订单。

通过调用上述函数之一在历史中选择了某个上下文之后,MQL 程序可以调用这些函数来迭代落入该上下文的订单和交易,并读取其特性。

int HistoryOrdersTotal()

HistoryOrdersTotal 函数可返回历史中的订单数(在选择中)。

ulong HistoryOrderGetTicket(int index)

HistoryOrderGetTicket 函数允许你在选定的历史上下文中通过订单序列号来获取订单。该索引必须介于 0 到 N-1 之间,其中 N 是从 HistoryOrdersTotal 函数中获得的。

知道了订单号,可使用 HistoryOrderGet 函数很容易获得其所有必要特性。历史订单的特性与 现有 订单的特性完全相同。

处理交易也有类似的一对函数。

int HistoryDealsTotal()

HistoryDealsTotal 函数可返回历史中的交易数(在选择中)。

ulong HistoryDealGetTicket(int index)

HistoryDealGetTicket 函数允许你在选定的历史上下文中通过序列号获取交易单。这是使用 HistoryDealGet 函数进一步处理交易所必需的。通过这些函数可访问的 交易特性 列表在上一节中已有说明。

我们将在学习 HistoryOrderGetHistoryDealGet 函数后探讨一个使用这些函数的示例。