임포트된 함수의 호출

mql5-프로그램 실행 중 함수를 가져오기 위해 클라이언트 터미널은 조기 바인딩을 사용합니다. 즉, 프로그램에 가져온 함수의 호출이 있는 경우 해당 모듈(ex5 또는 dll)이 프로그램 로드 중에 불러와집니다. MQL5 및 DLL 라이브러리는 호출 모듈의 스레드에서 실행됩니다.

Drive:\Directory\FileName.Ext 처럼 로드할 모듈의 전체 이름을 사용하는 것은 권장되지 않습니다. MQL5 라이브러리는 terminal_dir\MQL5\Libraries 폴더에서 로드됩니다. 라이브러리를 찾지 못한 경우 클라이언트 터미널에서 terminal_dir\experts 폴더에서 라이브러리를 로드하려고 시도합니다.

시스템 라이브러리(DLL)는 운영 체제 규칙에 의해 로드됩니다. 라이브러리가 이미 로드된 경우(예: 다른 Expert Advisor 또는 다른 클라이언트 터미널에서 병렬로 실행 중) 이미 로드된 라이브러리에 대한 요청을 사용합니다. 그렇지 않으면 다음 순서에 따라 검색을 수행합니다.

  1. dll 임포트가 시작된 디렉토리입니다. 이 모듈에는 Expert Advisor, 스크립트, 지표 또는 EX5 라이브러리가 있습니다.
  2. Directory terminal_data_directory\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. MetaTrader 5 클라이언트 터미널이 시작된 디렉토리;
  4. 시스템 디렉토리;
  5. 윈도우 디렉토리;
  6. 현재 디렉토리;
  7. PATH 시스템 변수에 나열된 디렉터리.

DLL 라이브러리가 작업에 다른 DLL을 사용한다면, 두 번째 DLL이 없을 경우 첫 번째 DLL을 로드할 수 없습니다.

Expert Advisor(스크립트, 인디케이터)가 로드되기 전에 모든 EX5 라이브러리 모듈의 공통 목록이 생성됩니다. 로드된 Expert Advisor(스크립트, 인디케이터)와 이 목록의 라이브러리에서 모두 사용됩니다. 따라서 여러 번 사용된 EX5 라이브러리 모듈의 1회 로드가 필요합니다. 라이브러리는 Expert Advisor(스크립트, 지표)의 미리 정의된 변수를 사용합니다.

가져온 라이브러리 EX5는 다음 순서로 검색됩니다.

  1. 디렉토리, EX5를 가져오는 Expert Advisor(스크립트, 지표)의 디렉토리에 대해 설정된 경로;
  2. Directory terminal_directory\MQL5\Libraries;
  3. Directory MQL5\Libraries 모든 MetaTrader 5 클라이언트 터미널의 공통 디렉토리 (Common\MQL5\Libraries).

mql5-프로그램으로 DLL을 임포트한 함수는 윈도우즈 API 호출 동의를 보장해야 합니다. 이러한 합의를 보장하기 위해, C 또는 C++로 작성된 프로그램의 소스 텍스트에서 Microsoft(r) 컴파일러 전용 키워드 __stdcall을 사용합니다. 본 동의서의 특징은 다음과 같습니다.

  • 호출자(우리의 경우 mq5 프로그램)는 매개 변수를 스택에 적절하게 결합하기 위해 (DLL에서 가져온) 함수 프로토타입을 "조회"하셔야 합니다.
  • 호출자(우리의 경우 mql5-프로그램)는 매개 변수를 스택에 오른쪽에서 왼쪽으로 역순으로 배치합니다. 이 순서로 가져온 함수는 전달된 매개 변수를 읽습니다.
  • 매개 변수는 명시적으로 레퍼런스(우리의 경우 문자열에)에 의해 통과된 것들을 제외하고 값으로써 전달됩니다
  • 가져온 함수는 스택에 전달된 매개 변수를 읽음으로써 스택을 독립적으로 정리합니다.

가져온 함수의 프로토타입을 설명할 때 기본 파라미터를 사용할 수 있습니다.

해당 라이브러리를 로드할 수 없거나 DLL 사용에 대한 금지 사항이 있거나 가져온 기능을 찾을 수 없는 경우 - Expert Advisor는 저널(log 파일)에 "Expert Advisor stoped"라는 적절한 메시지와 함께 작업을 중지합니다. 이 경우 Expert Advisor는 다시 초기화될 때까지 실행되지 않습니다. Expert Advisor는 컴파일의 결과 또는 속성 테이블을 열고 확인을 누른 후에 다시 초기화할 수 있습니다.

Passing Parameters

단순 유형의모든 매개 변수는 명시적으로 참조로 전달되지 않는 한 값으로 전달됩니다. 문자열이 전달되면 복사된 문자열의 버퍼 주소가 전달되고, 문자열을 참조로 전달하면 복사하지 않고 이 문자열의 버퍼 주소가 DLL에서 가져온 함수에 전달됩니다.

구조-열거된 개체의 정적 또는 동적 배열 뿐만 아니라 동적 배열, 문자열, 클래스, 기타 복잡한 구조를 포함하는-를 임포트 함수에 매개 변수로 전달할 수 없습니다.

배열을 DLL에 전달할 때 데이터 버퍼 시작의 주소는 항상 전달됩니다 (AS_SERIES 플래그에 관계 없이). DLL 내부의 함수는 AS_SERIES 플래그에 대해 아무것도 알지 못합니다. 전달된 배열은 정의되지 않은 길이의 정적 배열입니다. 배열 크기를 지정하려면 추가 매개 변수를 사용해야 합니다.