MetaTrader 4용 API 함수 라이브러리가 개발되었습니다. - 페이지 7

 
좋은 오후입니다. 그래서 저는 친숙한 프로그래머와 상의했고, 그는 이 DLL이 Omega에서 사용하지 않도록 특별히 작성된 경우 기능을 보장할 수 없다고 설명했습니다. Omega에는 DLL 함수 호출 매개변수에 필요한 리소스가 없을 수 있기 때문입니다. 예를 들겠습니다:
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
이 줄에서 "TDateTime *tim"과 같은 데이터는 Omega에서 지원하지 않습니다.
즉, 파라미터가 설정되지 않은 터미널의 시작 및 종료 기능만 작동합니다. 매개변수가 설정되는 위치에서 DLL이 허용하는 매개변수를 알아야 합니다. 예제가 있으면 좋을 것입니다.
프로그래머와 함께 델파이에서 예제를 봐야 할 것 같습니다. 프로그래머는 거기에 정확히 무엇이 필요한지 말할 수 있을 것이고, 그런 다음 DLL에 필요한 매개변수를 제공하는 Omega 도구를 찾을 수 있을 것입니다. Omega를 위한 DLL 버전을 출시하고 싶다면 빠른 테스트와 사용이 엄청나게 용이할 것입니다. Omega 사용자가 많을 것입니다. 이미 관심있는 분들이 계십니다. Help Omega의 작은 추출물을 첨부합니다.
중요한 점은 지원되는 데이터 유형 목록입니다(아래 참조).



DLL 함수 정의

EasyLanguage DLL 함수를 호출하려면 먼저 DLL 함수 선언문을 사용하여 DLL을 선언해야 합니다.

통사론:

DefineDLLFunc: "DLLNAME.DLL", 반환 유형, "FunctionName", 매개변수;

DLLNAME.DLL - 함수가 있는 DLL의 이름, 반환 유형 - 함수가 반환할 표현식의 유형, FunctionName - DLL에 정의된 함수의 이름, 매개변수 - 함수에 의해 예상되는 매개변수 목록( 쉼표로 구분된 각 매개변수).

32비트 DLL은 _cdecl, stdcall 또는 fastcall을 사용하여 대소문자를 구분하는 내보낸 선언된 함수를 사용한다는 점을 기억하는 것이 매우 중요합니다. DLL이 EasyLanguage와 호환되려면 대문자를 사용하여 내보낸 함수 를 생성하고 _stdcall로 선언해야 합니다. 이러한 내보낸 함수는 DLL 파일의 EXPORTS .DEF 섹션 내에 나열되어야 합니다. 함수 프로토타입에서 "_declspec(dllexport)"를 사용하는 것만으로는 EasyLanguage가 내보낸 DLL 함수를 찾는 데 충분하지 않습니다.

예를 들어, 다음 문은 USER32.DLL이라는 DLL에 있는 MessageBeep이라는 함수를 선언합니다. 부울(true/false) 값을 반환하고 하나의 매개변수인 int를 기대합니다.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

데이터 유형

EasyLanguage는 DLL에 포함된 기능에 정보를 보내고 받는 데 사용할 수 있는 다양한 유효한 데이터 유형을 지원합니다. 다음은 EasyLanguage에서 지원하는 데이터 유형 목록입니다.

기본 데이터 유형:

바이트
1바이트 정수 데이터 유형.


1바이트 정수 데이터 유형.

정수
4바이트 부호 있는 정수 데이터 유형.

단어
2바이트 부호 없는 정수 데이터 유형.


4바이트 부호 있는 정수 데이터 유형.

DWORD
4바이트 부호 없는 정수 데이터 유형.

뜨다
4바이트 부동 소수점 데이터 유형.

더블
8바이트 부동 소수점 데이터 유형.

부울
4바이트 부울 데이터 유형.




옵션:


서명되지 않은 긴
DWORD와 동일합니다.

무효의
"반환된 값 없음"을 의미합니다.

포인터 유형:


LPBYTE
BYTE에 대한 포인터입니다.

LPINT
int에 대한 포인터입니다.

LP워드
WORD에 대한 포인터.

LPLONG
LONG에 대한 포인터입니다.

