Wednesday 25 December 2019

Mysql trading system


A Deutsche Boerse adquire negociação cambial, a Deutsche Boerse afirmou no domingo que certamente comprará o sistema de negociação Forex baseado em Alemanha 360T por 725 milhões de euros (796 milhões). O 360T está entre um punhado de sistemas multi-bancários e multiusuários que realmente mudaram a troca de forex nos anos anteriores. A Deutsche Boerse derrotou os ativos dos EUA, bem como o condutor do câmbio de dinheiro CME Group (CME. O) no leilão público, de acordo com os recursos conhecidos da oferta. 30 DE JANEIRO 21:30 Buck Falls como fábrica de fabricação Bloombergs escala do papel-moeda versus 10 pares deslizou após o seu ganho ideal de dois dias em 3 semanas em meio a registros revelando a produção diminuiu em mais de um ano em março, bem como a fabricação comercial desistiu. A autoconfiança do consumidor de repente caiu em abril para o grau mais fraco em 7 meses. Os registros econômicos realmente rastrearam estimativas de especialistas desde o início do mês, de acordo com um procedimento de choque financeiro da Bloomberg. 30 DE JANEIRO 21:30 Duping the Band-Aids no blog FX Atualmente é o momento de liberar os sistemas de profissão de artigos que são adequados a um mercado que permanece para apresentar rapidamente, além de desenvolver o direito em uma empresa de margem reduzida. A estrutura da profissão pós-publicação na área hoje foi criada quando a empresa de voz era o principal método de negociação. Com a troca digital de mudança de voz para a maior parte das compras, o tratamento da profissão precisa, além disso, progredir. Deixe um comentário ao olhar ao redor. O problema existe há bastante tempo. Nenhuma boa solução encontrada. O que seria bom é a fonte MQL4 para ANSI2UNICODE e UNICODE2ANSI. Eu realmente não gosto de usar wrappers, o que parece ser a solução sugerida, eu estou usando uma biblioteca para minhas funções MySQL e eu gostaria que fosse comum para MQL5 e MQL4 (as diretrizes do compilador são aceitas) e tem essas funções no MQL5. Posso? Sugerem que você não responda dentro da citação. É muito irritante. Obrigado. Desculpe por isso, encontrei a solução. O originador do ANSI2UNICODE e UNICODE2ANSI tinha feito uma atualização para o código original a partir de 2018 Olhe nos comentários Muito simples de mudar com as diretivas do compilador para que o código funcione tanto no MQL4 quanto no MQL5 Testado OK, Case closed Muitos anos atrás, quando estávamos Crianças, nos primeiros anos dos anos 90 loucos, duas línguas estavam em batalha no mundo dos desenvolvedores. Pascal, com uma sintaxe fácil de entender, bem adaptada a uma linguagem de alto nível, e C, com uma sintaxe mais enigmática, mas rápida de usar, bem adaptada ao seu nível médio. C ganhou a batalha, e. MetaTrader 5 - Integração Como acessar o banco de dados MySQL do MQL5 (MQL4) Introdução O problema da interação do MQL com os bancos de dados não é novo, porém ainda é relevante. O uso de bancos de dados pode aprimorar as possibilidades do MetaTrader: armazenamento e análise do histórico de preços, copiando negócios de uma plataforma de negociação para outra, fornecendo quotestrades em tempo real, computações analíticas pesadas no lado do servidor e usando uma programação, monitoramento e controle remoto De contas usando tecnologias da web. De qualquer forma, houve muitas tentativas de beneficiar da combinação de MQL e MySQL, algumas soluções estão disponíveis no CodeBase. Por exemplo, o MySQL wrapper - library para o MetaTrader 4 é o projeto, do qual muitos programadores iniciam seus próprios desenvolvimentos com novas adições. Na minha opinião, uma das desvantagens desta solução é a alocação de arrays especiais para ler dados do banco de dados. Outro projeto MySQL Logger 1 - EA para MetaTrader 4 é altamente especializado, ele não usa wrapper para acessar a biblioteca padrão libmysql. dll. Portanto, ele não funciona no MetaTrader4 Build 600, uma vez que os tipos de caracteres de caracteres foram substituídos pelo wchart. E o uso do tipo int em vez do ponteiro da estrutura TMYSQL causa vazamentos de memória no projeto (a memória alocada não pode ser controlada). Outro projeto interessante é EAXMysql - Biblioteca MySQL - biblioteca para MetaTrader 5. É uma boa implementação. A lista de desvantagens declarada pelo autor impõe algumas restrições à sua utilização. Qualquer pessoa que já precise usar bases de dados em seus projetos MQL tem duas opções: desenvolver sua própria solução e conhecer todas as partes, ou usar qualquer solução de terceiros, aprender a usá-la e detectar todos os defeitos que possam dificultar Seu projeto. Eu enfrentei essa necessidade e as duas opções ao desenvolver um robô comercial bastante complexo. Tendo pesquisado através de projetos existentes e estudado um grande número de soluções, percebi que não das implementações encontradas poderiam ajudar a trazer meu robô comercial para o nível profissional. Além disso, também havia soluções absurdas, por exemplo: as operações DMLDDL (insertupdatedelete data, createdrop objects in database) foram realizadas usando o padrão libmysql. dll, e a seleção de dados (SELECT) foi realmente implementada como uma solicitação HTTP (usando inet. dll) Para um script PHP localizado no servidor web no lado do servidor MySQL. As consultas SQL foram escritas no script PHP. Em outras palavras, para executar o projeto, era necessário manter os seguintes componentes disponíveis, configurados e em execução: servidor MySQL, servidor web ApacheIIS, scripts PHPASP no lado do servidor. Uma combinação de um grande número de tecnologias. É claro que, em algumas circunstâncias, isso pode ser aceitável, mas quando a única tarefa é selecionar dados do banco de dados - isso é uma tolice. Além disso, apoiar uma solução tão pesada é demorado. A maioria das soluções não teve problemas para inserir dados, criar objetos e outros. O problema era a seleção de dados, pois os dados deveriam ser retornados ao ambiente de chamada. Eu pensei que o uso de arrays para este propósito era impraticável e inconveniente, simplesmente porque, no curso de desenvolvimento, o apoio ao projeto principal, as consultas selecionadas para o banco de dados podem ser alteradas, enquanto você também deve controlar a alocação de memória correta para as matrizes. Bem, isso pode e deve ser evitado. A seguir, o MQL lt-gt MySql interface é baseado em uma abordagem típica usada no Oracle PLSQL, MS SQL T-SQL, AdoDB - uso de cursores. Esta interface foi desenvolvida visando a facilidade de programação e manutenção, além de um mínimo de componentes. Ele é implementado como um wrapper de DLL na biblioteca padrão libmysql. dll e um conjunto de funções de interface como um arquivo. mqh. 1. MQL lt-gt Interface MySQL A interação entre o terminal MetaTrader (através de programas MQL) pode ser implementada com a ajuda dos componentes abaixo: 1. A biblioteca de interface MQLMySQL. mqh. É adicionado ao projeto usando o diretório de inclusão e pode ser modificado ao seu gosto. Ele contém as diretrizes para importar funções da biblioteca dinâmica MQLMySQL. dll, bem como funções para chamá-las e manipular erros. 2. A biblioteca dinâmica MQLMySQL. dll. É um invólucro para acessar a funcionalidade da biblioteca padrão libmysql. dll. Além disso, a biblioteca MQLMySQL. dll processa os resultados das operações e o acesso compartilhado às conexões e cursores do banco de dados. Isso significa que você pode criar e usar várias conexões por vez (de um ou mais programas MQL), mantenha alguns cursores abertos, com consultas para um ou mais bancos de dados. Mutexes são usados ​​para separar o acesso aos recursos compartilhados. 3. A biblioteca dinâmica padrão libmysql. dll é um driver de acesso nativo. Você pode copiá-lo de qualquer distribuição de banco de dados MySql em C: WindowsSytem32 ou ltTerminalgtMQL5Libraries (para MetaTrader 4 em ltTerminalgtMQL4Libraries). Na verdade, é responsável por enviar consultas ao banco de dados e recuperar os resultados. Espere nos pontos principais, tais como: abrir a conexão, realizar consultas DMLDDL e seleção de dados. 1.1. Abertura e encerramento da conexão A função MySqlConnect foi implementada para abrir a conexão com o banco de dados MySQL: esta função implementa a conexão com o banco de dados e retorna um identificador de conexão. Essa ID será necessária para consultar o banco de dados. Em caso de falha de conexão, o valor de retorno é -1. Para obter os detalhes do erro, verifique as variáveis ​​MySQLErrorNumber e MySqlErrorDescription. Normalmente, esta função é chamada ao manusear o evento OnInit () no programa MQL. O nome DNS ou o endereço IP do usuário do banco de dados do servidor MySQL (por exemplo, root) A senha do usuário do banco de dados O nome do banco de dados A porta TCPIP do banco de dados (geralmente 3306) O soquete Unix (para sistemas baseados em Unix) O Combinação de bandeiras especiais (geralmente 0) A função de interface MySqlDisconnect foi implementada para fechar a conexão: esta função fecha a conexão com o banco de dados MySQL. Normalmente, esta função é chamada ao manusear o evento OnDeinit () no programa MQL. Note-se que o banco de dados MySQL pode fechar a conexão por conta própria em caso de falha de hardware, congestionamento de rede ou tempo limite (quando nenhuma consulta é enviada para o banco de dados por muito tempo). Muitas vezes, os desenvolvedores usam o evento OnTick () para escrever dados no banco de dados. No entanto, quando o fim de semana vem e o mercado está fechado, a conexão ainda está pendurada. Nesse caso, o MySQL irá fechá-lo por tempo limite (o padrão é 8 horas). E na segunda-feira, quando o mercado está aberto, são encontrados erros no projeto. Portanto, é altamente recomendável verificar a conexão e reconectar-se ao banco de dados após um intervalo de tempo menor do que o tempo limite especificado nas configurações do servidor MySQL. 1.2. Execução de Consultas DMLDDL As operações DML são usadas para manipulações de dados (D ata M anipulation L anguage). As manipulações de dados incluem o seguinte conjunto de instruções: INSERT, UPDATE e DELETE. As operações DDL são usadas para a definição de dados (D ata D efinition L anguage). Isso inclui a criação (CREATE) de objetos de banco de dados (tabelas, visualizações, procedimentos armazenados, disparadores, etc.) e sua modificação (ALTER) e eliminação (DROP). Não são todas as instruções DMLDDL, além disso, DCL (D ata C ontrol L anguage) é usado para separar o acesso a dados, mas não aprofundaremos os recursos do SQL. Qualquer um desses comandos pode ser executado usando a função de interface MySqlExecute: como uma consulta SQL, você também pode usar o comando USE para selecionar o banco de dados. Gostaria de mencionar o uso de consultas de várias declarações. É um conjunto de comandos SQL separados pelo personagem. Para ativar o modo multi-instruções, a conexão com o banco de dados deve ser aberta com o sinalizador CLIENTMULTISTATEMENTS: neste fragmento, 3 entradas serão inseridas na tabela EURUSD com uma única chamada para o banco de dados. Cada uma das consultas armazenadas na variável SQL é separada por. Esta abordagem pode ser usada para insertupdatedelecção freqüente. Um conjunto de comandos necessários é combinado em um pacote, assim, aliviando o tráfego da rede e melhorando o desempenho do banco de dados. A sintaxe INSERT no MySQL está bem desenvolvida em termos de manipulação de exceções. Por exemplo, se a tarefa for mover o histórico de preços, uma tabela deve ser criada para os pares de moedas com a chave primária do tipo datetime, uma vez que a data e a hora de uma barra são exclusivas. Além disso, deve ser verificado se os dados em qualquer barra particular existem no banco de dados (para melhorar a estabilidade da migração de dados). Com o MySQL, esta verificação não é necessária, pois a instrução INSERT é compatível com ON DUPLICATE KEY. Em palavras mais simples, se uma tentativa for feita para inserir dados e a tabela já possui uma entrada com a mesma data e hora, a instrução INSERT pode ser ignorada ou substituída por UPDATE para esta linha (veja. Dev. mysqldocrefman5.0eninsert - On-duplicate. html). 1.3. Seleção de dados A instrução SQL SELECT é usada para recuperar dados do banco de dados. A seqüência de ações abaixo é usada para selecionar dados e recuperar o resultado da seleção: Preparando a instrução SELECT. Abrindo o cursor. Obtendo o número de linhas retornadas pela consulta. Looping e recuperação de cada linha da consulta. Obtendo dados para as variáveis ​​MQL dentro do loop. Fechar o cursor. Claro, este é um esquema geral, portanto, nem todas as operações são necessárias para cada caso. Por exemplo, se você quiser certificar-se de que uma linha existe na tabela (por qualquer critério), será suficiente preparar uma consulta, abrir um cursor, obter o número de linhas e fechar o cursor. Na verdade, as partes obrigatórias são - preparando a instrução SELECT, abrindo e fechando o cursor. O que é um cursor Esta é uma referência à área de memória de contexto, de fato - o conjunto de valores resultante. Quando você envia a consulta SELECT, o banco de dados aloca memória para o resultado e cria um ponteiro para uma linha que você pode mover de uma linha para outra. Assim, é possível acessar todas as linhas na ordem de uma fila definida pela consulta (cláusula ORDER BY da declaração SELECT). As seguintes funções de interface são usadas para seleção de dados: Abrindo o cursor: O identificador de cursor retornado por MySqlCursorOpen Fechar um cursor é uma operação crítica. Não esqueça de fechar cursores. Imagine que você abre o cursor e se esqueça de fechá-lo. Suponha que os dados sejam recuperados no cursor com todos os tiques enquanto manipula o evento OnTick () e cada vez que um novo cursor é aberto, a memória é alocada para ele (tanto do lado do cliente quanto do lado do servidor). Em algum momento, o servidor irá recusar o serviço porque o limite dos cursores abertos é alcançado e isso pode causar o estouro do buffer. Claro, é exagerado, esse resultado é possível ao trabalhar com libmysql. dll diretamente. No entanto, a biblioteca dinâmica MQLMySQL. DLL distribui memória para cursores e se recusará a abrir um cursor que vá além do limite permitido. Ao implementar tarefas reais, é suficiente manter 2-3 cursores abertos. Cada cursor pode lidar com uma medida cartesiana de dados usando dois ou três cursores simultaneamente (aninhados, por exemplo, quando um depende parametricamente de outro cursor) abrange duas ou três dimensões. Isso é perfeitamente bom para a maioria das tarefas. Além disso, para a implementação de seleção de dados complexos, você sempre pode usar esses objetos para representar o banco de dados (VIEW), criá-los no lado do servidor e enviar consultas do código MQL quanto a tabelas. 1.4. Informações adicionais O seguinte pode ser mencionado como características adicionais: 1.4.1. Leitura de dados de um arquivo. INI Muitas vezes armazenar informações sobre conexões ao banco de dados (endereço IP do servidor, porta, nome de usuário, senha, etc.) diretamente no código MQL (ou parâmetros do Expert Advisor, indicador de script) não é Racional, porque o servidor pode ser movido, seu endereço pode mudar dinamicamente, etc. Você precisará modificar o código MQL neste caso. Assim, todos esses dados devem ser melhor armazenados no arquivo. INI padrão, enquanto somente seu nome deve ser escrito no programa MQL. Em seguida, use a função ReadINI para ler os parâmetros de conexão e usá-los. Por exemplo, o arquivo INI contém as seguintes informações: Para obter o endereço IP do servidor, execute o seguinte: O arquivo INI está localizado em C: MetaTrader5MQL5Experts e é chamado MyConnection. ini, você acessa a chave Servidor da seção MYSQL. Em um arquivo INI você pode armazenar configurações para vários servidores usados ​​em seu projeto. 1.4.2. Rastreamento das áreas de problema Na biblioteca de interface fornece o modo de rastreamento, que pode ser habilitado para depurar consultas SQL em qualquer lugar em um programa MQL. Especifique o seguinte na área do problema: se você habilitar o rastreamento no início do programa MQL e não desativá-lo, todas as chamadas para o banco de dados serão registradas. O log é mantido no console do terminal (usando o comando Print). 2. Exemplos Esta seção fornece alguns exemplos de conexão e uso das bibliotecas desenvolvidas. Veja-os e estime a usabilidade da solução de software. O exemplo MySQL-003.mq5 mostra o seguinte: conectar-se a um banco de dados (os parâmetros de conexão são armazenados no arquivo. ini), criando uma tabela, inserindo dados (também usando demonstrações múltiplas) e desconectando do banco de dados. Exemplo O MySQL-004.mq5 mostra a seleção de dados de uma tabela criada pelo script MySQL-003.mq5. Os exemplos acima contêm o tratamento de erros típico usado em projetos reais. De fato, cada consulta usada em um programa MQL deve ser depurada em qualquer cliente MySQL (PHPMyAdmin, DB Ninja, console MySQL). Eu pessoalmente uso e recomendo software profissional para desenvolvimento de banco de dados Quest TOAD para MySQL. Conclusão Este artigo não descreve os detalhes da implementação do MQLMySQL. DLL desenvolvido no ambiente Microsoft Visual Studio 2018 (CC). Esta solução de software foi projetada para uso prático e tem mais de 100 implementações bem sucedidas em várias áreas de desenvolvimento de software MQL (desde a criação de sistemas comerciais complexos até a publicação na web). As versões das bibliotecas para MQL4 e MQL5 estão anexadas abaixo. Os anexos também incluem um arquivo zip com o código fonte do MQLMySQL. DLL A documentação está incluída nos arquivos Para usar os exemplos, não esqueça de especificar os parâmetros de conexão ao seu banco de dados no arquivo ScriptsMyConnection. ini.

No comments:

Post a Comment