Fazendo um sistema comercial Python para MT. - página 5

 

Ontem fiquei subitamente fascinado com o banco de dadosSQLite. Existe uma interface Python pronta para isso -https://docs.python.org/3.6/library/sqlite3.html.

Como resultado, até tarde da noite eu li documentação tanto sobre o próprio banco de dados quanto sobre a interface Python. Para descobrir alguma da confusão, eu estraguei um par de programas completamente inúteis para o SQLite. Em geral, fascinado. Desperdiçado antes de ser negligenciado. O que eu aprendi pela primeira vez é que o banco de dados SQLite pode ser organizado em memória - com um comando: conn = sqlite3.connect(":memory:") - isto é em Python. Isso é tudo o que é preciso. Depois, em algumas consultas, crie tabelas e trabalhe.

Eu costumava usar o MS SQL Server ou BD Access para o mesmo propósito, e o banco de dados organizado em memória através de tabelas DataTable de bibliotecas NET. E aqui, uma DLL de 1,5 MB de comprimento e um comando,)), e você não precisa fazer nada.

Agora, para que serve? Não é necessário, é necessário. Enquanto seu sistema está contando algo lá, novos dados vêm do intercâmbio - o mercado, ofertas, cotações, e você os enfia no banco de dados em memória. E quando o sistema precisa de novos dados, tudo isso está aqui, na memória. Você o pega e o usa. Você não precisa esperar por nenhum carrapato e outras coisas. Além disso, quando algo acontece, você pode sempre tirar sua mente dos cálculos e processá-lo. Mais uma vez, todas as informações já estão lá, em sua memória. É claro, você precisa de eventos e tópicos de usuário, mas não é um problema em nenhum lugar.

Bem, então, as informações do banco de dados da memória são salvas no banco de dados principal em segundo plano.

Ah, e SQLite, embora pequeno, suporta acesso de leitura/escrita para múltiplos usuários. E em geral, quase tudo é como adultos - há algumas limitações, mas na maioria dos casos, ou são insignificantes ou não interferem em nada.

 

Começou a fazer banco de dados SQLite, não é ruim fazer algo útil. Vamos começar importando um arquivo CSV para o banco de dados.

Aqui está um trecho do próprio arquivo, cerca de 55 mil linhas no total.

<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

Já descrevemos anteriormente como importar arquivo CSV para Python, não vamos parar aqui. Como resultado, temos uma cadeia de título CSV e uma cadeia de dados.

Agora o próprio programa 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()

Vemos a tabela da SBER no SQLiteStudio:

Sim, toda a diversão é de 3-4s desde o momento em que você executa o programa, incluindo a abertura e leitura do arquivo CSV. A propósito, o tamanho do arquivo do banco de dados é menor do que um arquivo CSV similar. O banco de dados completo é de 4,3 MB, o tamanho do CSV é de 5,2 MB.

Bem, o resto é feito da mesma maneira)).

 

Vamos continuar nosso tópico impopular com os nativos.

Há tópicos regulares no fórum sobre a leitura de dados de arquivos CSV. Só na última semana já houve duas - precisávamos ler a última e as últimas linhas.

Da última vez que escrevemos dados de um arquivo CSV no banco de dados, hoje vamos resolver o problema da leitura de linhas do banco de dados.

Há cerca de 55 mil filas em nossa tabela de banco de dados. Vamos tentar ler nem mesmo o último, mas cerca de 27568º. Para fazer isso, vamos escrever uma consulta SQL e enviá-la para o banco de dados:

#отметка времени начала 
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)

É isso aí. Temos o resultado:

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')

Tempo de execução ~0,003004 seg.

Vamos tornar a tarefa mais difícil. Encontrar linhas, onde Close=22730.0000000

Tudo é o mesmo, mas a pergunta parece diferente.

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

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

O resultado:

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 linhas foram devolvidas. Tempo de execução ~0,0625c.

Finalmente, vamos encontrar o preço mais alto na coluna (campo) FECHAR

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

B resposta:

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

Bem, e um tempo de execução de -0,035s

Como você vê, tudo é muito simples e rápido. Se eu fosse um consumidor de arquivos CSV, eu pensaria, porque não escrever um DL com 5-6 funções sob MT, e usar DB em vez de arquivos CSV.

PS O arquivo CSV no qual o banco de dados foi manipulado está no arquivo anexado há alguns posts atrás.
 

Sim, a vida não é fácil para os desenvolvedores da MQL4-5. Procurei no Google se existem soluções para conectar o MT ao SQLite. O artigo SQL5.com SQL E MQL5: TRABALHANDO COM BASE DE DADOS SQLITE diretamente da MQ, e alguns materiais de desenvolvedores de terceiros. O banco de dados SQLite é excessivamente complicado, e os programas não são tão simples assim, ao contrário dos programas similares em Python.

Na verdade, para trabalhar com SQLite na primeira vez é suficiente importar apenas 7-8 funções SQLite de alto nível para MQL. O resto, em sua maioria, se for necessário, será necessário num futuro distante. Este trabalho pode ser feito por um programador C++ no pior caso, em alguns dias. Mas você também pode tentar soluções prontas.

PS Veja mais de perto o artigoSQL E MQL5: TRABALHANDO COM BASE DE DADOS SQLITE. Na verdade, talvez funcione. Ele só usa DLL x86 ali para preparar DLL x64 para MT. O artigo é de 2014, afinal de contas. Mas, se não me engano, já existe uma DLL SQLite x64. Você pode tentar compilar com ele.

 

Yuriy Asaulenko:

Sim, não é uma vida fácil para os desenvolvedores da MQL4-5...... Acho que é complicado demais, e os programas, ao contrário dos similares em Python, não são simples.

Imho, em Python os problemas não são menos: você precisa de um histórico, você precisa de um gráfico de barras, você precisa de indicadores técnicos... Eu também pensaria em um testador e também em uma negociação....

Bem, como diz o ditado: todas as canetas de feltro são diferentes para cada gosto!

 
Igor Makanu:

imho você tem tantos problemas com Python: você precisa de um histórico, você precisa de um gráfico de barras, você precisa de indicadores técnicos... Eu também pensaria em um tester e trading....

Bem, como diz o ditado: todas as canetas de feltro são diferentes para cada gosto!

A história não é um problema e o bombeamento também o é. Os indicadores técnicos não são um problema, além disso, eu só tenho meus próprios indicadores. Se você precisar deles, há ali algoritmos simples.

Eu tenho uma ferramenta de desenho de barras em Python. Eu realmente preciso dele para o meu autossistema? - Eu não estou escrevendo um terminal).

E não é o primeiro sistema desse tipo, havia anteriormente no VB Excel, e no C++, e no C#. Na verdade, Python é escolhida por causa da extensão das bibliotecas e da falta de desejo de multiplicar o zoológico a partir da mistura de diferentes linguagens e interfaces para ter acesso a essas bibliotecas. Além disso, Python permite a modelagem - é para isso que foi projetado, e é muito importante no desenvolvimento de sistemas. Digamos que é um concorrente direto do MathLab).

 
Yuriy Asaulenko:

Pergunta.

É possível trocar kanvas mql-kim e python através de um link?

É fácil de fazer em C++, mas eu não sei em python.

 
Nikolai Semko:

Pergunta.

É possível trocar kanvas mql-kim e python através de um link?

É fácil de fazer em C++, mas eu não sei em python.

Eu não tenho.

 

Boas notícias)))) -BetaMetaTrader 5 build 1910: Free Drag & Drop of Charts e Biblioteca .Net em MQL5 . Agora, quando o beta está funcionando, você não precisa escrever nada para se conectar ao SQLite ( assim como muitas outras bibliotecas). Você não vai precisar será DLL's.

Já estão disponíveis as bibliotecas SQLite Net-libraries -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Agora (ou melhor, mais tarde, quando a versão funcional da MT aparecer) podemos esquecer a comunicação da MT com o sistema de negociação via troca de arquivos e nos comunicarmos via banco de dados. Anteriormente nesta linha foi mostrado que é muito rápido e mais do que suficiente para a maioria dos sistemas.

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:

Boas notícias.))) -BetaMetaTrader 5 build 1910: Free Drag & Drop of Charts e .Net Libraries em MQL5 . Agora, quando o beta estiver funcionando, você não precisará escrever nada para se conectar ao SQLite ( assim como muitas outras bibliotecas). Você não vai precisar será DLL's.

Já estão disponíveis as bibliotecas SQLite Net-libraries -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Agora (ou melhor, mais tarde, quando a versão funcional da MT aparecer) podemos esquecer a comunicação da MT com o sistema de negociação via troca de arquivos e nos comunicarmos via banco de dados. Anteriormente nesta linha foi mostrado que isto é muito rápido e mais do que suficiente para a maioria dos sistemas.

Você entendeu mal as notícias.

O suporte a bibliotecas .NET não significa que os controles de segurança em DLLs estão desativados. Os controles DLL sempre funcionaram e sempre funcionarão.

Nós apenas deixamos você carregar .NET sem nenhum ajuste. Ou melhor, pegamos todo o trabalho sujo e não trivial de comunicação com a máquina virtual .NET e escondemos todos os inconvenientes.


Entretanto, há muito tempo temos planejado acrescentar o suporte SQlite na MQL5. O mais provável é que o façamos.
Razão: