MT용 Python으로 거래 시스템 만들기. - 페이지 5

 

어제 갑자기 SQLite 데이터베이스에 관심이 생겼습니다. Python에 대한 기성 인터페이스가 있습니다 - https://docs.python.org/3.6/library/sqlite3.html .

그 결과 밤늦게까지 데이터베이스 자체와 Python 인터페이스에 대한 설명서를 읽었습니다. 그 과정에서 약간의 오해를 명확히 하기 위해 SQLite에 대해 완전히 쓸모없는 몇 가지 프로그램을 만들었습니다. 일반적으로 나는 매료되었습니다. 헛되이 이전에 무시되었습니다. 내가 처음으로 배운 것은 SQLite 데이터베이스가 하나의 명령으로 메모리에 정기적으로 구성될 수 있다는 것입니다. conn = sqlite3.connect(":memory:") - 이것은 Python에 있습니다. 그게 다야. 또한 여러 요청에서 테이블을 만들고 작업합니다.

이전에는 같은 목적으로 MS SQL Server나 BD Access를 사용하고 DataTable NET 라이브러리의 테이블을 통해 메모리에 데이터베이스를 구성했습니다. 그리고 여기에 무게가 1.5MB인 DLL 하나와 명령 하나,)))) 아무 것도 수행할 필요가 없습니다.

이제 무엇을 위한 것입니까? 필요한 것은 아니지만 필요합니다. 시스템이 거기에서 무언가를 계산하는 동안 주문서, 거래, 견적과 같은 새로운 데이터가 교환에서 와서 메모리의 데이터베이스에 밀어넣습니다. 그리고 시스템에 새로운 데이터가 필요할 때 바로 여기 메모리에 있습니다. 가져가서 사용하세요. 진드기와 물건을 기다릴 필요가 없습니다. 또한 이벤트가 발생하면 언제든지 계산을 쉬고 처리할 수 있습니다. 다시 말하지만, 모든 정보는 이미 당신의 기억 속에 있습니다. 물론 이를 위해서는 사용자 이벤트와 스레드가 모두 필요하지만 더 이상 어디에서나 문제가 되지 않습니다.

그러면 백그라운드에 있는 메모리 데이터베이스의 정보가 메인 데이터베이스에 저장됩니다.

아, 그리고 SQLite는 작지만 다중 사용자 읽기/쓰기 액세스를 지원합니다. 일반적으로 거의 모든 것이 성인과 같습니다. 몇 가지 제한 사항이 있지만 대부분의 경우 중요하지 않거나 전혀 방해하지 않습니다.

 

SQLite 데이터베이스를 다루기 시작했는데 유용한 일을 하는 것이 좋습니다. CSV 파일을 데이터베이스로 가져오는 것부터 시작하겠습니다.

다음은 파일 자체의 한 부분으로 총 55,000줄입니다.

 < TICKER > , < PER > , < DATE > , < TIME > , < OPEN > , < HIGH > , < LOW > , < CLOSE > , < VOL >
SPFB.SBRF-12.17,1,01/09/17,10:01:00,18828.0000000,18838.0000000,18792.0000000,18838.0000000,25
SPFB.SBRF-12.17,1,01/09/17,10:02:00,18848.0000000,18858.0000000,18848.0000000,18858.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:03:00,18828.0000000,18828.0000000,18828.0000000,18828.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:04:00,18868.0000000,18868.0000000,18868.0000000,18868.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:05:00,18865.0000000,18879.0000000,18856.0000000,18879.0000000,10
SPFB.SBRF-12.17,1,01/09/17,10:06:00,18841.0000000,18851.0000000,18841.0000000,18851.0000000,3
SPFB.SBRF-12.17,1,01/09/17,10:07:00,18864.0000000,18864.0000000,18864.0000000,18864.0000000,1

앞서 설명한 Python으로 CSV 파일을 가져오는 것은 멈추지 않을 것입니다. 결과적으로 CSV 헤더 라인(제목 및 데이터 라인)이 있습니다.

