기고글 토론 "MQL5 Cookbook: 거래의 역사 및 직위 속성 가져오기를 위한 기능 라이브러리"

 

새로운 기고글 MQL5 Cookbook: 거래의 역사 및 직위 속성 가져오기를 위한 기능 라이브러리 가 게재되었습니다:

포지션 속성에 대한 이전 글에서 제공한 정보를 간략하게 요약할 시간입니다. 이 글에서는 거래 내역에 액세스한 후에만 얻을 수 있는 속성을 가져오는 몇 가지 추가 함수를 만듭니다. 또한 보다 편리한 방법으로 포지션 및 기호 속성에 액세스할 수 있는 데이터 구조에 익숙해질 것입니다.

"MQL5 Cookbook: 거래 수준을 설정/수정할 때 오류를 방지하는 방법"이라는 이전 글에서 수정된 Expert Advisor의 새 기능 작동을 볼 수 있도록 다음 가능성을 추가합니다. 포지션이 이미 있는 상태에서 열기 신호가 다시 발생하면 포지션 볼륨을 높입니다.

포지션 히스토리에 여러 거래가 있을 수 있으며, 거래 과정에서 포지션 볼륨에 변화가 있었다면 현재 포지션 가격에도 변화가 있었을 것입니다. 첫 번째 진입점의 가격을 알아보려면 해당 특정 포지션과 관련된 거래 내역에 액세스해야 합니다. 아래 그림은 포지션이 하나의 거래(진입점)만 있는 경우를 보여줍니다.

그림 1. 포지션의 첫 번째 거래

작성자: Anatoli Kazharski

 
기사가 좋았고 마음에 들었습니다. 현재 포지션이 여러 개의 거래로 구성된 경우가 종종 있는데, 첫 번째와 마지막 거래 외에 2, 3 등 거래의 매개 변수를 알고 싶습니다. 이러한 기능은 기사를 풍부하게 할 것입니다.
 
paladin800:
기사가 좋았고 마음에 들었습니다. 현재 포지션이 여러 개의 거래로 구성된 경우가 종종 있는데, 첫 번째와 마지막 거래 외에 2, 3 등 거래의 매개 변수를 알고 싶습니다. 이러한 기능은 기사를 풍부하게 할 것입니다.
지금은 숙제로 남겨 두십시오. 하지만 나중에이 주제에 대해 더 많은 것을 쓰려고 노력할 것입니다.
 

기사 작성자에게 질문합니다.

포지션이 개설된 직후 거래에 관여한포지션의 ID는 어떻게 확인할 수 있나요?



 
denkir:

기사 작성자에게 질문합니다.

포지션이 개설된 직후에 거래가 관련된포지션의 식별자를 얻는 방법은 무엇인가요 ?

포지션선택() 함수를 사용하여 포지션을 선택하고 포지션겟인티저() 함수와 mql5 식별자 - POSITION_IDENTIFIER를 사용하여 해당 식별자를 가져옵니다.

도움말의 예시입니다:

//+------------------------------------------------------------------+
//| 거래 기능|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- 위치가 사용 가능한지 확인하고 변경된 시간을 인쇄합니다.
   if(PositionSelect(_Symbol))
     {     
//--- 추가 작업을 위한 위치 식별자 가져오기
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- 01.01.1970 이후 밀리초 단위의 위치 형성 시간을 가져옵니다.
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- 01.01.1970 이후 마지막으로 위치가 변경된 시간(초)을 가져옵니다.
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- 01.01.1970 이후 마지막 위치 변경 시간(밀리초)을 가져옵니다.
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

PositionSelect() 함수를 사용하여 위치를 선택하고 PositionGetInteger( ) 함수와 mql5 식별자 - POSITION_IDENTIFIER를 사용하여 해당 식별자를 가져옵니다.

도움말의 예시입니다:

감사합니다, tol64! 원칙적으로 맞습니다.

그리고 제가 위치 식별자에 대한 참조를 제공했음에도 불구하고 첫 번째 질문이 짧았다는 점에 대해 사과드립니다 .

문제는 이렇습니다. 포지션이 개설된 후 ::PositionId() 메서드를 사용하여 CDealInfo 클래스의 도움을 받아 거래 내역에서 이 개설을 잡아야 합니다. 그리고 가급적이면 개시 순간과 DEAL_ENTRY_IN 또는 DEAL_ENTRY_INOUT 유형 거래가 기록에나타나는순간 사이의 시간 간격이 가장 작아야 합니다.

이런 방식으로도 가능한가요? 활성 포지션 목록이 아니라 기록에 있는 거래 목록을 통해...
 
denkir:

감사합니다, tol64! 원칙적으로 진실은 여러분의 것입니다.

그리고 첫 번째 질문이 짧아서 죄송합니다... 포지션 ID에 대한 링크를 제공했음에도 불구하고요 .

문제는 이렇습니다. 포지션이 개설된 후 ::PositionId() 메서드를 사용하여 CDealInfo 클래스를 사용하여 거래 내역에서 이 개설을 포착해야 합니다. 그리고 가급적이면 개시 시점과 DEAL_ENTRY_IN 또는 DEAL_ENTRY_INOUT 유형의 거래가 기록에나타나는시점 사이의 시간 간격이 가장 작은 것이 좋습니다 .

이런 방식으로도 가능한가요? 활성 포지션 목록이 아니라 기록의 거래 목록을 통해...

제 생각에는 위의 예에서와 같이 OnTrade()에서 이벤트를 추적하는 것이 이에 매우 적합합니다. 그러나 갑자기 거래 이벤트에 의해 포지션이 선택되지 않고 다음 이벤트가 곧 나오지 않을 것이라고 생각합니다. 그런 다음 타이머로 환경을 추적해야합니다. 지금은 밀리초 단위로도 설정할 수 있습니다.

또는 오픈 포지션을 추적하는 대신 거래 내역(거래 횟수)을 스캔하세요. 우리는 이전 것을 기억하고 현재와 비교합니다. 타이머에서도 할 수 있습니다. 많은 변형이 있습니다. 모두 특정 작업에 따라 다릅니다.

 

아나톨리, 여기서 문제가 발생했습니다. 경험을 공유해 주세요. 기능으로 작업 할 때 버그가 있거나 "잘못"되고 있습니다. 그러나 나는 모든 것을 올바르게 수행했다고 생각합니다....

두 번째가 "작동"하지 않는 함수 변형에 대한 질문이 있습니다.

예를 들어

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // 티켓
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // 속성 식별자
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // 티켓
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // 속성 식별자
   double&                     double_var         // 여기서는 프로퍼티의 값을 가져옵니다.
   );

소스 코드를 첨부했습니다.

파일:
 
denkir:

아나톨리, 여기서 문제가 발생했습니다. 경험을 공유해 주세요. 기능으로 작업 할 때 버그가 있거나 "잘못"되고 있습니다. 그러나 나는 모든 것을 올바르게 수행했다고 생각합니다....

질문은 두 번째가 작동하지 않는 함수 변형에 관한 것입니다.

...

로그에 무엇이 표시됩니까? 스크립트를 실행할 때 문제가 없습니다.
 
tol64:
로그에 무엇이 표시되나요? 스크립트를 실행할 때 아무런 문제가 보이지 않습니다.

스크립트의 기본 설정에서 "Failure to return HistoryOrderGetDouble() function"과 같은 항목이 있습니다.

즉, 함수의 부울 버전이 속성 값을 가져 오지 않습니다.

 
denkir:

기본 스크립트 설정에서 " HistoryOrderGetDouble() 함수를 반환하지 못함"과 같은 레코드가 있음을 알 수 있습니다.

즉, 함수의 부울 버전이 속성 값을 가져 오지 않습니다.

모든 것이 성공적으로 전달됩니다. 모든 것을 더 자세히 살펴보고(로그에 출력) 이유를 알아보세요. 주문 수, 티켓 수, 오류 번호 등.