Experts: MQL5 Programming for Traders - 책의 소스 코드. 파트 6

 

MQL5 Programming for Traders - 책의 소스 코드. 파트 6:

"MQL5 Programming for Traders" 파트 6에서는 MQL5 언어의 핵심인 트레이딩 자동화에 대해 알아볼 것입니다. 우리는 금융상품 사양 및 트레이딩 계좌 설정과 같은 기본적인 것들부터 시작하게 될 것입니다. 이는 Expert Advisors를 제대로 운영하기 위한 전제 조건입니다.

MQL5 Programming for Traders - 책의 소스 코드. 파트 6

작성자: MetaQuotes

 
Great
 

코드를 삽입할 때는 코드 버튼(Alt-S) 을 사용합니다.

진행자가 잘못 붙여 넣은 코드의 서식을 지정했습니다. 일반적으로 이러한 코드는 제거됩니다.

이 오류를 조사해 주시겠어요? 이전 달에 코드가 수정 없이 작동한다는 것을 알았기 때문에 MT5 업데이트 이후에 시작된 것 같습니다.

매개변수 변환 유형 'long[][2]'에서 'string[][] &'로의 변환은 허용되지 않습니다 SymbolFilter.mqh 199 20

매개변수 변환 유형 'double[][2]'에서 'string[][] &'로의 변환은 허용되지 않습니다 TradeFilter.mqh 332 20
매개변수 변환 유형 'long[][2]'에서 'string[][] &'로의 변환은 허용되지 않음 TradeFilter.mqh 163 17


아래 코드가 이 문제를 재현하는 데 도움이 될 것 같습니다:

void printSymbols() {
   SymbolFilter f;                      // 필터 개체
   string symbols[];                    // 이름 배열 
   long permissions[][2];               // 데이터(속성 값)에 대한 배열
   
   // 요청된 심볼 속성 목록
   ENUM_SYMBOL_INFO_INTEGER modes[] = {
      SYMBOL_TRADE_MODE,
      SYMBOL_ORDER_MODE
   };
   
   // 필터 적용, 결과 배열 가져오기
   f.let(SYMBOL_VISIBLE, true).select(true, modes, symbols, permissions);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Trade permissions for the symbols (%d) ===== ", n);
   for(int i = 0; i < n; ++i)  {
      Print(symbols[i] + ":");
      for(int j = 0; j < ArraySize(modes); ++j) {
         // 비트 및 숫자 설명 "있는 그대로" 표시
         PrintFormat("  %s (%d)",
            SymbolMonitor::stringify(permissions[i][j], modes[j]),
            permissions[i][j]);
      }
   }
}

Stanislav Korotky - marketeer - Trader's profile
Stanislav Korotky - marketeer - Trader's profile
  • 2025.07.05
  • www.mql5.com
Trader's profile
 
pauldic #:
이 오류를 조사해 주시겠습니까? MT5 업데이트 이후에 시작된 것으로 보이는데, 이전 달에는 코드가 수정 없이 작동한다는 것을 알고 있었기 때문입니다.

매개변수 변환 유형 'long[][2'를 'string[][] &'로의 변환이 허용되지 않습니다 SymbolFilter.mqh 199 20
매개변수 변환 유형 'double[][2]'에서 'string[][] &'로의 변환은 허용되지 않습니다 TradeFilter.mqh 332 20
매개변수 변환 유형 'long[][2]'에서 'string[][] &'로의 변환은 허용되지 않음 TradeFilter.mqh 163 17


아래 코드가 이 문제를 재현하는 데 도움이 될 것 같습니다:


해당 줄을 찾아보세요:

   // 내장된 ArraySort
   // 문자열 배열을 지원하지 않습니다.
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }

헤더 파일 SymbolFilter.mqhTradeFilter.mqh에서 다음 메서드 오버로드를 옆에 추가합니다:

   // 내장된 ArraySort
   // 문자열 배열을 지원하지 않습니다.
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }
   
   template<typename T>
   void ArraySort(T &s[][]) const
   {
      ::ArraySort(s);
   }
PS. 이 질문은 이 글과 관련이 없는 것 같습니다.
 
Stanislav Korotky #:

줄을 찾아주세요:

헤더 파일 SymbolFilter.mqhTradeFilter.mqh에서 다음 메서드 오버로드를 그 옆에 추가하세요:

PS. 이 질문은 이 글과 관련이 없는 것 같습니다.

빠른 답변에 감사드립니다. 업데이트를 한 후 오류가 더 많이 발생했습니다:

parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'OrderMonitor&[][]'                   TradeFilter.mqh 338     20
parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'PositionMonitor&[][]'                        TradeFilter.mqh 338     20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'OrderMonitor&[][]'                             TradeFilter.mqh 163     17
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'PositionMonitor&[][]'                  TradeFilter.mqh 163     17
etc..

