MetaTrader 5 build 3620: melhorias no terminal web, suporte ONNX e multiplicação mais rápida de matrizes em MQL5

Adicionado suporte para trabalhar com modelos ONNX (Open Neural Network Exchange). ONNX é uma biblioteca de código aberto para a construção de redes neurais de aprendizado profundo

10 março 2023

Terminal

  1. Corrigido o erro ao calcular o lucro total norelatório de negociação.
  2. Atualizados dados fundamentais sobre instrumentos de negociação disponíveis através da Observação do Mercado.
  3. Corrigida inicialização da plataforma de negociação no Wine 7.0.1 ao trabalhar em sistemas Linux.
  4. Corrigida a adição de símbolos à Observação do Mercado por meio da barra de pesquisa. O símbolo encontrado por descrição não podia ser adicionado à lista clicando em sua linha.

MQL5

  1. Adicionado suporte para trabalhar com modelos ONNX (Open Neural Network Exchange).

    ONNX é uma biblioteca de código aberto para a construção de redes neurais de aprendizado profundo. Este formato é suportado por muitas plataformas, incluindo Chainer, Caffee2 e PyTorch. Depois de criar um modelo ONNX usando ferramentas especializadas, você pode integrá-lo ao seu programa MQL5 e usá-lo para tomar decisões de negociação.

    Uma descrição de todas as funções suportadas está disponível na documentação. Um exemplo de como trabalhar com um modelo de teste está disponível em projetos públicos dentro do MetaEditor. Encontre o projeto ONNX.Price.Prediction em "Ferramentas > Projetos públicos" e clique em "Participar" no menu de contexto. O projeto será baixado para o seu computador e aparecerá no Navegador:


    Exemplo de trabalho com modelo ONNX em projetos públicos


    Compile o projeto e execute-o com EURUSD H1 para ver o resultado.

    Além do modelo finalizado e do código MQL5 para executá-lo, o projeto também inclui o script de Python PricePredictionTraining.py. Ele mostra como criar um modelo ONNX sozinho. Para que o script funcione, instale o Python em seu computador, bem como os módulos necessários a partir da linha de comando:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    Instruções detalhadas para trabalhar com ONNX estão disponíveis na documentação.

  2. Adicionado suporte para o novo algoritmo para multiplicação de matrizes General Matrix Multiplication (GeMM). Ele permite que você acelere significativamente os cálculos na maioria dos processadores por conta da paralelização de tarefas e do uso mais correto dos caches L1/L2/L3. A velocidade de cálculo é comparável a pacotes conhecidos como Math Kernel Library (MKL) e OpenBLAS. Num futuro próximo iremos publicar testes comparativos detalhados.

    O novo algoritmo é atualmente suportado no método matrix::GeMM. Se o seu processador suportar as instruções AVX e FMA (a maioria dos processadores lançados após 2013), o algoritmo será ativado automaticamente.

  3. Adicionado suporte para passar matrizes e vetores para DLLs. Agora você pode importar funções que usam esse tipo de dados de bibliotecas externas.

    Matrizes e vetores são passados para a DLL como um ponteiro para um buffer. Por exemplo, para passar uma matriz do tipo float, o parâmetro correspondente da função DLL exportada deve levar um ponteiro para um buffer do tipo float. Por exemplo:

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    Para um processamento adequado de matrizes e vetores, além de seus buffers, devem ser passados seus tamanhos.

  4. Adicionada a nova função CopySeries para copiar séries temporais sincronizadas de MqlRates para arrays separados.

    A função CopySeries permite obter apenas as séries temporais necessárias, de cada vez, em diferentes matrizes especificadas, garantindo que todas elas estejam sincronizadas entre si. Isso significa que todos os valores nas matrizes resultantes, em um índice específico N, pertencem à mesma barra no par símbolo/período de tempo especificado. Dessa forma, não é necessário garantir que todas as séries temporais recebidas estejam sincronizadas com o tempo de abertura da barra.

    Ao contrário da função CopyRates, que retorna um conjunto completo de séries temporais como uma matriz MQLRates, a função CopySeries permite que o programador obtenha somente as séries temporais necessárias, com base em uma combinação de sinalizadores que indicam o tipo de série temporal solicitado. Neste caso, a ordem dos arrays passados para a função deve corresponder à ordem dos campos na estrutura MqlRates:

    struct MqlRates
      {
       datetime time;         // período de início
       double   open;         // preço de abertura
       double   high;         // preço mais alto no período
       double   low;          // preço mais baixo no período
       double   close;        // preço de fechamento
       long     tick_volume;  // volume de ticks
       int      spread;       // spread
       long     real_volume;  // volume de negociação
      }

    Assim, caso seja necessário obter os valores das séries temporais time, close e real_volume para as últimas 100 barras do símbolo/timeframe atual, a chamada deve ser a seguinte:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    Ao mesmo tempo, a ordem dos arrays "time, close, volume" é importante — deve corresponder à ordem dos campos Estrutura MqlRates. Mas a ordem dos valores na máscara rates_mask não importa, a máscara poderia ser assim:

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    Exemplo

    //--- input parameters
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- obtemos séries temporais a partir da estrutura de preços Rates
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //--- solicitamos os preços de fechamento em uma matriz do tipo double
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- agora pedimos mais preços de abertura e fechamento em uma série de preços do tipo float
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- comparamos os dados
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Resultado
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  5. Corrigido um bug que, em casos raros, resultava no recebimento de um bilhete de ordem incorreto após o envio de uma solicitação pela função OrderSend. O erro pode ocorrer durante a negociação paralela na mesma conta por meio de diferentes plataformas.
  6. Corrigido bug com importação de bibliotecas EX5. Antes acontecia se o nome da biblioteca importada correspondia ao nome do arquivo para o qual ela era importada.

