GPL C++ 기반 버전의 ALGLIB 라이브러리()를 완전히 개편하여 ALGLIB++로 릴리즈했습니다. 이는 2019년 12월 현재 최신 버전인 3.16.0을 따르고 있습니다. MQL5가 동기화된 이전 버전 이후 최적화 및 보간 모듈에 많은 기능이 추가되었습니다(예: 포인트 클라우드 스플라인(!), 더 많은 역거리 가중 보간 방법, 수많은 추가 최적화 방법 등).
ALGLIB++는 장기적인 리엔지니어링/리팩토링 과정에서 중간 형태로 사용되는 ALGLIB의 파생어로, (버전 3 이전과 유사하게) 네이티브 C++로 리코딩되고, 멀티스레딩에 대한 보다 직접적인 지원과 추가 테스트 및 모듈, 궁극적으로는 스크립팅 언어 프론트엔드를 제공할 준비를 위해 추가 계층과 중복이 제거될 예정입니다.
ALGLIB의 여러 언어 버전은 모두 공통 코어에서 생성되었으며, C++ 버전은 C의 C90 방언에 대한 제한적인(그러나 비공식적인) 지원을 제공했습니다. 이 기능으로 인해 C++에 기본으로 제공되는 기능을 C 내에서 시뮬레이션하고 그 위에 C++ 래퍼를 제공해야 했습니다. 이에 따라 네임스페이스에는 C 버전을 포함하는 alglib_impl과 C++ 래퍼를 포함하는 alglib라는 두 가지가 있습니다. ALGLIB++는 이 구조의 대부분과 가능한 한 많은 원래 코딩을 유지했지만, 멀티스레드 네이티브 C++ 코드로 대체하기 위한 첫 단계로 글로벌 인프라의 대부분을 줄이거나 제거했으며 C++ 래퍼 인터페이스를 크게 간소화했습니다. 따라서 ALGLIB 자체와 ALGLIB++가 변화하고 있는 미래의 라이브러리를 연결하는 중간 형태라고 할 수 있습니다.
MQL5가 적용된 버전 이후(그리고 그 이전에도) ALGLIB의 복잡성을 증가시키는 많은 문제들이 해결되어 구조가 단순화되고 복잡성이 감소했습니다. 현재의 형태에서는 현재 ALGLIB의 MQL5 버전을 유지 관리하고 있는 사용자들이 MQL5에 더 쉽게 적응할 수 있을 것입니다.
배포판에는 ALGLIB C++ 원본에서 ALGLIB++용 매뉴얼을 완전히 다시 포맷한 것이 포함되어 있습니다. 그러나 패키지와 하위 패키지의 섹션은 두 버전의 ALGLIB과 호환되며, 레이아웃과 내용 모두 MQL5 버전에 맞게 쉽게 조정할 수 있습니다. 매뉴얼의 '참조 및 관련 링크' 섹션에서 MQL5에 대해 자세히 설명합니다.
최신 버전은 향후 ALGLIB++에 통합하기 위해 LAPACK의 C++ 번역 버전인 LAPACK++도 준비 중입니다. 신경망 루틴이 있는 MKL을 포함한 다른 라이브러리도 향후 통합을 고려 중입니다.
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
(1) 각 진입과 종료 시마다 스레드 로컬 변수를 캐싱하고 반복 루틴은 잠재적으로 수백만, 수십억 번의 호출/반환 주기를 수행합니다!
(2) 루틴에서 점프하여 이벤트에서 "일시 중지"하고 이벤트 후 다시 루틴으로 점프하여 "재개"하는 스레드 전환 구현 - 이는 많은 고토와 여러 진입점을 의미합니다.
(3) 함수 본문의 최상위 레벨에 진입점을 배치하기 위해 이러한 루틴의 제어 흐름 구조를 축소합니다.
ALGLIB을 MQL5에 적용할 때 제어 흐름 데시메이션을 그대로 유지하면서 실제로 코드 조각을 별도의 루틴으로 분리했습니다. 결국 이 솔루션은 유지 관리가 불가능하다는 것을 알게 되었기 때문에 ALGLIB 업데이트를 따라잡는 것이 불가능해졌습니다. ALGLIB 자체도 약간 뒤처져 있었기 때문에 RCOMM 루틴에 이전 버전의 고아 구조와 변수가 남아있을 때가 있었습니다.
ALGLIB++에서는 제어 흐름 구조가 재통합되어 진입점이 루프 또는 다른 제어 흐름 구조의 중간에서 중단된 지점으로 다시 점프합니다.
스레드-로컬 변수의 캐싱은 없으며, 당분간은 정적으로 만들어졌습니다(스레드 안전성을 희생하는 대신 멀티스레딩은 공식적으로 GPL ALGLIB의 일부가 아닙니다).
ALGLIB과 마찬가지로, 이는 모든 점프를 앞뒤로 수행하기 위해 많은 goto 문이 있다는 것을 의미하지만, 더 깔끔하게 정리되어 있습니다.
테스트 결과에 따르면 ALGLIB++로 수정한 것만으로도 루틴의 속도가 약 20~25% 빨라집니다.
이 아키텍처를 처리하여 goto 문을 없애고 스레드-로컬 변수를 보다 적절하게 처리하는 방법에는 두 가지가 있습니다:
(1) 실제 스레드 전환을 구현하는 것. 즉, RCOMM 루틴이 "이벤트" 메시지(필요, ... 알그파워업 플래그의 실제 의미)를 보내고 호출자가 메시지를 수신하고 처리할 이벤트 핸들러를 설정해야 합니다. 그러나 MQL5가 사용자 정의 이벤트를 생성하고 처리할 수 있는지는 확실하지 않습니다.
(2) 이벤트에 함수 포인터를 사용합니다.
RCOMM 루틴은 중첩될 수 있으며, 경우에 따라서는 자신이 호출하는 RCOMM 루틴에서 얻은 이벤트를 호출자에게 전달할 수 있다는 점을 염두에 두어야 합니다.
ALGLIB 개발자가 함수 포인터나 멀티스레딩을 사용하지 않기로 결정한 이유는 ALGLIB이 처음 출시되었을 때 널리 배포되고 널리 사용되는 언어에서 멀티스레드 프로그래밍을 공식적으로 지원하지 않았고, ALGLIB이 목표로 하는 모든 언어가 C 및 C++의 함수 포인터와 동일하거나 유사한 것을 가지고 있는 것은 아니었기 때문입니다. 하지만 MQL5에는 함수 포인터가 있습니다. 제어 흐름 구조의 재통합으로 인해 ALGLIB을 MQL5에 적용하면 ALGLIB++에서 이 작업을 수행하는 것이 훨씬 쉬워집니다.
그러나 이상적인 솔루션은 스레드 전환을 사용하는 것입니다. 결국 함수 포인터 또는 스레드 전환 중 하나가 ALGLIB++에서 사용될 것이며, 아직 어떤 방식을 사용할지는 결정되지 않았습니다.
(1) 각 진입과 종료 시마다 스레드 로컬 변수를 캐싱하고, 반복 루틴은 잠재적으로 수백만, 수십억 번의 호출/반환 주기를 수행합니다!
(2) 루틴에서 점프하여 이벤트에서 "일시 중지"하고 이벤트 후 다시 루틴으로 점프하여 "재개"하는 방식으로 스레드 전환을 구현하므로 많은 고토와 여러 진입점이 필요합니다.
(3) 진입점을 함수 본문의 최상위 레벨에 배치하기 위해 이러한 루틴의 제어 흐름 구조를 파괴합니다.
ALGLIB을 MQL5에 적용할 때 제어 흐름 데시메이션을 그대로 유지하면서 실제로 코드 조각을 별도의 루틴으로 분리했습니다. 결국 이 솔루션은 유지 관리가 불가능하다는 것을 알게 되었기 때문에 ALGLIB 업데이트를 따라잡는 것이 불가능해졌습니다. ALGLIB 자체도 약간 뒤처져 있었기 때문에 RCOMM 루틴에 이전 버전의 고아 구조와 변수가 남아있을 때가 있었습니다.
ALGLIB++에서는 제어 흐름 구조가 재통합되어 진입점이 루프 또는 다른 제어 흐름 구조의 중간에서 중단된 부분으로 다시 점프합니다.
스레드-로컬 변수의 캐싱은 없으며, 당분간은 정적으로 만들어졌습니다(스레드 안전성을 희생하는 대신 멀티스레딩은 공식적으로 GPL ALGLIB에 포함되지 않습니다).
ALGLIB과 마찬가지로, 이는 앞뒤로 점프하는 많은 goto 문이 있다는 것을 의미하지만, 더 깔끔하게 정리되어 있습니다.
테스트 결과에 따르면 ALGLIB++로 수정한 것만으로도 루틴의 속도가 약 20~25% 빨라집니다.
이 아키텍처를 처리하는 두 가지 방법으로 goto 문을 없애고 스레드 지역 변수를 보다 적절하게 처리할 수 있습니다:
(1) 실제 스레드 전환을 구현하는 것. 즉, RCOMM 루틴이 "이벤트" 메시지(필요, ... 알그파워업 플래그의 실제 의미)를 보내고 호출자가 메시지를 수신하고 처리할 이벤트 핸들러를 설정해야 합니다. 그러나 MQL5가 사용자 정의 이벤트를 생성하고 처리할 수 있는지는 확실하지 않습니다.
(2) 이벤트에 함수 포인터를 사용합니다.
RCOMM 루틴은 중첩될 수 있으며, 경우에 따라서는 자신이 호출하는 RCOMM 루틴에서 얻은 이벤트를 호출자에게 전달할 수 있다는 점에 유의하세요.
ALGLIB 개발자가 함수 포인터나 멀티스레딩을 사용하지 않기로 결정한 이유는 ALGLIB이 처음 출시되었을 때 널리 배포되고 널리 사용되는 언어에서 멀티스레드 프로그래밍을 공식적으로 지원하지 않았고, ALGLIB이 목표로 하는 모든 언어가 C 및 C++의 함수 포인터와 동일하거나 유사한 것을 가지고 있는 것은 아니었기 때문입니다. 하지만 MQL5에는 함수 포인터가 있습니다. 제어 흐름 구조의 재통합으로 인해 ALGLIB을 MQL5에 적용하면 ALGLIB++에서 이 작업을 수행하는 것이 훨씬 쉬워집니다.
그러나 이상적인 솔루션은 스레드 전환을 사용하는 것입니다. 결국 함수 포인터 또는 스레드 전환 중 하나가 ALGLIB++에서 사용될 것이며, 아직 어떤 방식을 사용할지는 결정되지 않았습니다.
리디아에게: 네
하지만 github에 있는 ALGLIB ++ 라이브러리 파일은 여전히 C ++ CPP 형식입니다. MQL5 mql로 변환되지 않았습니다. ALGLIB ++ 라이브러리 파일을 .mql로 제공해 주시겠습니까? 감사합니다!
아름다운 MQ!
라이브러리 사용의 예는 MLP 신경망에 구구단을 가르치는 것입니다.
:( 사용자가 전문가에서 라이브러리를 적극적으로 사용하기 시작하면 클라우드에 어떤 일이 일어날지 걱정됩니다.
이 간단한 스크립트의 무게는 1메가바이트도 안 됩니다.
동일하지만 RF의 경우:
카운트가 정확하지 않으므로 조정해야합니다.
추신
더 정확하고 500 고대 및 r = 1, 더 적합하고 노이즈가 적습니다.
RF도 마찬가지입니다:
정확도가 떨어지므로 조정이 필요합니다.
PS
이 방법이 더 정확하고, 500개의 트리와 r=1로 더 잘 맞고 노이즈가 적습니다.
트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼
오류, 버그, 질문
안드레이 카팀리안스키, 2019.01.30 04:57 AM
MQL5\Include\Math\AlgLib\dataanalysis.mqh - CLinReg::LRLine이 1M 이상의 값에서 작동하지 않나요?누구 아는 사람 있나요?
감사합니다 @Rashid Umarov
이 스레드는 3년 동안 업데이트되었지만 웹 사이트가 계속 업데이트되고 있으므로 모두 웹 사이트로 이동하는 것이 좋습니다.
GPL C++ 기반 버전의 ALGLIB 라이브러리()를 완전히 개편하여 ALGLIB++로 릴리즈했습니다. 이는 2019년 12월 현재 최신 버전인 3.16.0을 따르고 있습니다. MQL5가 동기화된 이전 버전 이후 최적화 및 보간 모듈에 많은 기능이 추가되었습니다(예: 포인트 클라우드 스플라인(!), 더 많은 역거리 가중 보간 방법, 수많은 추가 최적화 방법 등).
ALGLIB++는 장기적인 리엔지니어링/리팩토링 과정에서 중간 형태로 사용되는 ALGLIB의 파생어로, (버전 3 이전과 유사하게) 네이티브 C++로 리코딩되고, 멀티스레딩에 대한 보다 직접적인 지원과 추가 테스트 및 모듈, 궁극적으로는 스크립팅 언어 프론트엔드를 제공할 준비를 위해 추가 계층과 중복이 제거될 예정입니다.
ALGLIB의 여러 언어 버전은 모두 공통 코어에서 생성되었으며, C++ 버전은 C의 C90 방언에 대한 제한적인(그러나 비공식적인) 지원을 제공했습니다. 이 기능으로 인해 C++에 기본으로 제공되는 기능을 C 내에서 시뮬레이션하고 그 위에 C++ 래퍼를 제공해야 했습니다. 이에 따라 네임스페이스에는 C 버전을 포함하는 alglib_impl과 C++ 래퍼를 포함하는 alglib라는 두 가지가 있습니다. ALGLIB++는 이 구조의 대부분과 가능한 한 많은 원래 코딩을 유지했지만, 멀티스레드 네이티브 C++ 코드로 대체하기 위한 첫 단계로 글로벌 인프라의 대부분을 줄이거나 제거했으며 C++ 래퍼 인터페이스를 크게 간소화했습니다. 따라서 ALGLIB 자체와 ALGLIB++가 변화하고 있는 미래의 라이브러리를 연결하는 중간 형태라고 할 수 있습니다.
MQL5가 적용된 버전 이후(그리고 그 이전에도) ALGLIB의 복잡성을 증가시키는 많은 문제들이 해결되어 구조가 단순화되고 복잡성이 감소했습니다. 현재의 형태에서는 현재 ALGLIB의 MQL5 버전을 유지 관리하고 있는 사용자들이 MQL5에 더 쉽게 적응할 수 있을 것입니다.
배포판에는 ALGLIB C++ 원본에서 ALGLIB++용 매뉴얼을 완전히 다시 포맷한 것이 포함되어 있습니다. 그러나 패키지와 하위 패키지의 섹션은 두 버전의 ALGLIB과 호환되며, 레이아웃과 내용 모두 MQL5 버전에 맞게 쉽게 조정할 수 있습니다. 매뉴얼의 '참조 및 관련 링크' 섹션에서 MQL5에 대해 자세히 설명합니다.
최신 버전은 향후 ALGLIB++에 통합하기 위해 LAPACK의 C++ 번역 버전인 LAPACK++도 준비 중입니다. 신경망 루틴이 있는 MKL을 포함한 다른 라이브러리도 향후 통합을 고려 중입니다.
ALGLIB을 MQL5에 적용할 때 "RCOMM" 루틴에 어려움을 겪을 수 있습니다.
ALGLIB을 MQL5에 적용할 때 "RCOMM" 루틴에 문제가 발생했습니다.
리디아에게: 네
하지만 github에 있는 ALGLIB ++ 라이브러리 파일은 여전히 C ++ CPP 형식입니다. MQL5 mql로 변환되지 않았습니다. ALGLIB ++ 라이브러리 파일을 .mql로 제공해 주시겠습니까? 감사합니다!
개발자 여러분, 복소수 구조에복소수의 공배수를 계산하는 메서드를 추가해 주세요 ( SB <Math\Alglib\complex.mqh>에 있는 소스 ).
내 버전:
다음 새 빌드가 릴리스된 후에는 이전버전으로 롤백해야 합니다. 불편합니다.
개발자 여러분, 복소수의 공액수를 계산하는 방법을복소수 구조에 추가해 주세요 ( SB <Math\Alglib\complex.mqh>에 있는 소스 ).
내 버전:
다음 새 빌드가 릴리스된 후에는 이전버전으로 롤백해야 합니다. 불편하죠.
추가됨