- EA 交易的主要事件:OnTick
- 基本原理和概念:订单、交易和仓位
- 交易操作类型
- 订单类型
- 按价格和数量划分的订单执行模式
- 挂单到期日期
- 期货订单的保证金计算方法:OrderCalcMargin
- 估算交易操作的利润:OrderCalcProfit
- MqlTradeRequest 结构体
- MqlTradeCheckResult 结构体
- 请求验证:OrderCheck
- 请求发送结果:MqlTradeResult 结构体
- 发送交易请求:OrderSend 和 OrderSendAsync
- 买入和卖出操作
- 修改仓位的止损和/或止盈水平
- 跟踪止损
- 平仓:全部和部分
- 反向平仓:全部和部分
- 挂单
- 修改挂单
- 删除挂单
- 获取活动订单列表
- 订单特性(现行和历史)
- 用于读取活动订单特性的函数
- 按特性选择订单
- 获取仓位列表
- 仓位特性
- 用于读取仓位特性的函数
- 交易特性
- 从历史中选择订单和交易
- 用于从历史中读取订单特性的函数
- 用于从历史中读取交易特性的函数
- 交易类型
- OnTradeTransaction 事件
- 同步和异步请求
- OnTrade 事件
- 监测交易环境变化
- 创建多交易品种 EA 交易
- EA 交易的优势和局限性
- 在 MQL 向导中创建 EA 交易
从历史中选择订单和交易
MetaTrader 5 允许你为 EA 交易或脚本创建特定时段的历史快照。该快照为订单和交易列表,可以通过适当的函数进一步访问。此外,可以请求与特定订单、交易或仓位相关的历史。
可通过 HistorySelect 函数显式(按日期)选择所需的时段。之后,可以分别使用 HistoryDealsTotal 和 HistoryOrdersTotal 函数找到交易和订单列表的大小。可以使用 HistoryOrderGetTicket 函数检查订单列表的元素;使用 HistoryDealGetTicket 函数检查交易列表的元素。
必须区分活动(工作)订单和历史订单,即已执行、已取消或已拒绝的订单。要分析活动订单,请使用与 获取活动订单列表 和 读取其特性相关章节中讨论的函数。
bool HistorySelect(datetime from, datetime to)
该函数可请求指定服务器时段(from 和 to (含),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 的平仓)。
在成功执行 HistorySelect 或 HistorySelectByPosition 这两个函数中的任何一个后,终端将为 MQL 程序生成一个内部订单和交易列表。你还可以使用函数 HistoryOrderSelect 和 HistoryDealSelect 来更改历史上下文,为此你需要预先知道相应对象的订单号(例如,从请求结果中保存该订单号)。
需要注意的是,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 函数进一步处理交易所必需的。通过这些函数可访问的 交易特性 列表在上一节中已有说明。
我们将在学习 HistoryOrderGet 和 HistoryDealGet 函数后探讨一个使用这些函数的示例。