Discussão do artigo "SQL e MQL5: Trabalhando com Banco de Dados SQLite"

 

Novo artigo SQL e MQL5: Trabalhando com Banco de Dados SQLite foi publicado:

Este artigo é destinado aos desenvolvedores interessados ​​em usar SQL em seus projetos. Ele explica as funcionalidades e vantagens do SQLite. O artigo não exige conhecimentos especiais de funções SQLite, mas é interessante um conhecimento mínimo de SQL.


Muitos desenvolvedores usam bancos de dados em seus projetos para fins de armazenamento de dados e ficam hesitantes sobre isso, preocupados com quanto tempo extra a instalação do servidor SQL exigirá. E se não é tão difícil para os programadores (se um sistema de gerenciamento de banco de dados (DBMS) já foi instalado para outros fins), a instalação certamente vai ser um problema para o usuário comum que pode eventualmente ser desencorajado a instalar o software completamente.

Assim muitos desenvolvedores optam por não lidar com DBMS ao perceberem que as soluções trabalhadas serão usadas por muito poucas pessoas. Como resultado, eles se voltam para trabalhar com arquivos (muitas vezes tendo que lidar com mais de um arquivo, devido a variedade de dados utilizados): CSV, menos frequentemente XML ou JSON, ou arquivos de dados binários com rigoroso tamanho da estrutura, etc.

Portanto, verifica-se que é uma ótima alternativa o servidor SQL! E você não precisa nem instalar software adicional, pois tudo é feito localmente em seu projeto, enquanto ainda for permitido que você use o poder SQL. Estamos falando sobre SQLite.

O objetivo deste artigo é que você possa rapidamente começar com SQLite. Por isso não vou entrar em sutilezas e em todos os conjuntos de parâmetros que se possa imaginar e flags de funções, mas em vez disso vamos criar uma suave conexão wrapper para executar comandos SQL e demonstrar seu uso.

Para prosseguir com o artigo, você precisa:

  • Esteja de bom humor ;)
  • Extraia os arquivos anexados ao artigo para a pasta do terminal do cliente MetaTrader 5
  • Instale qualquer Visualizador SQLite (por exemplo: SQLiteStudio)
  • Adicionar aos Favoritos a documentação oficial sobre SQLite no link http://www.sqlite.org

Autor: o_O

 

Há algumas adições importantes (e sugestões de aprimoramento:))

1. o autor usa a função sqlite_open(), mas há uma função mais flexível, sqlite_open_v2(), que pode trabalhar com sinalizadores de abertura, o que significa: - controlar a delimitação de acesso ao arquivo de banco de dados; - criar bancos de dados temporários na memória; - trabalhar com o banco de dados por URI, não apenas no sistema de arquivos local etc.

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

2. Tenho usado o sqlite para resolver o problema de acelerar a otimização do EA quando ele usa um indicador que é "pesado" em cálculos. A solução lógica em tal situação é salvar as leituras do indicador para o período de otimização no banco de dados durante a primeira execução e, durante as execuções subsequentes, extrair diretamente as leituras já calculadas do banco de dados. Portanto, se você usar o mecanismo sqlite na "forma padrão", o processo de envio de muitas consultas INSERT e SELECT começará a levar muito tempo. Na prática, descobriu-se que a saída é usar 1) banco de dados na memória, o que nem sempre é bom se quisermos deixar os dados para depois, e 2) #pragma-directives do mecanismo SQL.

A segunda opção é mais preferível, pois elimina a necessidade de despejar o banco de dados da RAM para o disco. Isso é feito da seguinte maneira: antes de criar a primeira tabela no banco de dados, é necessário enviar a ele as seguintes consultas:

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

Bem, e depois disso você pode

"CREATE TABLE IF NOT EXISTS"

etc.

Boa sorte a todos!

 
alsu:

Há algumas adições importantes (e sugestões de aprimoramento:))

1. o autor usa a função sqlite_open(), mas há uma função sqlite_open_v2() mais flexível que pode trabalhar com sinalizadores de abertura, o que significa: - controlar a delimitação de acesso ao arquivo de banco de dados; - criar bancos de dados temporários na memória; - trabalhar com o banco de dados por URI, não apenas no sistema de arquivos local etc.

