시스템 보안을 위해 각 DLL 호출은 특수 스트리퍼를 거치므로 실행 속도가 느려집니다. DLL 함수 호출은 단순한 XXXX 호출이 아니라 주소 마스킹, 스택 제어 및 DLL 내부의 크래시가 포함된 복잡한 래핑입니다. MQL5는 DLL 내부의 함수가 스택을 엉망으로 만들거나 충돌하는 경우 터미널 자체의 충돌 없이 스크립트 실행이 중지되도록 합니다.
DLL 함수 사용에 대한 일반적인 조언: 작은 결과를 전달하는 초당 수만 번의 호출보다는 내부에 많은 양의 작업이 있는 드문 호출을 시도하세요.
궁금합니다. 왜 더 나아가지 않을까요?
Renat가 지적했듯이, dll에서 값싼 함수를 호출하는 것은 비용이 많이 듭니다.
그렇다면 이 목적을 위해 제공된 배열에 데이터를 직접 복사하는 것은 어떨까요?
궁금합니다. 더 자세히 알아볼까요?
질문의 대상이 글쓴이인가요, 아니면 개발자인가요?
개발자에게 묻는다면 정확히 무엇을 제안하고 싶으신가요?
StringExplode 함수에 오류가 있나요? 현재 형식에서는 문자열 뒤에 구분 기호가 없는 경우(즉, 문자열 끝에) 문자열의 마지막 구성 요소를 복사하지 않습니다. IMHO에서는 끝에 구분 기호가 없더라도 문자열의 끝을 가져와야 합니다. 예:"EURUSD,EURJPY" 문자열에 구분 기호 ""를 입력하면 이제 함수가 EURUSD만 선택합니다.
다음은 수정된 버전의 함수이며, 편의를 위해 요소 수를 반환했습니다:
int StringExplode(string s, string separator, string &result[]) { int i, pos; ArrayResize(result, 0); for(i = 0; ; i++) { ArrayResize(result, ArraySize(result) + 1); pos = StringFind(s, separator); if(pos >= 0) { result[i] = StringSubstr(s, 0, pos); s = StringSubstr(s, pos + StringLen(separator)); } else { result[i] = s; i++; break; } } return(i); }
Get/Set과 같은 DLL 함수를 자주 호출하는 사용자에게는 매우 심각한 경고가 있습니다.
시스템 보안을 위해 각 DLL 호출은 특수 스트리퍼를 거치므로 실행 속도가 느려집니다. DLL 함수 호출은 단순한 XXXX 호출이 아니라 주소 마스킹, 스택 제어 및 DLL 내부의 크래시가 포함된 복잡한 래핑입니다. MQL5는 DLL 내부의 함수가 스택을 엉망으로 만들거나 충돌하는 경우 터미널 자체의 충돌 없이 스크립트 실행이 중지되도록 합니다.
DLL 함수 사용에 대한 일반적인 조언: 작은 결과를 전송하는 초당 수만 번의 호출보다는 내부에 많은 양의 작업이 있는 드문 호출을 시도하세요.
그건 그렇고, 여러 DLL 호출에 대한 한 가지 더 언급-테스트 중에 각 호출에서 몇 바이트의 메모리 누수가 발생하는 것을 발견했습니다.
StringExplode 함수에 오류가 없나요? 현재 형식에서는 문자열 뒤에 구분 기호가없는 경우 (즉, 문자열 끝에) 문자열의 마지막 구성 요소를 복사하지 않습니다. IMHO에서는 끝에 구분 기호가 없더라도 문자열의 끝을 가져와야 합니다. 예:"EURUSD,EURJPY" 문자열에 구분 기호 ""를 입력하면 이제 함수가 EURUSD만 선택합니다.
다음은 수정된 버전의 함수이며, 편의를 위해 요소 수를 반환했습니다:
감사합니다. 설명자의 마지막 요소는 의미가 없는 난수이기 때문에 볼 수 있습니다.
---------
감사합니다! 개선에 대한 모든 제안을 가능한 한 구현하겠습니다. 아이디어 자체는 좋으니 지체되지 않았으면 좋겠습니다.
얼마나 복잡한지!...
1년 전 일누르의 도움으로 메모리 작업을 위한 라이브러리를 MQL4로 작성했습니다. 메모리를 할당하고, 포인터를 이동하고, 쓰고 읽고, 메모리 영역의 이름을 다른 프로그램으로 전송할 수 있습니다.
모든 것은 매핑을 기반으로 합니다. 제안 된 것보다 훨씬 간단합니다.
얼마나 복잡한지!...
1년 전 일누르의 도움으로 메모리 작업을 위한 라이브러리를 MQL4로 작성했습니다. 메모리를 할당하고, 포인터를 이동하고, 쓰고 읽고, 메모리 영역의 이름을 다른 프로그램으로 전송할 수 있습니다.
모든 것은 매핑을 기반으로 합니다. 제안 된 것보다 훨씬 간단합니다.
Get/Set과 같은 DLL 함수를 자주 호출하는 사용자에게는 매우 심각한 경고가 있습니다.
시스템 보안을 위해 각 DLL 호출은 특수 스트리퍼를 거치므로 실행 속도가 느려집니다. DLL 함수 호출은 단순한 XXXX 호출이 아니라 주소 마스킹, 스택 제어 및 DLL 내부의 크래시가 포함된 복잡한 래핑입니다. MQL5는 DLL 내부의 함수가 스택을 엉망으로 만들거나 충돌하는 경우 터미널 자체의 충돌 없이 스크립트 실행이 중지되도록 합니다.
DLL 함수 사용에 대한 일반적인 조언: 작은 결과를 전달하는 초당 수만 번의 호출이 아니라 내부에 많은 양의 작업이 있는 드문 호출을 시도하세요.
새로운 기고글 인디케이터 데이터 교환: 쉬워요! 가 게재되었습니다:
차트에 추가된 인디케이터 데이터에 액세스가 가능한 동시에, 데이터 복사가 불필요하고, 필요한 경우 최소한의 수정만을 거쳐 기존의 코드를 사용할 수 있으며, MQL 코드가 선호되는 환경을 제공하고 싶습니다. 물론 DLL을 사용하긴 하겠지만 C++ 문자열을 이용할 겁니다. 이 글은 다른 MQL 프로그램에서 MetaTrader 터미널로 인디케이터 버퍼를 가져올 수 있도록 하는 편리한 개발 환경 구축 방법을 설명하고 있습니다.
어렵지 않죠? 하위 문자열을 이용해 디스크립터 리스트를 얻고 함수를 이용해 인디케이터 버퍼 값을 읽으세요. 마지막으로 아무거나 좀 써 봅시다(예제에서는 배열 요소 인덱스에 상응하는 값을 입력).
이제 test 인디케이터를 작동시켜 보죠(타겟 ATR이 여전히 차트에 추가된 상태). 그림 3.에서 확인할 수 있듯 ATR 값은 하단 하위 창(테스트 인디케이터 내)에 표시되며 대신 직선이 나타나는데 이는 실제로 배열 인덱스에 해당하는 값으로 채워져 있습니다.
작성자: Alexey Subbotin