Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
모든 인터페이스 DLL 함수의 모든 것을 try catch로 래핑하고 "처리되지 않은 예외" 뒤에 있는 것을 잡아서 로그에 씁니다.
일반적으로 모든 예외를 catch하고 모든 플러스 호출을 try로 래핑하는 것이 좋습니다. MQL 문서에서도 직접적으로 - DLL은 C++가 아니라 예외를 throw해서는 안 됩니다.
특히 conn.Close 및 new SqlConnection 기사에서 "예외 포착"에 해당하지 않으며 잠재적으로 예외를 던질 수 있습니다.
고맙습니다! 확인, 공유 변수에 액세스하는 동안 오류가 발생했습니다. 저자는 또한 이것에 대해 썼습니다
데모 프로젝트에는 매우 중요한 제한이 있다는 점에 유의해야 합니다. 하나의 MetaTrader 터미널에서 데이터베이스와 작업하는 하나의 Expert Advisor만 실행할 수 있습니다. 문제는 모든 Expert Advisor가 로드된 DLL의 하나의 인스턴스를 사용한다는 것입니다. 클래스가 정적으로 만들어졌기 때문에 실행 중인 모든 Expert Advisor에 대해 동일합니다. 변수도 공유됩니다. 여러 전문가를 실행하는 경우 모두 동일한 연결과 하나의 명령 개체를 사용합니다. 여러 전문가가 동시에 이러한 개체에 액세스하려고 하면 문제가 발생할 수 있습니다.
질문: dll(각 함수 호출에 대한 별도의 인스턴스 및 각 호출에 대한 로컬 변수)에 대한 다중 스레드 액세스를 구현하려면 어떻게 해야 합니까?
고맙습니다! 확인, 공유 변수에 액세스하는 동안 오류가 발생했습니다. 저자는 또한 이것에 대해 썼습니다
데모 프로젝트에는 매우 중요한 제한이 있다는 점에 유의해야 합니다. 하나의 MetaTrader 터미널에서 데이터베이스와 작업하는 하나의 Expert Advisor만 실행할 수 있습니다. 문제는 모든 Expert Advisors가 로드된 DLL의 복사본 하나를 사용한다는 것입니다. 클래스가 정적으로 만들어졌기 때문에 실행 중인 모든 Expert Advisor에 대해 동일합니다. 변수도 공유됩니다. 여러 전문가를 실행하는 경우 모두 동일한 연결과 하나의 명령 개체를 사용합니다. 여러 전문가가 동시에 이러한 개체에 액세스하려고 하면 문제가 발생할 수 있습니다.
질문: dll(각 함수 호출에 대한 별도의 인스턴스 및 각 호출에 대한 로컬 변수)에 대한 다중 스레드 액세스를 구현하려면 어떻게 해야 합니까?
.NET에서는 거의 아무것도 없습니다. 이 클래스는 기사 작성자가 사악해서가 아니라 Sharp 클래스를 이런 식으로 가져오기 때문에 정적으로 만들어집니다.
제 생각에는 두 가지 방법이 있습니다. 1) (오랜 시간 쓰기, 빠르게 작동) C ++로 다시 작성하고 더 이상 .NET을 만지지 마십시오. 스레드가 동시에 순환하지 않습니다.
샤프가 중요한 경우 또 다른 옵션은 이를 다시 작성하여 DLL 수준에서 연결 풀을 제어하고 Advisor<->connection_id 번들과 각 어드바이저가 자체 연결로 작업했음을 기억하는 것입니다. 여기에서 .net의 경우 MQL 구조나 스칼라에서 날카로운 객체에 대한 참조를 수신 및 저장하고 앞뒤로 전달할 수 있는지 여부는 말하지 않겠습니다. 즉, 일반 C++ 포인터와 같이 작동합니다. 가능하면 모든 것이 단순화됩니다.
스크린샷은 마켓에 로드되지 않습니다. 두 개의 브라우저로 시도했습니다.
저도요..
안녕하세요! 무엇이 잘못되었을 수 있습니까? dll을 사용하여 SQL Server에 작성합니다( https://www.mql5.com/ru/articles/2895 기사의 예).
쓰레드를 5개까지 쓰면 데이터가 제대로 기록된다. 더 많은 스레드를 사용하면 즉시 "처리되지 않은 예외 0xE0434352" 오류가 발생합니다.
안녕하세요! 무엇이 잘못되었을 수 있습니까? dll을 사용하여 SQL Server에 작성합니다( https://www.mql5.com/ru/articles/2895 기사의 예).
쓰레드를 5개까지 쓰면 데이터가 제대로 기록된다. 더 많은 스레드를 사용하면 즉시 "처리되지 않은 예외 0xE0434352" 오류가 발생합니다.
모든 인터페이스 DLL 함수의 모든 것을 try catch로 래핑하고 "처리되지 않은 예외" 뒤에 있는 것을 잡아서 로그에 씁니다.
일반적으로 모든 예외를 catch하고 모든 플러스 호출을 try로 래핑하는 것이 좋습니다. MQL 문서에서도 직접적으로 - DLL은 C++가 아니라 예외를 throw해서는 안 됩니다.
특히 conn.Close 및 new SqlConnection 기사에서 "예외 포착"에 해당하지 않으며 잠재적으로 예외를 던질 수 있습니다.
스크린샷은 마켓에 로드되지 않습니다. 두 개의 브라우저로 시도했습니다.
저도요..
간단한 드래그 앤 드롭을 시도해 보셨습니까?
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
시장과 수학
알렉세이 빅토 로프 , 2021.08.19 21:01
이미지를 텍스트에 드래그하여 그림을 삽입해 보세요.
방금 쇼케이스에서 숨겨진 고문을 변경하려고 시도하고 처음으로 나타난 이미지를 드래그하여 작동했습니다.
간단한 드래그 앤 드롭을 시도해 보셨습니까?
사진 5장 중 1장만 추가
오랫동안 그래왔습니다. mql 문자열은 실제로 문자열과 리터럴, 함수에서도 null 문자를 좋아하지 않습니다.
유일한 올바른 방법은 3개의 null로 끝나는 문자열을 배열로 캐스팅하는 것입니다.
저것들. 지금의 이 동작은 몇 년 전에 의도적 으로 수행된 것입니다. 이유를 모르겠습니다.주위의 적들
모든 인터페이스 DLL 함수의 모든 것을 try catch로 래핑하고 "처리되지 않은 예외" 뒤에 있는 것을 잡아서 로그에 씁니다.
일반적으로 모든 예외를 catch하고 모든 플러스 호출을 try로 래핑하는 것이 좋습니다. MQL 문서에서도 직접적으로 - DLL은 C++가 아니라 예외를 throw해서는 안 됩니다.
특히 conn.Close 및 new SqlConnection 기사에서 "예외 포착"에 해당하지 않으며 잠재적으로 예외를 던질 수 있습니다.
고맙습니다! 확인, 공유 변수에 액세스하는 동안 오류가 발생했습니다. 저자는 또한 이것에 대해 썼습니다
데모 프로젝트에는 매우 중요한 제한이 있다는 점에 유의해야 합니다. 하나의 MetaTrader 터미널에서 데이터베이스와 작업하는 하나의 Expert Advisor만 실행할 수 있습니다. 문제는 모든 Expert Advisor가 로드된 DLL의 하나의 인스턴스를 사용한다는 것입니다. 클래스가 정적으로 만들어졌기 때문에 실행 중인 모든 Expert Advisor에 대해 동일합니다. 변수도 공유됩니다. 여러 전문가를 실행하는 경우 모두 동일한 연결과 하나의 명령 개체를 사용합니다. 여러 전문가가 동시에 이러한 개체에 액세스하려고 하면 문제가 발생할 수 있습니다.
질문: dll(각 함수 호출에 대한 별도의 인스턴스 및 각 호출에 대한 로컬 변수)에 대한 다중 스레드 액세스를 구현하려면 어떻게 해야 합니까?
MT5 테스터에서 문제를 관찰했습니다.
여러 통화로 작업할 때 다른 통화의 데이터가 주기적으로 교체됩니다. 테스터를 확인하십시오. 수정해주세요.
첫 번째 값은 SymbolInfoDouble (symbol,SYMBOL_BID)입니다.
현재 그는 SymbolInfoDouble (EURGBP,SYMBOL_BID)의 가격을 얻을 수 없는 것처럼; 작동 중인 다른 쌍에서 값을 가져옵니다. 견적이 맞는지 확인하는 방법이 있나요?
고맙습니다! 확인, 공유 변수에 액세스하는 동안 오류가 발생했습니다. 저자는 또한 이것에 대해 썼습니다
데모 프로젝트에는 매우 중요한 제한이 있다는 점에 유의해야 합니다. 하나의 MetaTrader 터미널에서 데이터베이스와 작업하는 하나의 Expert Advisor만 실행할 수 있습니다. 문제는 모든 Expert Advisors가 로드된 DLL의 복사본 하나를 사용한다는 것입니다. 클래스가 정적으로 만들어졌기 때문에 실행 중인 모든 Expert Advisor에 대해 동일합니다. 변수도 공유됩니다. 여러 전문가를 실행하는 경우 모두 동일한 연결과 하나의 명령 개체를 사용합니다. 여러 전문가가 동시에 이러한 개체에 액세스하려고 하면 문제가 발생할 수 있습니다.
질문: dll(각 함수 호출에 대한 별도의 인스턴스 및 각 호출에 대한 로컬 변수)에 대한 다중 스레드 액세스를 구현하려면 어떻게 해야 합니까?
.NET에서는 거의 아무것도 없습니다. 이 클래스는 기사 작성자가 사악해서가 아니라 Sharp 클래스를 이런 식으로 가져오기 때문에 정적으로 만들어집니다.
제 생각에는 두 가지 방법이 있습니다. 1) (오랜 시간 쓰기, 빠르게 작동) C ++로 다시 작성하고 더 이상 .NET을 만지지 마십시오. 스레드가 동시에 순환하지 않습니다.
샤프가 중요한 경우 또 다른 옵션은 이를 다시 작성하여 DLL 수준에서 연결 풀을 제어하고 Advisor<->connection_id 번들과 각 어드바이저가 자체 연결로 작업했음을 기억하는 것입니다.
여기에서 .net의 경우 MQL 구조나 스칼라에서 날카로운 객체에 대한 참조를 수신 및 저장하고 앞뒤로 전달할 수 있는지 여부는 말하지 않겠습니다. 즉, 일반 C++ 포인터와 같이 작동합니다. 가능하면 모든 것이 단순화됩니다.