2. Tenho usado o sqlite para resolver o problema de acelerar a otimização do EA quando ele usa um indicador que é "pesado" em cálculos. A solução lógica em tal situação é salvar as leituras do indicador para o período de otimização no banco de dados durante a primeira execução e, durante as execuções subsequentes, extrair diretamente as leituras já calculadas do banco de dados. Portanto, se você usar o mecanismo sqlite na "forma padrão", o processo de envio de muitas consultas INSERT e SELECT começará a levar muito tempo. Na prática, descobriu-se que a saída é usar 1) banco de dados na memória, o que nem sempre é bom se quisermos deixar os dados para depois, e 2) #pragma-directives do mecanismo SQL.

A segunda opção é mais preferível, pois elimina a necessidade de despejar o banco de dados da RAM para o disco. Isso é feito da seguinte maneira: antes de criar a primeira tabela no banco de dados, você deve enviar as seguintes consultas a ela:

Bem, e depois disso você pode

etc.

Boa sorte a todos!

Os dados das leituras do indicador ao executar o testador são, por natureza, uma matriz simples, um fluxo com acesso sequencial, portanto, é redundante e não é racional salvá-los e lê-los na base SQL.

O mesmo pode ser dito sobre a lista de operações comerciais proposta pelo autor do artigo como um exemplo de aplicação do SQLite.

Portanto, devemos perceber que a eficiência do uso de modelos de dados relacionais e com vários links depende principalmente das tarefas que estão sendo resolvidas e, nesses exemplos, IMHO, pode ser apenas "puxado pelas orelhas".
.

 
Existe um DBMS SQL colunar chamado MonetDB. Esse é um DBMS gratuito projetado para armazenar dados em colunas, e esse banco de dados tem boa velocidade e confiabilidade. Se não me engano, qualquer DBMS SQL pode ser conectado ao MT da maneira apresentada no tópico.
 
revers45:

Os dados das leituras do indicador durante a execução do testador são, por sua natureza, uma matriz simples, um fluxo com acesso serial, portanto, é redundante e não é racional salvá-los e lê-los na base SQL.

Leia novamente, mesmo sendo redundante e não racional: para otimizar o Expert Advisor


 

É possível usá-lo e ele é bom. Outra coisa é que o SQLite não deve ser usado em projetos sérios. Em todo caso, eu não o recomendaria. Eu mesmo já enfrentei o problema de colisões com ele mais de uma vez. Por exemplo, se um robô de negociação estiver anexado a diferentes gráficos, mas usar a mesma base, e o endereço for para uma tabela de uso geral (digamos, sessões de registro/alteração, contas), então, em qualquer caso, você receberá um erro como "tabela bloqueada". E não importa se todas as transações foram concluídas, se os cursores foram fechados e se o banco de dados foi aberto no modo compartilhado. Esse problema também é conhecido pelos desenvolvedores do SQLite.

Na minha opinião, o MS Access é o melhor dos bancos de dados de arquivos com suporte a SQL. Não importa o quanto você repreenda o pessoal da pequena software, mas eu troquei o SQLite pelo MS Access e não me arrependo nem um pouco. O driver Jet 4.0 do OleDB é instalado até mesmo no Win98, de modo que os projetos funcionam em todos os Windows OC.

 
Ideia e artigo maravilhosos, eu não tinha pensado nisso. No entanto, seria ótimo ter um suporte nativo no mql5, para que pudesse ser usado no produto do Market.
 

Antes de mais nada, muito obrigado pelo seu trabalho!

Eu o transferi para o mql4 com sucesso! (algumas #property strict resolveram os erros de compilação).

E, como uso a plataforma de 32 bits, tive que comentar e excluir algumas funções de importação relacionadas a 64 bits. O terminal usa early binding, portanto a dll de 64 bits também tenta ser carregada durante o carregamento do programa. (embora ela não seja usada, apenas a 32bit.dll).Isso causou um erro.

Mas, de qualquer forma, gostei de sua implementação! (Gostaria de poder escrever um programa tão bom quanto o seu).

 
Estou usando uma versão de 64 bits do MetaTrader 5 e não consigo fazer o código funcionar. Tentei remover as referências ao código de 32 bits, mas ainda recebo o erro "Sqlite3_32.dll" não pode ser carregado. Você pode me dizer se o código está fazendo referência a essa dll em algum lugar? Preciso fazer com que ele funcione em 64 bits.
 

O script não está funcionando, fora da caixa não funciona, para o lixo tais projetos.

No console, ele dá 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:

O script não está funcionando, ele não funciona fora da caixa.

Consulte o manual se não entender o que fazer e como fazer.