Discussão do artigo "SQLite: trabalho nativo com bancos de dados SQL em MQL5" - página 2

 

Renat Fatkhullin:

Em diferentes MQL5 Expert Advisors lançados em um terminal, é possível compartilhar o mesmo banco de dados.
.

Testei o funcionamento de dois Expert Advisors com o mesmo banco de dados em um terminal. Funciona sem erros - ambos os Expert Advisors gravam dados em um arquivo com um cronômetro de 2 segundos.

Os arquivos estão anexados e diferem apenas no nome do Expert Advisor.

2020.02.19 17:56:14.624 SecondExpertDataBase (GBPUSD,H1)        16:56:14: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:16.627 SecondExpertDataBase (GBPUSD,H1)        16:56:16: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:18.616 SecondExpertDataBase (GBPUSD,H1)        16:56:18: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:20.630 SecondExpertDataBase (GBPUSD,H1)        16:56:20: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:22.078 FirstExpertDataBase (USDCHF,H1)         16:56:21: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:22.629 SecondExpertDataBase (GBPUSD,H1)        16:56:22: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:24.071 FirstExpertDataBase (USDCHF,H1)         16:56:24: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:24.619 SecondExpertDataBase (GBPUSD,H1)        16:56:24: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:26.070 FirstExpertDataBase (USDCHF,H1)         16:56:26: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:26.619 SecondExpertDataBase (GBPUSD,H1)        16:56:26: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:28.079 FirstExpertDataBase (USDCHF,H1)         16:56:27: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:28.625 SecondExpertDataBase (GBPUSD,H1)        16:56:28: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:30.079 FirstExpertDataBase (USDCHF,H1)         16:56:30: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:30.617 SecondExpertDataBase (GBPUSD,H1)        16:56:30: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:32.069 FirstExpertDataBase (USDCHF,H1)         16:56:32: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:32.627 SecondExpertDataBase (GBPUSD,H1)        16:56:32: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:34.073 FirstExpertDataBase (USDCHF,H1)         16:56:33: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:34.627 SecondExpertDataBase (GBPUSD,H1)        16:56:34: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:36.616 SecondExpertDataBase (GBPUSD,H1)        16:56:36: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:38.079 FirstExpertDataBase (USDCHF,H1)         16:56:38: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:38.615 SecondExpertDataBase (GBPUSD,H1)        16:56:38: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:40.072 FirstExpertDataBase (USDCHF,H1)         16:56:40: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:40.618 SecondExpertDataBase (GBPUSD,H1)        16:56:40: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:42.630 SecondExpertDataBase (GBPUSD,H1)        16:56:42: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:44.617 SecondExpertDataBase (GBPUSD,H1)        16:56:44: added 1 record on GBPUSD to timer.sqlite


Esta é a aparência do banco de dados no MetaEditor


Arquivos anexados:
 
Chiripaha:

É possível usar o que está descrito para o µl5 no µl4?

No MQL4, você pode trabalhar com o Sqlite3_32.dll nativo por meio do wrapper para MQL

/*
 * Interface SQLite para MT4
 */

#import "sqlite3_wrapper.dll"
int sqlite_exec (string db_fname, string sql);
int sqlite_table_exists (string db_fname, string table);
int sqlite_query (string db_fname, string sql, int& cols[]);
int sqlite_next_row (int handle);
string sqlite_get_col (int handle, int col);
int sqlite_free_query (int handle);
#import

Esse é um wrapper para MQL, não o confunda com o SQLite3Wrapper.dll

Não sei se ele ainda está on-line, mas eu costumava usá-lo antes.

UPD: https: //github.com/Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
  • Shmuma
  • github.com
Database file is by default stored to . If you specify a full path as database filename, it's used. Terminal data path TERMINAL_DATA_PATH can be known by the following instruction. Open MT4 Open [File] menu Click "Open Data Folder" Sample Many sample scripts in under . Precautions Argument mess MT4 build 610 has a weird bug when dll function...
 
fxsaber:

Se você tiver descoberto isso, mostre a implementação dessa tarefa.

  1. Há dois terminais.
  2. É necessário transferir cotações em tempo real de um símbolo do Terminal1 para o símbolo personalizado correspondente do Terminal2.

Há outra nuance - salvar no banco de dados dados consistentes com valor crescente, que não se dispersam, como cotações (com uma data crescente) - uma operação MUITO cara. A árvore não é equilibrada, um ramo cresce indefinidamente e o mecanismo reequilibra a árvore regularmente (isso é pior do que a coleta de lixo). Talvez isso se aplique somente à tabela indexada, não me lembro mais. Ou talvez, nos poucos anos em que não a utilizei, isso já tenha sido resolvido. Terei que experimentar. Talvez até mesmo os desenvolvedores analisem o problema, pois eles devem estar interessados nele.

 

DatabaseImport()

script simples

void OnStart()
  {
  string filename="DOMdb.db";
  int database=DatabaseOpen(filename, DATABASE_OPEN_READWRITE  );
  DatabaseImport(database,             // identificador do banco de dados recebido em DatabaseOpen
                     "DOMtb",             // nome da tabela para inserção de dados
                     "AllDOM.csv",          // nome do arquivo para importação de dados
                       0,             // combinação de sinalizadores
                      ";",         // separador de dados 
                        0,         // quantas primeiras linhas devem ser ignoradas 
                      "//"     // uma cadeia de caracteres que define os comentários
   );
   
  }

2020.02.20 15:09:27.171 MQL5 'DOMcopy.ex5' tem uma versão mais recente sem suporte, atualize seu terminal de cliente

a versão 5 build 2323 mais recente do meta-editor é a mesma e a depuração não funciona.

há algo inacabado?

 

Afunção DatabaseImport ainda não foi liberada para o público.

Aguarde o lançamento.

 
Talvez não esteja no tópico, mas: Gostaria de saber por que os desenvolvedores ainda não implementaram a conexão com o MS SQL Server?
 
Rashid Umarov:

A função DatabaseImport ainda não foi liberada para o público.

Aguarde o lançamento.

A versão 5 build 2326 é a mesma coisa, então, quando esperar por uma versão estável?

 
IuriiPrugov:

versão 5 build 2326 a mesma coisa que é esperar por uma versão estável e quando?

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Nova versão do MetaTrader 5 build 2340: gerenciamento de configurações de conta no testador e expansão da integração com Python

MetaQuotes, 2020.02.20 14:55

Na sexta-feira, 21 de fevereiro de 2020, será lançada uma versão atualizada da plataforma MetaTrader 5. A atualização contém as seguintes alterações:

  1. MetaEditor: adicionada a capacidade de trabalhar convenientemente com bancos de dados SQLite.

    Na atualização anterior da plataforma, adicionamos suporte para trabalhar com bancos de dados SQLite diretamente da MQL5. Agora, as principais funções estão disponíveis na interface do usuário do MetaEditor:

    .
    • Criação e conexão com bancos de dados
    • Visualização de tabelas e consulta rápida de dados
    • Criação e execução de consultas SQL, reversão de alterações

    Como funciona
    Para criar bancos de dados rapidamente, use o "Assistente MQL5". Aqui você pode criar imediatamente a primeira tabela e definir uma lista de seus campos.




    Depois de criar um banco de dados, você irá para uma nova seção do "Navigator". Todo o trabalho com dados é realizado a partir dessa seção.

    Na parte esquerda, são exibidas as tabelas do banco de dados. Para consultar rapidamente os primeiros 1.000 registros, clique duas vezes no nome da tabela. Aqui você também pode criar e abrir outros bancos de dados e trabalhar com tabelas.

    A parte principal do editor é onde você trabalha com o banco de dados: preencha a tabela com dados, faça pesquisas e seleções, insira consultas SQL, etc.
    .



    Para obter mais detalhes sobre como trabalhar com bancos de dados no MetaTrader 5, leia o artigo"SQLite: Native Work with SQL Databases in MQL5".

    .
  2. MetaEditor: Continuamos a adicionar suporte para projetos em vários idiomas. Nesta versão, ampliamos as funções para trabalhar com scripts Python:

    .
    • Agora você pode criá-los convenientemente por meio do "Assistente MQL5", incluindo imediatamente no código as dependências das bibliotecas necessárias.
    • Foram adicionados ícones especiais para eles no navegador e realce de sintaxe no editor.
    • Ao executar o script através do MetaEditor, as mensagens do console Python (stdout, stderr) são exibidas na seção "Errors".




    Para executar o script no editor, clique em "Compile" (Compilar):
    .





    Para trabalhar com Python, não se esqueça de especificar o caminho para ele na seção "Settings / Compilers" no MetaEditor. E para trabalhar com a biblioteca do MetaTrader 5, instale-a com o comando:
    .
    pip install MetaTrader 5
    Leia mais sobre a integração com Python na documentação.

    .
  3. MQL5: Integração completamente redesenhada com Python. Muitos novos recursos foram adicionados e a nomenclatura dos comandos foi alterada.

    Nova nomenclatura de comandos
    Os comandos existentes foram renomeados:
    MT5Initialize       -> initialize
    MT5Shutdown         -> shutdown
    MT5TerminalInfo     -> terminal_info
    MT5Version          -> version
    MT5CopyRatesFrom    -> copy_rates_from
    MT5CopyRatesFromPos -> copy_rates_from_pos
    MT5CopyRatesRange   -> copy_rates_range
    MT5CopyTicksFrom    -> copy_ticks_from
    MT5CopyTicksRange   -> copy_tick_range

    Novos comandos
    A lista de comandos suportados foi bastante ampliada. Foram adicionadas funções de negociação e trabalho com histórico de negociação, obtenção de informações sobre instrumentos financeiros e conta corrente.

    • account_info() - obtenção de informações sobre a conta corrente. Um análogo de AccountInfoInteger, AcountInfoDouble e AccountInfoString.
    • positions_total() - recebe o número de posições abertas. Um análogo de PositionsTotal.
    • positions_get(symbol, ticket) - obtém as posições em aberto por símbolo ou ticket.
    • orders_total() - obtém o número de ordens. Um análogo de OrdersTotal.
    • orders_get(symbol, ticket) - obtém ordens abertas por símbolo ou bilhete.
    • history_orders_total(from, to) - obtém o número de ordens no histórico em um intervalo de tempo especificado.
    • history_orders_get(from, to, position, ticket) - obtenção de ordens do histórico em um intervalo de tempo especificado por tíquete ou com filtragem por posição.
    • history_deals_total() - obtém o número de negócios no histórico. Um análogo de HistoryDealsTotal.
    • history_deals_get(from, to, position, ticket) - obtenção de negócios do histórico em um intervalo especificado por ticket ou com filtragem por posição.
    • symbol_info(symbol) - obtenção de informações sobre um instrumento financeiro. Um análogo de SymbolInfoInteger, SymbolInfoDouble, SymbolInfoString.
    • symbol_info_tick(symbol) - obtém o último tick por símbolo. Um análogo de SymbolInfoTick.
    • symbol_select(symbol, enable) - ativa/desativa o símbolo na "Observação do mercado". Análogo de SymbolSelect.
    • order_check(request) - verifica a margem de uma ordem. Um análogo de OrderCheck.
    • order_send(request) - envio de uma ordem para o servidor. Um análogo de OrderSend.
    • order_calc_margin(action, symbol, volume, price) - cálculo de margem para a ordem. Um análogo de OrderCalcMargin.
    • order_calc_profit(action, symbol, volume, price_open, price_close) - cálculo do lucro. Um análogo de OrderCalcProfit.
      .

    Execução de scripts Python em gráficos
    Agora, os scripts Python podem ser executados diretamente nos gráficos da plataforma, de forma semelhante aos programas MQL5 comuns. Eles serão exibidos com ícones especiais no "Navigator".
    .



    As mensagens do script serão exibidas na seção "Tools / Experts". Se o script usar a biblioteca MetaTrader 5, ele poderá receber informações sobre o instrumento, a conta e a operação.

    Os scripts Python podem ser executados no mesmo gráfico em paralelo com outros scripts MQL5 e Expert Advisors. Para interromper um script se sua execução estiver em loop, basta removê-lo do gráfico.

    Proteção adicional
    Para proteger ainda mais suas contas ao usar bibliotecas Python de terceiros, a opção "Disable automatic trading via external Python API" foi adicionada às configurações do terminal.
    .




    Os scripts Python terão permissão para negociar somente se essa opção estiver explicitamente desativada.

    .
  4. MQL5: o relançamento de programas MQL5 e a recriação de indicadores personalizados a partir de programas MQL5 foram significativamente acelerados. Em alguns casos, a velocidade aumentou centenas de vezes.
    .
  5. MQL5: Adicionadas funções para trabalhar com bancos de dados:

    DatabaseImport
    Importa dados de um arquivo para uma tabela.
    long  DatabaseImport(
       int           database,          // identificador do banco de dados recebido em DatabaseOpen
       const string  table,             // nome da tabela para inserção de dados
       const string  filename,          // nome do arquivo para importação de dados
       uint          flags,             // combinação de sinalizadores
       const string  separator,         // separador de dados 
       ulong         skip_rows,         // quantas primeiras linhas devem ser ignoradas 
       const string  skip_comments      // uma cadeia de caracteres que define os comentários
       );

    DatabaseExport
    Exporta uma tabela ou o resultado da execução de uma consulta SQL para um arquivo CSV. O arquivo é criado em codificação UTF-8.
    long  DatabaseExport( 
       int           database,           // identificador do banco de dados recebido em DatabaseOpen 
       const string  table_or_sql,       // nome da tabela ou consulta SQL 
       const string  filename,           // Nome do arquivo CSV para exportação de dados 
       uint          flags,              // combinação de sinalizadores 
       const string  separator           // separador de dados no arquivo CSV 
       );

    DatabasePrint
    Imprime uma tabela ou o resultado da execução de uma consulta SQL no registro do Expert Advisor.
    long  DatabasePrint(
       int           database,          // identificador do banco de dados recebido em DatabaseOpen
       const string  table_or_sql,      // tabela ou consulta SQL
       uint          flags              // combinação de sinalizadores
       );

  6. MQL5: Adicionada a função FileSelectDialog que chama a caixa de diálogo do sistema para criar/abrir um arquivo ou pasta.
    int  FileSelectDialog(
       string   caption,              // título da janela
       string   initial_dir,          // pasta inicial
       string   filter,               // filtro de extensão
       uint     flags,                // combinação de sinalizadores
       string&  filenames[],          // matriz com nomes de arquivos
       string   default_filename      // nome de arquivo padrão
       );
    A nova função permitirá implementar uma interação conveniente do usuário com o programa MQL5.

    .
  7. MQL5: DEAL_FEE - pagamento pela realização de uma transação - foi adicionado à enumeração ENUM_DEAL_PROPERTY_DOUBLE. Na verdade, esse é um tipo separado de comissão que pode ser cobrado por um corretor.

    .
  8. Testador: adicionada a capacidade de definir suas próprias configurações de conta de negociação ao testar estratégias - limites de negociação, configurações de margem e comissões. Assim, você tem ainda mais possibilidades de simular diferentes condições de negociação dos corretores.
    .




    Configurações gerais
    Nessa seção, é possível definir o número máximo de ordens e posições abertas que você pode ter na sua conta ao mesmo tempo. Também aqui você pode configurar as sessões em que o programa testado não terá permissão para negociar.


    Margem
    Aqui você pode controlar totalmente como a margem será reservada e qual sistema de contabilidade de posição será usado durante o teste:

    .
    • Gerenciamento de risco - modelo de gerenciamento de risco: OTC e negociado em bolsa, com compensação e hedging. Informações detalhadas sobre eles estão disponíveis na Ajuda.
      .
    • Nível de "Margin call" (chamada de margem) - o nível de fundos na conta que, quando atingido, muda para o estado de Margin call (chamada de margem).
    • Nível de "stop out" - o nível de fundos no qual a conta é forçada a retirar ordens e fechar posições de negociação. Ambos os níveis podem ser especificados em porcentagem e em dinheiro. No primeiro caso, os níveis são definidos como o valor do indicador "Funds" (Fundos) na conta. Se a opção "Percentage" (Porcentagem) for selecionada, os níveis serão definidos como o valor do indicador "Margin Level" (Nível de margem) na conta (Funds/Margin*100).
    • Não realizado - esse campo especifica como o lucro/perda não realizado atual será contabilizado na margem livre:
      .
      • Do not use unrealised profit/loss (Não usar lucros/perdas não realizados) - não levar em conta as posições abertas no cálculo.
      • Use unrealised profit/loss (lucros/perdas não realizados) - use perdas e lucros em posições abertas no cálculo.
      • Usar lucro não realizado - usar somente o lucro.
      • Usar perda não realizada - usar somente a perda.
    • Daily fixed (Fixo diário) - esse campo especifica como o lucro/perda fixado pelo negociador durante o dia de negociação será levado em conta na margem livre:
      .
      • Use daily fixed profit/loss (usar lucro/prejuízo fixo diário) - leve em conta o lucro e o prejuízo fixados durante o dia de negociação na margem livre.
      • Usar perda fixa diária - considerar somente a perda fixada durante o dia de negociação na margem livre. Durante o dia, o lucro acumulado é fixado em um campo de conta separado ("Locked"). No final do dia de negociação, o lucro acumulado é liberado (zerado) e refletido no saldo da conta (contabilizado na margem livre).
    • Liberar o lucro acumulado no final do dia - essa opção está disponível somente se a opção "Use daily fixed loss" (Usar perda fixa diária) estiver ativada. Se ela estiver ativada, no final do dia de negociação, o lucro acumulado durante o dia será liberado e registrado no saldo (e, consequentemente, contabilizado na margem livre). Caso contrário, isso não ocorrerá.


    Comissão
    Nessa seção, você tem controle total sobre como a comissão é cobrada em todas as negociações.

    .
    • As comissões podem ser de nível único ou multinível, ou seja, podem ser cobradas no mesmo valor independentemente do volume/volume de transações ou variar de acordo com o tamanho delas. As informações relevantes são exibidas na especificação.
    • As comissões podem ser cobradas imediatamente após a execução de uma transação ou no final de um dia/mês de negociação.
    • As comissões podem ser cobradas de acordo com a direção da transação: para entrada, para saída ou para ambos os tipos de transações.
    • As comissões podem ser cobradas por lote ou por negociação.
    • As comissões podem ser cobradas em diferentes valores: em dinheiro, por cento ou pips.



  9. Testador: Trabalho otimizado e significativamente acelerado no modo "Market Scan", quando várias passagens de teste são feitas em todos os símbolos do "Market Watch".
    .
  10. Testador: Ao calcular o lucro em pips, o tamanho de uma negociação ou posição agora é levado em consideração. Anteriormente, o cálculo era feito sem levar em conta o volume - como para um lote.
  11. Testador: O gerenciamento de gráficos de resultados de otimização foi aprimorado. Ao aumentar o zoom em um gráfico de otimização regular, agora é possível rolá-lo. Um clique duplo em um ponto do gráfico agora destaca o resultado correspondente na tabela de passes.
    .
  12. MetaEditor: adicionada a exibição de arquivos de banco de dados SQLite (*.db;*.sdb;*.sqlite;*.db3;*.s3db;*.sqlite3) no "Navigator".
  13. MetaEditor: Corrigidos os erros ao salvar as propriedades do projeto.
    .
  14. Documentação atualizada.
    .

A atualização estará disponível por meio do sistema LiveUpdate.


 

versão estável 5 build 2340 DatabaseImport mostra o mesmo DatabaseImport na execução

2020.02.22 14:01:42.338 MQL5 'DOMcopy.ex5' tem uma versão mais recente não suportada, atualize seu terminal de cliente

 

Olá!

Tentei criar uma conexão com um banco de dados no indicador, mas, por algum motivo, não funcionou.

Por que isso não está escrito em lugar algum, em quais programas posso usar bancos de dados?