기고글 토론 "SQL 및 MQL5: SQLite 데이터베이스로 작업하기"

 

새로운 기고글 SQL 및 MQL5: SQLite 데이터베이스로 작업하기 가 게재되었습니다:

이 문서는 프로젝트에서 SQL을 사용하는 데 관심이 있는 개발자를 대상으로 합니다. SQLite의 기능과 장점을 설명합니다. 이 문서에서는 SQLite 기능에 대한 특별한 지식이 필요하지 않지만 SQL에 대한 최소한의 이해만으로도 유용합니다.

많은 개발자들이 데이터 스토리지 목적으로 프로젝트에 데이터베이스를 사용하는 것을 고려하지만 SQL 서버 설치에 소요되는 추가 시간이 얼마나 되는지 알고도 이에 대해 주저하고 있습니다. 또한 프로그래머에게는 그다지 어렵지 않을 수 있지만(데이터베이스 관리 시스템(DBMS)가 이미 다른 용도로 설치되었다면) 결국 소프트웨어를 함께 설치하는 것을 꺼릴 수 있는 일반 사용자에게는 분명 문제가 될 것입니다.

따라서 많은 개발자들은 현재 작업 중인 솔루션이 극소수만 사용할 것이라는 사실을 깨닫고 DBMS를 다루지 않기로 합니다. 그 결과, 파일 작업(사용되는 데이터의 다양성에 따라 둘 이상의 파일을 처리해야 하는 경우가 종종 있음)으로 전환됩니다. CSV, XML 또는 JSON, 구조 크기가 엄격한 이진 데이터 파일 등이 있습니다.

하지만 SQL 서버에는 훌륭한 대안이 있습니다! 또한 프로젝트의 모든 작업이 로컬에서 수행되므로 추가 소프트웨어를 설치할 필요가 없습니다. SQL의 모든 기능을 사용할 수 있습니다. 우리는 SQLite에 대해 이야기하고 있습니다.

이 문서의 목적은 SQLite를 신속하게 시작하기 위한 것입니다. 따라서 하위 계층과 상상할 수 있는 모든 매개 변수 집합 및 함수 플래그에 대해 설명하지 않고 SQL 명령을 실행하기 위한 가벼운 연결 래퍼를 만들고 그 사용을 시연할 것입니다.

기사를 진행하려면 다음을 수행해야 합니다:

  • 기분을 좋게 하세요 ;)
  • 기사에 첨부된 보관 파일을 MetaTrader 5 클라이언트 터미널 폴더에 추출합니다.
  • 편리한 SQLite 뷰어(예: SQLiteStudio)를 설치합니다.
  • SQLite에 대한 공식 문서를 즐겨찾기에 추가합니다. http://www.sqlite.org

작성자: ---

 

몇 가지 중요한 추가 사항(및 개선 제안 사항:))이 있습니다.

1. 작성자는 sqlite_open() 함수를 사용하지만 - 데이터베이스 파일에 대한 액세스 구분 제어 - 임시 인 메모리 데이터베이스 생성 - 로컬 파일 시스템뿐만 아니라 URI로 데이터베이스 작업 등을 의미하는 개방 플래그와 함께 작동 할 수있는보다 유연한 함수 sqlite_open_v2()가 있습니다.

#define  SQLITE_OPEN_READONLY         0x00000001  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_READWRITE        0x00000002  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_CREATE           0x00000004  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_DELETEONCLOSE    0x00000008  /* VFS 전용 */
#define  SQLITE_OPEN_EXCLUSIVE        0x00000010  /* VFS 전용 */
#define  SQLITE_OPEN_AUTOPROXY        0x00000020  /* VFS 전용 */
#define  SQLITE_OPEN_URI              0x00000040  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_MEMORY           0x00000080  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_MAIN_DB          0x00000100  /* VFS 전용 */
#define  SQLITE_OPEN_TEMP_DB          0x00000200  /* VFS 전용 */
#define  SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* VFS 전용 */
#define  SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* VFS 전용 */
#define  SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* VFS 전용 */
#define  SQLITE_OPEN_SUBJOURNAL       0x00002000  /* VFS 전용 */
#define  SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* VFS 전용 */
#define  SQLITE_OPEN_NOMUTEX          0x00008000  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_FULLMUTEX        0x00010000  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_SHAREDCACHE      0x00020000  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_PRIVATECACHE     0x00040000  /* sqlite3_open_v2()에 대해 확인 */
#define  SQLITE_OPEN_WAL              0x00080000  /* VFS 전용 */

