Sunday 19 November 2017

Banco de dados forex sql


MetaTrader 4 - Exemplos Integração do Terminal do Cliente MetaTrader 4 com o MS SQL Server Introdução O uso de integrações com outros produtos oferece um desafio adicional na negociação. Pode haver muitos usos, então vou dar alguns deles abaixo. Você pode coletar tiques e passá-los para o MS SQL SERVER para análise posterior. Com um grande histórico de carrapatos, você pode coletar qualquer período a partir da fatia de tempo mínimo e até qualquer período não padrão. Com citações de tiques reais, você pode depurar estratégias dependentes de dados de tiques conhecidas como scalpers. Você pode usar uma loja para análise rápida de dados tirados de outros aplicativos, por exemplo, do MS Excel ou de outro software de terceiros ou de seus próprios produtos. Por exemplo, você pode descarregar todo o histórico do Centro de Histórico do terminal em MS SQL. Então você não precisará armazenar o histórico no MT4. Isso ajudará a aliviar a memória do terminal. Você pode calcular redes neurais usando aspas armazenadas no MS SQL SERVER: por exemplo, STATISTICA - 7.8 para permitir que você baixe as cotações do SQL pode ser resolvido no modo em tempo real passando os sinais da rede para o MT4. Você pode desenvolver seu próprio programa em outro idioma e para outro símbolo e transmitir sinais usando o MS SQL SERVER, tendo deixado apenas funções de execução para o terminal do cliente e aliviá-lo de cálculos sérios. Os seguintes produtos de software foram utilizados para este projeto MS SQL SERVER 2000 Developer - BASE VISUAL C 6.0 SP5 - para criar DLL YZMSSQLExpertSample. dll MDAC 7 O conjunto mínimo a ser instalado: 1 MS SQL SERVER 2000 Developer 2 MDAC 7 Eu depurado o programa usando MDAC 7. No entanto, é possível que tudo funcione bem em algumas versões mais antigas. Se você não estiver compilando a DLL, não precisará instalar ou ter o Visual C 6.0 instalado. Você pode usar uma DLL pronta. No entanto, eu escrevi o nome do usuário, o nome do DSN e as conexões. Então você terá que repetir tudo acima listado em sua versão do programa. Não descreverei aqui como instalar o MS SQL SERVER ou o Visual C 6.0, essas coisas estão fora do escopo deste artigo específico. Depois que os produtos de software necessários foram instalados, devemos criar um DSN: Exemplo de Recepção de Tick em MS SQL Todos os experimentos foram conduzidos com o MS SQL SERVER 2000 Developer. No Visual C 6.0, YZMSSQLExpertSample. DLL foi criado usando o método de acesso ao MS SQL via ADO. O MDAC 7 ou o MDAC 8 devem estar instalados. Apenas descreverei os exemplos de como criar procedimentos e tabelas. O conjunto mínimo do que temos para criar no MS SQL é a base, as tabelas e os procedimentos. Vamos considerar a tabela e os procedimentos para trabalhar com citações de tiques. Você pode adicionar algumas outras funções, se desejar. É necessário criar uma base e tabelas no MS SQL. Criei uma nova base chamada MT4TRADE. Em seguida, devemos criar tabelas nele: MT4TICK - Tabela de tiques Abaixo está o procedimento de recebimento e tabulação: podemos ver a partir da descrição acima quais procedimentos e para quais fins são usados. RetCode - não possui nenhuma funcionalidade ao ser passado da DLL, serve apenas para receber o código de terminação. A instalação do MS SQL SERVER está concluída. Um script para criar uma configuração padrão é anexado a este artigo. Vamos fantasiar: Possíveis soluções e vantagens Podemos criar um armazenamento de dados e colocar informações extra. Desta forma, podemos aliviar o MT 4 Client Terminal da necessidade de armazenar histórico de cotações. Agora, o histórico de cotações é armazenado no MS SQL Server e podemos operar com essas informações, extraí-lo mais cedo e exportá-lo para outras aplicações. Podemos usar os dados a serem analisados ​​em pacotes NEURAL, a maioria dos quais pode trabalhar com armazenamentos SQL. No tempo real, o terminal pode continuar a formar sinais de indicadores passando-os para o armazenamento e corrigindo-os desta maneira. Um aplicativo externo pode extrair o sinal e o histórico em tempo real, analisá-los e formar sinais que consertam a execução e o armazenamento do log no MS SQL Server, e enviá-los para o terminal para executar. Assim, obtemos integração e distribuição funcional entre aplicativos envolvidos em um complexo de negociação automatizado. Bem, se não há mais necessidade de armazenar citações históricas, podemos configurá-lo da seguinte maneira. Defina as barras mínimas em ToolsgtOptionsgtCharts, por exemplo, para 5000. O terminal começa a trabalhar mais rápido, uma vez que não precisa alocar memória para um grande histórico. Textos de origem Exemplo de chamada do MQL4 - Histórico de carregamento de scripts no MS SQL Server: Atenção: Infelizmente, todo o histórico é carregado de forma bastante lenta usando o script, mas ele corrige o número da barra de forma clara e de alta qualidade. A melhor solução seria descarregar aspas em um arquivo de texto e carregá-las no MS SQL através do IMPRT EXPORT DTS. Carregando o histórico M1 de 1999-2008 para cada símbolo levará alguns minutos. O índice da barra não é descarregado ao descarregar em um arquivo de texto. Se você decidir que o índice da barra será apenas o número da linha, você terá o problema das barras perdidas e, se estiver modificando ou recarregando, o número de barras descarregadas pode ser diferente no MS SQL e no MT 4. Não resolvi esse problema Ainda assim, mas acho que pode ser resolvido através do recarregamento do histórico após uma atualização de histórico de alta qualidade no MT 4. Descrição de Files Attached CreateSQLallDate. txt (9.0 Kb) - Script no formato SQL como um exemplo de como criar bases, tabelas e procedimentos no MS SQL Server. SQLGETHISTORY. mq4 (1.4 Kb) - Script para carregar o histórico em MS SQL YZMSSQLExpertSample. rar (89.9 Kb) YZMSSQLSample. mq4 (13.1 Kb) - Para ser anexado como EA ao gráfico de símbolos, cujos carrapatos devem ser coletados você pode Anexá-lo a qualquer período de tempo. Conclusão A integração com outros produtos de software expandirá a funcionalidade do MetaTrader 4 e permitirá distribuir tarefas e funções de um sistema de negociação automatizado de forma mais eficiente. Preciso armazenar em dados de taxa de câmbio do SQLServer 2008 R2. A aplicação que faz uso desses dados é desenvolvida em C. A coluna que detém a taxa de câmbio da moeda será necessária para armazenar as conversões em ambos os sentidos - o significado, Id, sim, tem uma precisão fixa, mas uma escala variável. O tipo de dados que eu devo escolher no SQL Server que pode ser mapeado para C evitando qualquer perda de dados Estou olhando para a matriz de mapeamentos fornecidos pela MSDN e não consigo achar qualquer coisa que eu possa manipular com segurança. Float (53) pode ser uma possibilidade, mas os flutuadores são valores aproximados. O dinheiro é apenas preciso para os dez milésimos da unidade, eu estou com Decimal. No entanto, estes oferecem escalas fixas. E é aí que estou perplexo: se eu precisar guardar um número como 0.0104182, mas também 123.673. Eu estabeleci uma precisão de 10 como minha exigência. Mas como devo definir uma escala que pode acomodar completamente esta precisão, pediu Jun 29 11 em 22: 14MetaTrader 5 - Integração Como acessar o banco de dados MySQL do MQL5 (MQL4) Introdução O problema da interação do MQL com bancos de dados não é novo, no entanto, é 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 2010 (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