Делаем торговую систему на 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,5 MB и одна команда,))) и делать ничего не надо.

Теперь, для чего это надо? Это не надо, а необходимо. Пока ваша система что-то там считает, с биржи приходят новые данные - стакан, сделки, котировки, и вы их пихаете в БД в памяти. И когда системе требуются новые данные, они уже все здесь, под рукой, в памяти. Бери и пользуйся. Не надо ждать никаких тиков и прочего. Кроме того, когда происходит некое событие, вы всегда можете отвлечься от расчетов и его обработать. Опять-таки, вся информация уже у вас, в памяти. Безусловно для этого нужны и события пользователя и потоки, но это уже нигде не проблема.

Ну, а дальше, информация из БД памяти в фоновом режиме сохраняется в основную базу.

Да, и еще, SQLite, хоть и маленькая, но поддерживает многопользовательский доступ чтение/запись. А вообще, почти все как у взрослых - есть некоторые ограничения, но, в большинстве случаев, они или несущественны или вообще не мешают.

 

Начали заниматься БД SQLite, неплохо сделать что-то полезное. Начнем с импорта в БД файла CSV.

Вот кусок самого файла, всего около 55 тысяч строк.

<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

Импорт CSV файла в Python мы описывали ранее, останавливаться не будем. В результате, у нас есть строка заголовка CSV - title и строки данных - data.

Теперь сама программа 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()

Смотрим на таблицу SBER в программе SQLiteStudio:

Да, все удовольствие 3-4 с с момента запуска программы, включая открытие и чтение CSV файла. Кстати, размер файла БД меньше аналогичного CSV. Вся БД - 4.3 МБ, размер CSV - 5.2 МБ

Ну, остальное делается так-же.))

 

Продолжим нашу мою непопулярную у аборигенов тему.

На форуме регулярно появляются темы о чтении данных из CSV-фалов. Только за последнюю неделю их уже было две - требовалось прочитать последние-предпоследние пару строк.

Прошлый раз мы записали данные CSV-файла в БД, сегодня мы рассмотрим решение задачи чтения строк из БД.

В нашей таблице в БД около 55 тысяч строк. Попробуем прочитать даже не последнюю, а какую-нибудь 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 c

Усложним задачу. Найдем строки, где 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-файлов, я бы задумался, отчего-бы под МТ не написать ДЛЛ с 5-6-ю функциями и использовать БД вместо CSV-файлов.

PS Файл CSV, на котором проводились экзерсисы с БД в архиве, прикрепленном несколько постов назад.
 

М-да, нелегка жизнь MQL4-5 разработчиков. Погуглил, есть ли решения для подключения МТ к SQLite. Да, такие решения есть - статья на MQL5.com - SQL И MQL5: РАБОТАЕМ С БАЗОЙ ДАННЫХ SQLITE непосредственно от MQ, и несколько материалов сторонних разработчиков. Имхо, все это излишне переусложнено, и программы, в отличие от аналогичных на Python, простотой не отличаются.

На самом деле, чтобы работать с SQLite на первое время достаточно импортировать в MQL всего 7-8 высокоуровневых функций SQLite. Остальное, по большей части, если и понадобится, то в отдаленном будущем. Такую работу С++ программист может выполнить, в худшем случае, за пару дней. Но можно попробовать и готовые решения.

PS Посмотрел более внимательно статью SQL И MQL5: РАБОТАЕМ С БАЗОЙ ДАННЫХ SQLITE. Вообще, может что и получится. Там только х86 ДЛЛ используется для приготовления х64 DLL под МТ. Статья, все-таки, 2014 г. Но, если не ошибаюсь уже есть и х64 ДЛЛ SQLite. Можно попробовать скомпилировать с ней.

 

Yuriy Asaulenko:

М-да, нелегка жизнь MQL4-5 разработчиков. .....Имхо, все это излишне переусложнено, и программы, в отличие от аналогичных на Python, простотой не отличаются.

имхо у Вас на Питоне проблем не меньше: нужно историю формировать, нужно рисовалку баров делать, нужны технические индикаторы...про тестер и торговлю я бы тоже подумал....

ну как говорится: на вкус и цвет все фломастеры разные!

 
Igor Makanu:

имхо у Вас на Питоне проблем не меньше: нужно историю формировать, нужно рисовалку баров делать, нужны технические индикаторы...про тестер и торговлю я бы тоже подумал....

ну как говорится: на вкус и цвет все фломастеры разные!

История не вопрос и ее подкачка тоже. Технические индикаторы - не вопрос, тем более у меня только свои индикаторы. Ну, а стандартные, если понадобятся, - там несложные алгоритмы.

Рисовалка баров в Python имеется. Вот нужна ли она для автосистемы? - я-ж не терминал пишу.)

Да и не первая такая система, раньше были и на VB Excel, и на С++, и на C#. Собственно, Python выбран из-за обширности библиотек и нежелания плодить зоопарк из смеси разных языков и интерфейсов, чтобы достучаться до этих библиотек. Кроме того, Python позволяет заниматься моделированием - собственно, для того и предназначен, и это оч важно при разработке системы. Скажем, прямой конкурент МатЛабу.)

 
Yuriy Asaulenko:

Вопрос.

Можно ли через ссылку обмениваться mql- ким и  питоновским канвасом?

В C++ это делается легко, а вот в питоне - не знаю. 

 
Nikolai Semko:

Вопрос.

Можно ли через ссылку обмениваться mql- ким и  питоновским канвасом?

В C++ это делается легко, а вот в питоне - не знаю. 

Не знаю.

 

Благая весть.))) -Бета-версия платформы MetaTrader 5 build 1910: Свободное перетаскивание графиков и .Net библиотеки в MQL5 . Теперь, когда бета-версия станет рабочей, для соединения с SQLite ( как, впрочем, и многими другими библиотеками) не надо ничего писать. Не нужны будут никакие DLL.

Под SQLite Net -библиотеки уже есть - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Теперь (точнее, чуть позднее, после появления рабочей версии МТ) об общении МТ с  торговой системой через обмен файлами можно забыть, и общаться через БД. Ранее, в этой теме, показано, что это оч. быстро и для большинства систем более чем достаточно.

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 build 1910: Свободное перетаскивание графиков и .Net библиотеки в MQL5 . Теперь, когда бета-версия станет рабочей, для соединения с SQLite ( как, впрочем, и многими другими библиотеками) не надо ничего писать. Не нужны будут никакие DLL.

Под SQLite Net -библиотеки уже есть - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Теперь (точнее, чуть позднее, после появления рабочей версии МТ) об общении МТ с  торговой системой через обмен файлами можно забыть, и общаться через БД. Ранее, в этой теме, показано, что это оч. быстро и для большинства систем более чем достаточно.

Вы неправильно поняли новость.

Поддержка .NET библиотек не означает, что контроль безопасности над DLL отключен. Контроль за DLL всегда работал и будет работать.

Мы лишь позволили загружать .NET без танцев с бубном. Вернее, всю грязную и нетривиальную работу по связи с виртуальной машиной .NET мы взяли на себя и скрыли все неудобства.


А вот поддержку SQlite мы давно планировали добавить в MQL5. Скорее всего, сделаем.
Причина обращения: