为MT制作一个Python交易系统。 - 页 5

 

昨天,我突然被SQLite 数据库迷住了。有一个现成的Python接口--https://docs.python.org/3.6/library/sqlite3.html。

结果,直到深夜我还在阅读数据库本身和Python接口的文档。 为了找出一些困惑,我为SQLite弄了几个完全无用的程序。在一般情况下,被迷住了。在被忽视之前浪费了。我第一次了解到的是,SQLite DB可以在内存中组织起来--只需一条命令:conn = sqlite3.connect(":memory:") --这是在Python中。这就够了。然后在进行一些查询,创建表格,并进行工作。

我曾经为同样的目的使用MS SQL Server或BD Access,并通过NET库的DataTable表在内存中组织数据库。而在这里,一个1.5MB长的DLL和一个命令,))),你什么都不用做。

现在,它是为了什么?这不是必要的,这是必要的。当你的系统在那里计算东西时,新的数据来自交易所--市场、交易、报价,你把它们塞进内存中的数据库。而当系统需要新的数据时,它都在这里,在手边,在内存中。你拿起它并使用它。你不必等待任何蜱虫之类的东西。此外,当有事发生时,你可以随时把心思从计算中抽出来,进行处理。同样,所有的信息都已经在那里,在你的记忆中。当然,你需要用户事件和线程,但这在哪里都不是问题。

那么,内存数据库的信息被保存到后台的主数据库中。

哦,SQLite虽然小,但支持多用户读/写访问。而在一般情况下,几乎所有的事情都像成年人一样--有一些限制,但在大多数情况下,它们要么是微不足道的,要么根本不干扰。

 

开始做SQLite数据库,做一些有用的东西也不错。让我们先把一个CSV文件导入数据库。

这里是文件本身的一个片段,共约5.5万行。

<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标题字符串和一个数据字符串。

现在是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表。

是的,从你运行程序开始,所有的乐趣都是3-4s,包括打开和读取CSV文件。顺便说一下,数据库文件的大小比类似的CSV文件要小。整个数据库为4.3MB,CSV大小为5.2MB。

好了,剩下的也是以同样的方式完成))。

 

让我们继续我们的 不受欢迎的话题,与当地人。

论坛上经常有关于从CSV文件读取数据的主题。仅在上周就已经有两起--我们需要阅读最后和最后的几行。

上次我们把数据从CSV文件写入数据库,今天我们要解决从数据库中读取行的问题。

在我们的数据库表中大约有5.5万条记录。让我们尝试一下,甚至不读最后一篇,而是读一些第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.035s

如你所见,一切都非常简单和快速。如果我是一个CSV文件的消费者,我会想,为什么我不在MT下写一个有5-6个功能的DL,并且使用DB而不是CSV文件。

PS 操纵数据库的CSV文件在几个帖子前附上的档案中。
 

是的,对于MQL4-5的开发者来说,生活并不容易。在网上搜索了是否有连接MT和SQLite的解决方案。SQL5.com的文章SQL AND MQL5: WORKING WITH SQLITE DATABASE 直接来自MQ,还有一些来自第三方开发者的材料。SQLite数据库过于复杂,程序也不那么简单,与Python中的类似程序不同。

事实上,在第一次使用SQLite时,只需将7-8个高级SQLite函数导入MQL即可。其余的,在大多数情况下,如果需要的话,将在遥远的未来需要。这项工作在最坏的情况下可以由一个C++程序员在几天内完成。但你也可以尝试现成的解决方案。

PS 仔细看一下《SQL和MQL5:与SQLITE 数据库合作》这篇文章。事实上,也许会成功。它只在那里使用x86 DLL来为MT准备x64 DLL。这篇文章毕竟是2014年的。但如果我没有弄错的话,已经有一个x64 SQLite DLL了。你可以试着用它进行编译。

 

Yuriy Asaulenko:

是的,对于MQL4-5的开发者来说,这不是一个容易的生活。.....我 认为这太复杂了,而且程序与Python中的类似程序不同,并不简单。

我认为,在Python中,问题也不小:你需要一个历史记录,你需要一个柱状图,你需要技术指标......我也会考虑一个测试器和交易....。

好吧,俗话说:所有的毛毡笔都是不同的,每个人的口味都不一样!

 
Igor Makanu:

我认为你用Python也有很多问题:你需要一个历史记录,你需要一个柱状图,你需要技术指标......我也会考虑一个测试器和 trading....。

好吧,俗话说:所有的毛毡笔都是不同的,每个人的口味都不一样!

历史不是问题,打气也不是问题。技术指标不是问题,而且我只有自己的指标。如果你需要它们,那里有简单的算法。

我有一个Python中的条形绘图工具。我的自动系统真的需要它吗?- 我不是在写一个终端。)

而且这并不是第一个这样的系统,早些时候在VB Excel上也有,在C++上也有,在C#上也有。实际上,选择Python是因为它有广泛的库,而且不希望从不同的语言和接口的混合中增加动物园来获得这些库的访问。此外,Python允许建模--这就是它的设计目的,而且在系统开发中非常重要。比方说,它是MathLab的直接竞争对手)。

 
Yuriy Asaulenko:

问题。

是否可以通过链接交换mql-kim和python kanvas?

这在C++中很容易做到,但我不知道在python中。

 
Nikolai Semko:

问题。

是否可以通过链接交换mql-kim和python kanvas?

这在C++中很容易做到,但我不知道在python中。

我不知道。

 

好消息)))-BetaMetaTrader 5 build 1910: 在MQL5中自由拖放图表和.Net库。 现在,当测试版工作时,你不需要写任何东西来连接到SQLite(以及许多其他库)。你不需要 将是 DLL的。

SQLite Net-libraries已经可用 -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

现在(或者说以后,当MT的工作版本出现时),我们可以忘记MT通过文件交换与交易系统的通信,而通过数据库进行通信。在这个主题的早些时候,已经表明它非常快,对大多数系统来说绰绰有余。

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:

好消息。))))-BetaMetaTrader 5 build 1910: 在MQL5中自由拖放图表和.Net库。 现在,当测试版开始工作时,你不需要写任何东西来连接到SQLite(以及许多其他库)。你不需要 将是 DLL的。

SQLite Net-libraries已经可用 -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

现在(或者说以后,当MT的工作版本出现时),我们可以忘记MT通过文件交换与交易系统的通信,而通过数据库进行通信。在本主题的早些时候,已经表明这非常快,对大多数系统来说绰绰有余。

你误解了这则新闻。

对.NET库的支持并不意味着对DLLs的安全控制被禁用。DLL控件一直在工作,并将一直工作。

我们只是让你加载.NET而不做任何修补。或者说,我们把与.NET虚拟机通信的所有混乱和非琐碎的工作都拿出来了,并隐藏了所有的不便之处。


然而,我们早就计划在MQL5中增加SQlite支持。很可能我们会。