2. 계산에 "무거운" 지표를 사용할 때 EA 최적화를 가속화하는 문제를 해결하기 위해 sqlite를 사용해 왔습니다. 이러한 상황에서 논리적 인 해결책은 첫 번째 실행 중에 최적화 기간 동안의 지표 판독 값을 데이터베이스에 저장하고 후속 실행 중에 이미 계산 된 판독 값을 데이터베이스에서 직접 추출하는 것입니다. 따라서 "기본 형태"로 sqlite 엔진을 사용하면 많은 INSERT 및 SELECT 쿼리를 전송하는 프로세스에 많은 시간이 걸리기 시작합니다. 실제로는 1) 나중에 데이터를 남겨두고 싶을 때 항상 좋은 것은 아닌 인메모리 데이터베이스와 2) SQL 엔진의 #pragma-지시어를 사용하는 방법이 있다는 것을 알았습니다.

두 번째 옵션은 데이터베이스를 RAM에서 디스크로 덤프할 필요가 없으므로 더 바람직합니다. 다음과 같은 방식으로 수행됩니다. 데이터베이스에 첫 번째 테이블을 만들기 전에 다음 쿼리를 보내야합니다:

"PRAGMA temp_store = MEMORY;"
"PRAGMA page_size = 65536;"
"PRAGMA cache_size = 16384;"
"PRAGMA journal_mode = OFF;"
"PRAGMA locking_mode = EXCLUSIVE;"
"PRAGMA synchronous = OFF;"

음, 그 후에는

"CREATE TABLE IF NOT EXISTS"

모두에게 행운을 빕니다!

 
alsu:

몇 가지 중요한 추가 사항(및 개선 제안:))이 있습니다.

1. 작성자는 sqlite_open() 함수를 사용하지만, - 데이터베이스 파일에 대한 액세스 구분 제어, - 임시 인메모리 데이터베이스 생성, - 로컬 파일 시스템뿐만 아니라 URI로 데이터베이스 작업 등을 수행할 수 있는 보다 유연한 sqlite_open_v2() 함수가 있습니다.

2. 계산에 "무거운" 지표를 사용할 때 EA 최적화를 가속화하는 문제를 해결하기 위해 sqlite를 사용해 왔습니다. 이러한 상황에서 논리적 인 해결책은 첫 번째 실행 중에 최적화 기간 동안의 지표 판독 값을 데이터베이스에 저장하고 후속 실행 중에 이미 계산 된 판독 값을 데이터베이스에서 직접 추출하는 것입니다. 따라서 "기본 형태"로 sqlite 엔진을 사용하면 많은 INSERT 및 SELECT 쿼리를 전송하는 프로세스에 많은 시간이 걸리기 시작합니다. 실제로는 1) 나중에 데이터를 남겨두고 싶을 때 항상 좋은 것은 아닌 인메모리 데이터베이스와 2) SQL 엔진의 #pragma-지시어를 사용하는 것이 탈출구라는 것을 알았습니다.

두 번째 옵션은 데이터베이스를 RAM에서 디스크로 덤프할 필요가 없으므로 더 바람직합니다. 다음과 같은 방법으로 수행됩니다. 데이터베이스에 첫 번째 테이블을 만들기 전에 다음 쿼리를 보내야 합니다:

음, 그 후에는 다음을 수행 할 수 있습니다.

모두에게 행운을 빕니다!

테스터를 실행할 때 표시기 판독 데이터는 본질적으로 단순한 배열, 순차적 액세스가 가능한 스트림이므로 SQL베이스에 저장하고 읽는 것은 중복되고 합리적이지 않습니다.

