Experts: MQL5 Programming for Traders - 책의 소스 코드. 파트 6 - 페이지 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를 사용하여 날짜 범위 [SubrangeFrom, SubrangeTo]에 대해 2개의 조건을 설정합니다(기본적으로 다른 let() 호출에서는 지정되지 않으며, 단일 값 필드에는 일반적으로 IS::EQUAL이 사용됨).

날짜 범위별로 하위 필터를 적용하는 이유는 주문의 설정 시간(ORDER_TIME_SETUP)을 위한 것인데, 이는 HistorySelect가 주문의 다른 날짜 시간 속성, 즉 주문 실행 시간(ORDER_TIME_DONE)에 적용되기 때문입니다. 또한 활성 주문이 많은 경우 내역이 아닌 하위 범위의 활성 주문을 필터링하는 것도 흥미로울 수 있습니다.

시작점으로 MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 예제 스크립트를 살펴볼 수 있습니다.
 
Stanislav Korotky #:

거래 내역의 하위 범위를 분석하려는 경우, 필터링 코드 자체에 영향을 주지 않고 필터링 전에 이 부분만 요청하는 것이 더 효율적인 경우가 있습니다:

어떤 이유로 인해 HistorySelect로 적용한 전체 범위 내에서 (더 좁은) 하위 범위를 선택하려는 경우에도 필터링 코드에서 다음과 같이 할 수 있습니다:

노란색 선으로 강조 표시된 부분은 추가 한정자 IS::GREATER 및 IS::LESS를 사용하여 날짜 범위 [SubrangeFrom, SubrangeTo]에 대해 2개의 조건을 설정합니다(기본적으로 다른 let() 호출에서는 지정되지 않으며, 단일 값 필드에는 일반적으로 IS::EQUAL이 사용됨).

날짜 범위별로 하위 필터를 적용하는 이유는 주문의 설정 시간(ORDER_TIME_SETUP)에 대한 것인데, 이는 HistorySelect가 주문의 다른 날짜 시간 속성, 즉 주문 실행 시간(ORDER_TIME_DONE)에 적용되기 때문입니다. 또한 활성 주문이 많은 경우 내역이 아닌 하위 범위의 활성 주문을 필터링하는 것도 흥미로울 수 있습니다.

시작점으로 MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 예제 스크립트를 살펴볼 수 있습니다.
스타니슬라프코로트키 다시 한 번 감사드립니다... 저에게는 훌륭한 출발점이며 작업을 시작할 것입니다.
 

MQL5/Include/MQL5Book/TradeUtils.mqh 버그 수정.

   bool Equal(const double v1, const double v2)
   {
      return v1 == v2 || fabs(v1 - v2) < DBL_EPSILON * fmax(1.0, fmax(fabs(v1), fabs(v2)));
   }
파일:
TradeUtils.mqh  12 kb