- プログラム実行
- 取引許可
- クライアント端末イベント
- リソース
- インポートした関数の呼び出し
- ランタイムエラー
- 取引ストラテジーのテスト
임포트된 함수의 호출
mql5-프로그램 실행 중 함수를 가져오기 위해 클라이언트 터미널은 조기 바인딩을 사용합니다. 즉, 프로그램에 가져온 함수의 호출이 있는 경우 해당 모듈(ex5 또는 dll)이 프로그램 로드 중에 불러와집니다. MQL5 및 DLL 라이브러리는 호출 모듈의 스레드에서 실행됩니다.
Drive:\Directory\FileName.Ext 처럼 로드할 모듈의 전체 이름을 사용하는 것은 권장되지 않습니다. MQL5 라이브러리는 terminal_dir\MQL5\Libraries 폴더에서 로드됩니다. 라이브러리를 찾지 못한 경우 클라이언트 터미널에서 terminal_dir\experts 폴더에서 라이브러리를 로드하려고 시도합니다.
시스템 라이브러리(DLL)는 운영 체제 규칙에 의해 로드됩니다. 라이브러리가 이미 로드된 경우(예: 다른 Expert Advisor 또는 다른 클라이언트 터미널에서 병렬로 실행 중) 이미 로드된 라이브러리에 대한 요청을 사용합니다. 그렇지 않으면 다음 순서에 따라 검색을 수행합니다.
- dll 임포트가 시작된 디렉토리입니다. 이 모듈에는 Expert Advisor, 스크립트, 지표 또는 EX5 라이브러리가 있습니다.
- Directory terminal_data_directory\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
- MetaTrader 5 클라이언트 터미널이 시작된 디렉토리;
- 시스템 디렉토리;
- 윈도우 디렉토리;
- 현재 디렉토리;
- PATH 시스템 변수에 나열된 디렉터리.
DLL 라이브러리가 작업에 다른 DLL을 사용한다면, 두 번째 DLL이 없을 경우 첫 번째 DLL을 로드할 수 없습니다.
Expert Advisor(스크립트, 인디케이터)가 로드되기 전에 모든 EX5 라이브러리 모듈의 공통 목록이 생성됩니다. 로드된 Expert Advisor(스크립트, 인디케이터)와 이 목록의 라이브러리에서 모두 사용됩니다. 따라서 여러 번 사용된 EX5 라이브러리 모듈의 1회 로드가 필요합니다. 라이브러리는 Expert Advisor(스크립트, 지표)의 미리 정의된 변수를 사용합니다.
가져온 라이브러리 EX5는 다음 순서로 검색됩니다.
- 디렉토리, EX5를 가져오는 Expert Advisor(스크립트, 지표)의 디렉토리에 대해 설정된 경로;
- Directory terminal_directory\MQL5\Libraries;
- 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 플래그에 대해 아무것도 알지 못합니다. 전달된 배열은 정의되지 않은 길이의 정적 배열입니다. 배열 크기를 지정하려면 추가 매개 변수를 사용해야 합니다.