EA: 交易者的MQL5编程(MQL5 Programming for Traders) - 源代码第六部分 - 页 2

 
Stanislav Korotky #:
无论如何,订单、交易、头寸都与时间框架无关。你不是误解了什么,就是用词不当。
对不起,我想我用词不当,我说的"时间 范围 "是指 "日期范围"。如果我想选择在给定日期范围内成交的交易/订单,比如从 2025-10-01 00:00:00 到 2025-10-22 23:59:59 的交易。
 
pauldic #:
对不起,我想我用词不当,我说的"时间 范围 "是指 "日期范围"。如果我想选择在给定日期范围内成交的交易/订单,比如从 2025-10-01 00:00:00 到 2025-10-22 23:59:59 的交易。

如果要分析交易历史的子范围,在不影响过滤代码本身的情况下,在过滤之前只请求这部分历史记录会更有效:

input datetime SubrangeFrom = 0;
input datetime SubrangeTo = 0;

...

{
   HistorySelect(SubrangeFrom, SubrangeTo);
   // ......过滤器代码在这里保持不变
}

如果出于某种原因,您想在HistorySelect 应用的全局范围内选择一个(更窄的)子范围,那么您仍然可以在过滤代码中这样做:

{
      // 其中一些在这里

      // HistorySelect(0, LONG_MAX);
      // HistorySelectByPosition(PositionID);
      ...
      DealTuple deals[];
      if(SubrangeFrom != SubrangeTo && SubrangeFrom < SubrangeTo)
      {
         filter.let(DEAL_TIME, SubrangeFrom - 1, IS::GREATER).let(DEAL_TIME, SubrangeTo + 1, IS::LESS);
      }
      filter.let(DEAL_POSITION_ID, PositionID).select(deals, true);
      ...
}

黄线高亮部分使用额外的限定符 IS::GREATER 和 IS::LESS(默认情况下,在调用let() 时不会指定这两个限定符,而 IS::EQUAL 通常用于单值字段)为日期时间范围 [SubrangeFrom, SubrangeTo] 设置了两个条件。

我只知道一个按日期范围应用子过滤器的原因,那就是订单的设置时间 (ORDER_TIME_SETUP),因为HistorySelect 应用于订单的另一个日期时间属性,即订单执行时间 (ORDER_TIME_DONE)。此外,如果有很多有效订单,过滤有效订单的子范围(不在历史中)可能会很有趣。

您可以从MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 示例脚本开始。
 
Stanislav Korotky #:

如果要分析交易历史的一个子范围,在不影响过滤代码本身的情况下,在过滤前只请求分析这部分历史记录会更有效:

如果出于某种原因,您想在HistorySelect 应用的全局范围内选择一个(更窄的)子范围,那么您仍然可以在过滤代码中这样做:

黄线高亮部分使用额外的限定符 IS::GREATER 和 IS::LESS(默认情况下,在其他调用let() 时不指定这两个限定符,而 IS::EQUAL 通常用于单值字段)为日期时间范围 [SubrangeFrom, SubrangeTo] 设置了两个条件。

我只知道一个按日期范围应用子过滤器的原因,那就是订单的设置时间 (ORDER_TIME_SETUP),因为HistorySelect 应用于订单的另一个日期时间属性,即订单执行时间 (ORDER_TIME_DONE)。此外,如果有很多有效订单,过滤有效订单的子范围(不在历史中)可能会很有趣。

您可以从MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 示例脚本开始。
@StanislavKorotky 再次感谢...这对我来说是一个很好的起点,我将开始使用它。