이 글의 저자가 SQLite 적용의 예로 제안한 거래 작업 목록에 대해서도 마찬가지입니다.

따라서 관계형 다중 링크 데이터 모델 사용의 효율성은 주로 해결되는 작업에 따라 달라지며, 이 예제에서 IMHO는 "귀로만 당겨지는" 것일 수 있다는 점을 인식해야 합니다.
.

 
MonetDB라는 열 형식의 SQL DBMS가 있습니다. 이것은 열에 데이터를 저장하도록 설계된 무료 DBMS이며이 데이터베이스는 속도와 안정성이 우수합니다. 제가 착각하지 않았다면 모든 SQL DBMS는 주제에 제시된 방식으로 MT에 연결할 수 있습니다.
 
revers45:

테스터 실행 중 표시기 판독값 데이터는 본질적으로 직렬 액세스가 가능한 스트림인 단순한 배열이므로 SQL 데이터베이스에 저장하고 읽는 것은 중복되고 합리적이지 않습니다.

중복되고 합리적이지 않더라도 다시 읽어보세요: Expert Advisor를 최적화하기 위해 다음과 같이 하세요.


 

사용할 수 있고 좋습니다. 또 다른 한 가지는 SQLite를 심각한 프로젝트에 사용해서는 안된다는 것입니다. 어쨌든 나는 그것을 추천하지 않을 것입니다. 나 자신도 두 번 이상 충돌 문제에 직면했습니다. 예를 들어, 거래 로봇이 다른 차트에 연결되어 있지만 동일한베이스를 사용하고 액세스가 하나의 범용 테이블 (예 : 등록 / 변경 세션, 계정)에 액세스하는 경우 어떤 경우에도 "테이블 잠김"과 같은 오류가 발생합니다. 그리고 모든 트랜잭션이 완료되고 커서가 닫히고 데이터베이스가 공유 모드에서 열렸어도 상관없습니다. 이 문제는 SQLite 개발자에게도 알려져 있습니다.

제 생각에는 MS Access는 SQL을 지원하는 파일 데이터베이스 중 최고입니다. 아무리 소심한 사람들을 꾸짖어도 저는 MS Access를 위해 SQLite를 떠났고 전혀 후회하지 않습니다. OleDB 드라이버 Jet 4.0은 Win98에서도 설치되므로 모든 OC 윈도우에서 프로젝트가 작동합니다.

 
멋진 아이디어와 기사, 저는 그렇게 생각하지 못했습니다. 하지만 마켓의 제품에서 사용할 수 있도록 mql5를 기본적으로 지원하면 좋을 것 같습니다.
 

먼저 여러분의 노고에 감사드립니다!

성공적으로 mql4로 포팅했습니다! (일부 #property strict, 컴파일 오류 해결).

그리고 32비트 플랫폼을 사용하기 때문에 일부 64비트 관련 가져오기 기능을 주석 처리하고 삭제해야 했습니다. 터미널은 조기 바인딩을 사용하므로 프로그램 로드 중에 64비트-dll도 로드를 시도합니다. (사용되지는 않지만 32bit.dll만).오류가 발생했습니다.

하지만 어쨌든, 나는 당신의 구현을 좋아합니다! (나는 당신처럼 좋은 프로그램을 작성하고 싶습니다.)

 
64비트 버전의 메타트레이더 5를 사용 중인데 코드가 작동하지 않습니다. 32비트 코드에 대한 참조를 제거하려고 했지만 여전히 "Sqlite3_32.dll"을 로드할 수 없다는 오류가 발생합니다. 이 dll을 참조하는 코드가 어디 있는지 알 수 있나요? 64비트에서 작동하도록 해야 합니다.
 

스크립트가 작동하지 않고 즉시 작동하지 않으며 이러한 프로젝트를 휴지통에 버립니다.

콘솔에서 https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

스크립트가 작동하지 않고 즉시 작동하지 않습니다.

해야 할 일과 방법을 모르는 경우 매뉴얼을 참고하세요.