이제 Python 프로그램 자체:

# строка заголовка CSV
title=csv.title
# строки данных CSV
data=csv.InData
# подсоединяемся к БД. Если БД отсутствует, создается новая с эти именем - наш случай.
con=sql.connect('csvdb.db')
# создаем курсор
cur=con.cursor()
# выполняем запрос создания таблицы SBER и ее полей (для упрощения все поля текстовые)
cur.execute("""create table SBER ('%s' text, '%s' text,
                                  '%s' text, '%s' text, '%s' text,
                                   '%s' text, '%s' text, '%s' text,
                                    '%s' text)""" % tuple(title))

#заполняем таблицу данными из CSV строк
cur.executemany("insert into SBER values (?,?,?,?,?,?,?,?,?)", data)
#Записываем данные в таблицу БД
con.commit()
#если БД больше не нужна, закрываем соединение.
con.close()

SQLiteStudio 프로그램에서 SBER 테이블을 봅니다.

예, CSV 파일 열기 및 읽기를 포함하여 프로그램을 시작하는 순간부터 3-4초의 모든 재미. 그런데 데이터베이스 파일의 크기는 CSV보다 작습니다. 전체 데이터베이스 - 4.3MB, CSV 크기 - 5.2MB

글쎄, 나머지는 같은 방식으로 수행됩니다.))

 

원주민들 사이에서 인기가 없는 주제를 계속합시다.

CSV 파일에서 데이터 읽기에 대한 스레드가 포럼에 정기적으로 나타납니다. 지난 주에만 이미 두 가지가있었습니다. 마지막에서 두 번째 줄을 읽어야했습니다.

마지막으로 CSV 파일의 데이터를 데이터베이스에 썼을 때, 오늘은 데이터베이스에서 행을 읽는 문제를 해결하는 방법을 살펴보겠습니다.

데이터베이스의 테이블에는 약 55,000개의 행이 있습니다. 마지막이 아니라 일부 27568번째까지 읽어보도록 합시다. 이렇게 하려면 SQL 쿼리를 작성하고 데이터베이스로 보냅니다.

#отметка времени начала 
Tb=dt.datetime.today()
#готовим и передаем в БД SQL запрос
cur.execute('select * from SBER where id=27568')
#читаем ответ, одну строку
s=cur.fetchone()
#отметка времени конца
Te=dt.datetime.today()
#все распечатываем.
print('Tb=' + str(Tb) +', Te=' + str(Te))
print('Te-Tb='+str(Te-Tb))
print(s)

모두. 결과:

Tb=2018-10-05 21:53:11.185492, Te=2018-10-05 21:53:11.188496
Te-Tb=0:00:00.003004
(27568, 'SPFB.SBRF-12.17', '1', '27/10/17', '10:55:00', '19692.0', '19708.0', '19691.0', '19704.0', '1123')

실행 시간 ~0.003004초

작업을 복잡하게 합시다. Close=22730.0000000인 라인 찾기

모든 것이 동일하고 요청 자체만 다르게 보입니다.

#это значение точно есть в строке №55420

cur.execute('select * from SBER where CLOSE=22730.0000000')
# читаем все строки, возвращаемые запросом.
s=cur.fetchall()

결과:

Tb=2018-10-05 22:03:09.797261, Te=2018-10-05 22:03:09.859763
Te-Tb=0:00:00.062502
[(38393, 'SPFB.SBRF-12.17', '1', '16/11/17', '18:16:00', '22708.0', '22734.0', '22707.0', '22730.0', '673'),
 (38932, 'SPFB.SBRF-12.17', '1', '17/11/17', '13:47:00', '22713.0', '22730.0', '22707.0', '22730.0', '194'), (38962,
 'SPFB.SBRF-12.17', '1', '17/11/17', '14:22:00', '22725.0', '22736.0', '22725.0', '22730.0', '362'),
 ...
 ...
 ...
 (55288, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:18:00', '22723.0', '22732.0', '22723.0', '22730.0', '87'), 
(55289, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:19:00', '22727.0', '22730.0', '22726.0', '22730.0', '17'),
 (55382, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:05:00', '22731.0', '22731.0', '22730.0', '22730.0', '322'),
 (55420, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:48:00', '22735.0', '22741.0', '22727.0', '22730.0', '315')]

20줄이 반환되었습니다. 실행 시간 ~0.0625c

자, 마지막으로 칼럼(필드)에서 가장 높은 가격을 결정하자 CLOSE

cur.execute('select max(CLOSE) from SBER')

B 답변:

Tb= 2018 - 10 - 05 22 : 11 : 28.979472 , Te= 2018 - 10 - 05 22 : 11 : 29.014472
Te-Tb= 0 : 00 : 00.035000
( '23540.0' ,) //это самая высокая цена.

음, 실행 시간 은 -0.035초입니다.

보시다시피 모든 것이 정상입니다. 간단하고 빠릅니다. CSV 파일의 소비자 대신 MT에서 5-6 기능이 있는 DLL을 작성하고 CSV 파일 대신 데이터베이스를 사용하는 것이 어떻습니까?

추신 몇 가지 게시물에 첨부된 아카이브의 데이터베이스로 연습이 수행된 CSV 파일입니다.
 

흠, MQL4-5 개발자의 삶은 쉽지 않다. MT를 SQLite에 연결하는 솔루션이 있는지 Google에서 검색했습니다. 예, 그러한 솔루션이 있습니다. MQL5.com의 기사 - SQL 및 MQL5: MQ에서 직접 SQLITE 데이터베이스 작업 및 여러 타사 자료. IMHO, 이 모든 것이 불필요하게 지나치게 복잡하고 프로그램은 Python의 프로그램과 달리 단순하지 않습니다.

사실 처음으로 SQLite로 작업하려면 7-8개의 고급 SQLite 기능만 MQL로 가져오면 충분합니다. 나머지는 필요한 경우 대부분 먼 미래에 있습니다. C++ 프로그래머는 최악의 경우 며칠 만에 이런 종류의 작업을 수행할 수 있습니다. 그러나 기성품 솔루션을 시도 할 수 있습니다.

추신 : SQL AND MQL5: WORKING WITH THE SQLITE DATABASE 기사를 자세히 살펴보았습니다. 실제로 효과가 있을 수 있습니다. 거기에서 x86 DLL만 MT용 x64 DLL을 준비하는 데 사용됩니다. 기사는 결국 2014년입니다. 하지만 제가 틀리지 않았다면 이미 x64 SQLite DLL이 있습니다. 그것으로 컴파일을 시도할 수 있습니다.

 

Yuriy Asaulenko :

흠, MQL4-5 개발자의 삶은 쉽지 않다. ..... IMHO, 이 모든 것이 불필요하게 지나치게 복잡하고 프로그램은 Python의 프로그램과 달리 단순하지 않습니다.

IMHO, Python에는 덜 문제가 없습니다. 역사를 형성해야하고, 막대를 그려야하고, 기술 지표 가 필요합니다 ... 테스터와 거래에 대해서도 생각할 것입니다 ....

글쎄, 그들이 말했듯이 모든 펠트 펜의 맛과 색상은 다릅니다!

 
Igor Makanu :

IMHO, Python에는 덜 문제가 없습니다. 역사를 형성해야하고, 막대를 그려야하고, 기술 지표 가 필요합니다 ... 테스터와 거래에 대해서도 생각할 것입니다 ....

글쎄, 그들이 말했듯이 모든 펠트 펜의 맛과 색상은 다릅니다!

역사는 질문이 아니며 그것의 교환이기도 합니다. 기술 지표는 질문이 아닙니다. 특히 저만의 지표만 있기 때문입니다. 음, 필요한 경우 표준 알고리즘은 간단한 알고리즘입니다.

Python에서 막대 그리기를 사용할 수 있습니다. 자동 시스템에 필요한가요? - 나는 터미널을 쓰지 않는다.)

예, 이러한 시스템은 처음이 아니라 VB Excel, C ++ 및 C #에 있었습니다. 실제로 Python은 라이브러리의 방대함과 이러한 라이브러리에 도달하기 위해 다양한 언어 및 인터페이스가 혼합된 동물원을 만드는 것을 꺼리기 때문에 선택되었습니다. 또한 Python을 사용하면 모델링을 수행할 수 있습니다. 사실 이것이 의도한 것이며 시스템을 개발할 때 매우 중요합니다. MatLab의 직접적인 경쟁자입니다.)

 
Yuriy Asaulenko :

문제.

링크를 통해 mql과 python 캔버스를 교환할 수 있나요?

C++에서는 이것이 하기 쉽지만 파이썬에서는 모릅니다.

 
Nikolai Semko :

문제.

링크를 통해 mql과 python 캔버스를 교환할 수 있나요?

C++에서는 이것이 하기 쉽지만 파이썬에서는 모릅니다.

모르겠어.

 

좋은 소식입니다.))) - MetaTrader 5 플랫폼 빌드 1910의 베타 버전: MQL5에서 차트 및 .Net 라이브러리의 무료 끌어서 놓기 . 이제 베타 버전이 실행되고 있으므로 SQLite에 연결하기 위해 아무 것도 작성할 필요가 없습니다(많은 다른 라이브러리와 마찬가지로). DLL 필요하지 않습니다.

SQLite Net 아래에 이미 라이브러리가 있습니다 - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

이제(좀 더 정확히 말하면 MT 작동 버전이 나온 후) MT가 파일 교환을 통해 거래 시스템과 통신하는 것을 잊고 데이터베이스를 통해 통신할 수 있습니다. 앞서 이 스레드에서 이것이 Pts인 것으로 나타났습니다. 대부분의 시스템에서 빠르고 충분합니다.

System.Data.SQLite: Home
  • system.data.sqlite.org
For the most recent news and developments, please see the news page. About System.Data.SQLite System.Data.SQLite is an ADO.NET provider for SQLite. System.Data.SQLite was started by Robert Simpson. Robert still has commit privileges on this repository but is no longer an active contributor. Development and maintenance work is now mostly...
 
Yuriy Asaulenko :

좋은 소식입니다.))) - MetaTrader 5 플랫폼 빌드 1910의 베타 버전: MQL5에서 차트 및 .Net 라이브러리의 무료 끌어서 놓기 . 이제 베타 버전이 실행되고 있으므로 SQLite에 연결하기 위해 아무 것도 작성할 필요가 없습니다(많은 다른 라이브러리와 마찬가지로). DLL 필요하지 않습니다.

SQLite Net 아래에 이미 라이브러리가 있습니다 - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

이제(좀 더 정확히 말하면 MT 작동 버전이 나온 후) MT가 파일 교환을 통해 거래 시스템과 통신하는 것을 잊고 데이터베이스를 통해 통신할 수 있습니다. 앞서 이 스레드에서 이것이 Pts인 것으로 나타났습니다. 대부분의 시스템에서 빠르고 충분합니다.

뉴스를 잘못 이해하셨습니다.

.NET 라이브러리에 대한 지원이 DLL 보안 제어가 비활성화된다는 의미는 아닙니다. DLL 제어는 항상 작동했으며 계속 작동할 것입니다.

우리는 드럼을 치지 않고 .NET을 로드하도록 허용했습니다. 오히려 우리는 .NET 가상 머신과 통신하는 모든 더럽고 사소한 작업을 인수하고 모든 불편을 숨겼습니다.


그러나 오랫동안 MQL5에 SQlite 지원을 추가할 계획이었습니다. 아마도 우리는 할 것입니다.