최적의 해결책이라고 생각하지는 않지만 ArraySort 대신 일반 QuickSortTm을 직접 호출하면 일시적으로 문제가 해결되는 것을 발견했습니다.

QuickSortTm<V> qt(array);
//ArraySort(array);
 
pauldic #:

빠른 답변에 감사드립니다. 업데이트 후 더 많은 오류가 발생했습니다:

이상합니다. 위에서 제안한 수정 후 빌드 5346에서 이 스크립트 /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5를 성공적으로 컴파일하고 실행했습니다. 소스 코드를 보여주지 않았습니다.
 
Stanislav Korotky #:
이상하네요. 위에서 제안한 수정 후 빌드 5346에서 이 스크립트 /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5를 성공적으로 컴파일하고 실행했습니다. 소스 코드를 보여주지 않았습니다.
소스를 생략 한 것을 용서해 주셔서 제안 된 수정 사항으로 되돌려서 오류를 다시 얻을 수 있으며 로그에 따르면 내 코드의 이러한 부분이 오류를 일으키는 부분 인 것 같습니다
버전 5 빌드 5327에서 실행 중입니다

void printActiveOrders() {
   
   OrderFilter filter;
   ENUM_ORDER_PROPERTY_DOUBLE properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP};
   double d[][4];
   ENUM_ORDER_TYPE types[];
   ulong tickets[], magics[];
   string symbols[], comments[];
   
   filter.select(properties, tickets, d);
   filter.select(ORDER_SYMBOL, tickets, symbols);
   filter.select(ORDER_COMMENT, tickets, comments);
   filter.select(ORDER_TYPE, tickets, types);
   filter.select(ORDER_MAGIC, tickets, magics);
   
   Print("Orders ..................  ", ArraySize(tickets));
   for (int i=0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", magics[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], "\t", comments[i]);
   }
}


void printPositions() {
   PositionFilter filter;
   
   ENUM_POSITION_PROPERTY_DOUBLE properties[] = {POSITION_PRICE_OPEN, POSITION_VOLUME, POSITION_SL, POSITION_TP, POSITION_PROFIT, POSITION_SWAP};
   
   ENUM_POSITION_TYPE types[];
   double d[][6];
   ulong tickets[], extIds[];
   string symbols[], comments[];
   
   filter.let(POSITION_MAGIC, sets.MagicNumber).select(properties, tickets, d);
   filter.select(POSITION_SYMBOL, tickets, symbols);
   filter.select(POSITION_COMMENT, tickets, comments);
   filter.select(POSITION_TYPE, tickets, types);
   filter.select(POSITION_IDENTIFIER, tickets, extIds);

   Print("Tickets\t  Parent Id\tSymbols \t Trade Type \t\t\t\t\t\tEntry \t Lots \t\t SL  \t\t\t TP \t\t\t\t Profit \tSwat \t\tComments");
   for ( int i =0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : (string)extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", (string)NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5], "\t", comments[i]);
      //Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5]);
   }
}


측면에는 다음과 같은 메시지가 자주 표시됩니다 :

This single line message always shows whenever I attach my EA to a chart:
Unresolved int value as enum: 8 for MonitorInterface<ENUM_POSITION_PROPERTY_INTEGER,ENUM_POSITION_PROPERTY_DOUBLE,ENUM_POSITION_PROPERTY_STRING>::TradeState


While these ones below shows when it is detached

2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   8 leaked strings left
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   2 undeleted dynamic objects found:
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'WebSocketConnectionHybi'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'MqlWebSocketTransport'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   576 bytes of leaked memory found
파일:
log.txt  34 kb
 
pauldic #:
소스를 생략 한 것을 용서해 주셔서 제안 된 수정으로 되돌려서 오류를 다시 얻을 수 있었고 로그에 따르면 내 코드의 이러한 부분이 오류로 이어지는 부분 인 것 같습니다

측면에는 종종 다음과 같은 메시지가 표시됩니다 :

문자 T가 이미 클래스 템플릿 유형 이름으로 사용되었다는 것을 간과 했으므로 (이 경우 컴파일러가 오류를 생성하지 않은 것이 이상합니다) T를 다른 자유 문자로 변경하면 괜찮을 것입니다 (예 : X):

   template<typename X>
   void ArraySort(X &s[][]) const
   {
      ::ArraySort(s);
   }

첫 번째 경고에 대해서는 포럼의 설명이 있습니다 (이전에 제공 한 설명):

거래, 자동 거래 시스템 및 테스트 거래 전략에 관한 포럼

전문가 트레이더를 위한 MQL5 프로그래밍 - 책의 소스 코드. 파트 7

스타니슬라브 코로트키, 2025.06.14 16:26

이는 MQL5의 해당 내장 열거형에 일반적으로 연속적으로 할당되는 상수에 간격이 있기 때문에 발생하는 경고일 뿐입니다. 이 간격은 MQL5가 지속적으로 변경되기 때문에 발생하며, 일부 상수는 더 이상 사용되지 않게 되었다가 제거될 수 있습니다. 소스 코드를 편집하여 이러한 경고를 방지할 수 있습니다.