MetaEditor

  1. Adicionado envio de notificações push para participantes de projetos de grupo. Agora cada participante estará sempre ciente de qualquer alteração nos arquivos ou nas configurações do projeto. Para receber notificações, especifique seu ID MetaQuotes na seção "Configurações > Segurança" do seu perfil na MQL5.community.


    Notificações push sobre mudanças no projeto


  2. Icones de arquivo atualizados no Navegador. Metáforas novas e mais simples tornam as informações mais fáceis de entender.

Tester

  1. Corrigido um erro que fazia com que o parâmetro de string de entrada fosse truncado quando contia o caratere "|".

MetaTrader 5 WebTerminal, build 3620

  1. Adicionados vários esquemas de cores prontos para a interface, que afetam a exibição de barras e linhas no gráfico, os preços na Observação do Mercado e os indicadores financeiros da conta. Nossos designers selecionaram combinações de cores confortáveis, levando em consideração os desejos dos traders, para que possam escolher o esquema que melhor atenda às suas necessidades e preferências.


    Novos esquemas de cores para o terminal web


  2. Redesenhamos a janela de especificação do instrumento de negociação. Todos os dados são reempacotados em blocos lógicos compactos para facilitar a visualização.


    Janela de especificação do instrumento de negociação atualizada


  3. Corrigida a abertura de contas reais via terminal web. Em alguns casos, após preencher o formulário de registro, o servidor podia retornar um erro.
  4. Corrigido um erro na caixa de diálogo de negociação. Se o usuário abria a caixa de diálogo de modificação de posição e depois fechava a posição com o botão "X" na janela de instrumentos, o conteúdo da caixa de diálogo não era redefinido. Agora, a caixa de diálogo retorna automaticamente ao modo de colocação de novo pedido.
  5. Corrigida a exibição do campo Server na caixa de diálogo de gerenciamento de contas.
  6. Corrigida a exibição do período atual na barra de ferramentas.
  7. Corrigida a exibição de volume no número de unidades do ativo subjacente na caixa de diálogo de negociação.
  8. Corrigida a modificação dos níveis "Stop Loss" e "Take Profit". Em alguns casos, modificar um valor podia redefinir o segundo.
  9. Corrigida a exibição do aviso de risco do investidor.