LPDWORD
DWORD에 대한 포인터입니다.

LPFLOAT
float에 대한 포인터(float FAR에서).

LPDOUBLE
double에 대한 포인터(이중 FAR에서).

LPSTR
문자에 대한 포인터입니다.


모든 포인터는 32비트 포인터이며 EasyLanguage는 각 포인터를 동일한 방식으로 취급합니다.

또한 정수인 Open, High, Low, Close를 제외하고 EasyLanguage의 모든 값은 부동 소수점임을 기억하는 것이 매우 중요합니다. 이러한 가격을 조작하려면 플로팅 중인 기호의 가격 척도를 함수로 보내야 합니다.

예를 들어, 종이의 가격 척도가 1/1000이고 최종 가격이 105.125이면 해당 가격은 105125로 DLL에 전송됩니다. DLL이 이 가격을 읽는 방법을 알기 위해서는 해당 값을 다음으로 보내야 합니다. 이 경우 값을 반환하는 PriceScale 예약어는 1000입니다.
 
Omega에는 DLL 함수 호출 매개변수에 필요한 리소스가 없을 수 있습니다. 예를 들어 보겠습니다.
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
이 줄에서 "TDateTime *tim"과 같은 데이터는 Omega에서 지원하지 않습니다.

이제 모든 것이 명확해졌습니다. 이 문제를 해결하려면 Omega에서 TDateTime 대신 double 을 지정하십시오. int TikKot(문자, 이중, 이중, 이중);
실제로 이러한 유형은 쉽게 교체할 수 있으며 각각 8바이트의 메모리를 사용합니다. 행운을 빕니다!
 
감사합니다. 그러나 "char" 유형, Omega에는 숫자가 필요하고 DLL에는 텍스트가 필요합니까? 교체할 수 있습니까?
 
감사합니다. 그러나 "char" 유형, Omega에는 숫자가 필요하고 DLL에는 텍스트가 필요합니까? 교체할 수 있습니까?

왜요? 결국 설명은 다음과 같습니다.
LPSTR
문자에 대한 포인터입니다.

이것은 동일합니다. Omega 문서에 이러한 유형의 변수에 대한 예가 있습니까? 거기에서 유사한 옵션을 주의 깊게 살펴봐야 합니다. 행운을 빕니다!
 
안녕하세요, 문제를 찾았습니다.
다음은 DLL 호출에 대한 도움말입니다.

참고: 32비트 DLL은 _cdecl, _stdcall 또는 fastcall을 사용하여 선언된 대소문자를 구분하는 내보낸 함수를 사용합니다. DLL이 EasyLanguage와 호환되도록 하려면 내보낸 함수를 모두 대문자로 만들고 _stdcall로 선언해야 합니다. 이러한 내보낸 함수는 DLL의 .DEF 파일의 EXPORTS 섹션에 나열되어야 합니다. 함수의 프로토타입에서 "_declspec(dllexport)"을 사용하는 것만으로는 EasyLanguage가 DLL의 내보낸 함수를 찾는 데 충분하지 않습니다.

그래서 여기서 오메가는 대문자로 쓰여진 기능들과만 작동한다고 말합니다. 다른 DLL에 어떻게 쓰여지는지 확인했는데 실제로는 대문자로만 되어 있습니다.
함수 호출 (대문자로 된 이름)을 변경하면 추가로 테스트할 수 있습니다.
개인적으로 저는 귀하의 제품에 매우 관심이 있으며 DLL을 Omega로 조정해 달라는 요청을 드립니다. 나는 그것이 작동하기를 바랍니다 ... 성공!
여기에 글을 쓰고 싶지 않다면 다른 거래 자동화 솔루션에 대해 작업해야 합니다. 고맙습니다.
 

함수 호출(대문자로 된 이름)을 변경하면 추가로 테스트할 수 있습니다.
개인적으로 저는 귀하의 제품에 매우 관심이 있으며 DLL을 Omega로 조정해 달라는 요청을 드립니다. 나는 그것이 작동하기를 바랍니다 ... 성공!

기능의 큰 글자로 버전을 만들어 당신의 사서함으로 보냈습니다. 행운을 빕니다!
 
감사합니다 테스트해보고 결과 올려드리겠습니다.