그리고 유출 된 메모리에 대해-사용자 지정 소스 코드에 누락 된 부분이있어 책에 그러한 내용이 표시되지 않았습니다. 문제를 재현하려면 완전한 테스트 코드를 제공해야 합니다.

추신. 관심 있는 모든 속성에 대해 단일 선택을 실행하는 것이 더 효율적입니다:

   // 예시: 수익, 심볼, 포지션 티켓 요청하기
   // 수익별로 정렬된 특정 매직넘버 기준
   
   #include <MQL5Book/Tuples.mqh>
   #include <MQL5Book/PositionFilter.mqh>
   #property script_show_inputs
   
   input ulong Magic;
   
   void OnStart()
   {
      int props[] = {POSITION_PROFIT, POSITION_SYMBOL, POSITION_TICKET};
      Tuple3<double,string,ulong> tuples[];
      PositionFilter filter;
      filter.let(POSITION_MAGIC, Magic).select(props, tuples, true);
      ArrayPrint(tuples);
   }



참고: 운영자는 책에 대한 모든 질문과 답변(#41부터 시작)을 적절한 스레드(예: 여기 -https://www.mql5.com/en/forum/459067)로 옮겨야 한다고 생각합니다.

Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
  • 2023.12.15
  • www.mql5.com
MQL5 Programming for Traders – Source Codes from the Book. Part 6 : Author: MetaQuotes...
 
Stanislav Korotky #:

문자 T가 이미 클래스 템플릿 유형명으로 사용되었다는 사실을 간과했으므로(이 경우 컴파일러가 오류를 생성하지 않은 것이 이상합니다.) T를 다른 자유 문자(예: X)로 변경해도 괜찮습니다:

첫 번째 경고에 대해서는 포럼에서 설명한 내용을 참조하세요(앞서 설명해 드렸습니다):

그리고 유출 된 메모리에 대해-사용자 지정 소스 코드에 누락 된 것이 유감스럽게도 책에 그런 것들이 표시되지 않았습니다. 문제를 재현하려면 완전한 테스트 코드를 제공해야 합니다.

추신. 관심 있는 모든 속성에 대해 단일 선택을 실행하는 것이 더 효율적입니다:



참고: 운영자는 이 책에 대한 모든 질문과 답변(#41부터 시작)을 적절한 스레드(예: 여기 -https://www.mql5.com/en/forum/459067)로 옮겨야 한다고 생각합니다.

T -> X라는 작은 변화가 마법을 부려주셔서 정말 감사합니다. 그리고 이전 질문에 대한 포인터에 다시 한 번 감사드립니다 (이전에 질문 한 것을 잊었습니다) 그리고 귀하의 알림은 이전에 놓친 toyjson3.mqh의 업데이트를 보는 데 도움이되었으며 '선택'에 대해 수정할 것입니다.

나는 당신이 유출에 대해 옳다고 믿습니다. 나는 그것이 어디에서 오는지 이미 알고 있다고 생각합니다

정말 감사합니다 형제.
 
void printActiveOrders() {
   int properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT};
   Tuple9<double,double,double,double,long,long,long,string,string> values[]; 
   OrderFilter filter;
   filter.select(properties, values);
   Print("\nFound:  ", ArraySize(values), " Orders\n{ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT}");
   ArrayPrint(values);
}

void printDeals() {
   DealFilter filter;    
   int properties[] = {DEAL_TIME, DEAL_SYMBOL, DEAL_TICKET, DEAL_TYPE, DEAL_VOLUME, DEAL_PRICE, DEAL_COMMISSION, DEAL_PROFIT};
   
   Tuple8<long,string,long,long,double,double,double,double> data[];   
   filter.select(properties, data, true); // 시간별로 필터링
   Print("\nFound:  ", ArraySize(data), " Deals\nTIME, SYMBOL, TICKET, TYPE, VOLUME, PRICE, COMMISSION, PROFIT");
   ArrayPrint(data);
}

스타니슬라브코로트키
이 코드를 사용하여 거래 및 주문에 액세스할 수 있지만 특정 기간 동안 액세스하는 방법을 알아낼 수 없습니다. 특정 기간 동안 동일한 작업을 수행하는 방법에 대한 문서나 샘플을 안내해 주시겠습니까?

 
pauldic #:

이 코드를 사용하여 거래 및 주문에 액세스할 수 있지만 특정 기간 동안 액세스하는 방법을 알아낼 수 없습니다. 특정 기간 동안 동일한 작업을 수행하는 방법에 대한 문서나 샘플을 안내해 주시겠습니까?

주문, 거래, 포지션은 어떤 경우에도 기간과 관련이 없습니다. 뭔가 잘못 이해했거나 문구가 잘못되었습니다.