O que há de novo no MetaTrader 5?

Histórico de atualizações das plataformas desktop, móvel e web

4 novembro 2022
MetaTrader 5 build 3490: versão móvel do terminal web e novos métodos de matriz em MQL5

Versão móvel do terminal web

A nova versão do terminal web possui suporte total para dispositivos móveis. Agora sua interface se adapta automaticamente ao tamanho da tela, permitindo que os usuários trabalhem convenientemente na plataforma por meio de telefones e tablets com iOS e Android:

Novo terminal web com suporte para dispositivos móveis

Além disso, muitas correções e melhorias foram feitas no terminal web.

Novo terminal web MetaTrader 5 suporta todos os recursos que um trader moderno precisa. O aplicativo permite:

  • Trabalhar com contas demo e reais
  • Receber cotações de quaisquer instrumentos financeiros
  • Negociar em qualquer mercado
  • Realizar análises técnicas de cotações usando mais de 30 indicadores e 20 objetos gráficos
  • Analisar dados do Calendário Econômico

Terminal

  1. As funções do gerenciador de tarefas foram expandidas. Agora ele facilita o rastreio de recursos consumidos com ainda mais precisão.
    • Adicionada exibição do tamanho da pilha para fluxos
    • Adicionada a exibição de quantidade de chaveamentos
    • Adicionado reconhecimento de threads do sistema e threads em DLLs de terceiros
    • Adicionada exibição do tempo de operação no modo kernel. Um aumento neste indicador em relação ao tempo gasto no modo de usuário pode indicar problemas no sistema: problemas nos drivers, erros de hardware, hardware lento. Leia mais na documentação da Microsoft.
    • Adicionada exibição do tempo de operação no modo de usuário.

    Gerenciador OpenCL para gerenciar dispositivos disponíveis


  2. A guia OpenCL foi adicionada às configurações do terminal para gerenciar os dispositivos disponíveis. O novo gerenciador OpenCL permite especificar explicitamente os dispositivos que serão usados para cálculos.

    Gerenciador OpenCL para gerenciar dispositivos disponíveis

  3. Adicionada a substituição dos níveis de Stop Loss e Take Profit no livro de ofertas para contas que operam no modo FIFO (pode ser ativado no lado da corretora).

    O modo FIFO implica que as posições de cada instrumento devem ser fechadas na ordem em que foram abertas. Para garantir que as posições de fechamento por meio de níveis de stop estejam sempre em conformidade com a regra FIFO, no lado do terminal do cliente é implementada a seguinte lógica:

    Se houver várias posições para o mesmo instrumento, o posicionamento de níveis de stop para qualquer um deles resultará no posicionamento de níveis de stop similares para todos os outros. Assim, quando o nível for acionado, todas as posições serão fechadas em ordem de acordo com a regra FIFO.

    Agora, ao abrir o livro de ofertas para um instrumento que já possui posições, os níveis das posições existentes (se houver) serão inseridos automaticamente nos campos Stop Loss e Take Profit.

  4. Corrigida a exclusão dos níveis Stop Loss e Take Profit usando os botões "X" na seção "Caixa de Ferramentas\Negociação". O erro ocorria quando a função de negociação rápida era desativada. Agora, quando o botão for pressionado, uma caixa de diálogo de negociação será aberta com o valor vazio do nível correspondente.

  5. Feitas alterações no relatório de negociaçãorelatório de negociação - as legendas nos gráficos e o cálculo da comissão final foram corrigidos. Além disso, em alguns casos, o Profit incorreto era mostrado nas estatísticas do relatório, bem como valores incorretos nas dicas de ferramentas ao passar o mouse sobre os gráficos de patrimônio liquido e saldo.

MQL5

  1. Adicionados métodos vetoriais e matriciais CopyTicks e CopyTicksRange. Eles facilitam a cópia de matrizes de dados de ticks para vetores e matrizes.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    O tipo de dados a ser copiado é especificado no parâmetro flags usando a enumeração ENUM_COPY_TICKS. Estão disponíveis os seguintes valores:
    COPY_TICKS_INFO    = 1,       // ticks causados por mudanças em Bid e/ou Ask
    COPY_TICKS_TRADE   = 2,       // ticks causados por mudanças em Last e Volume
    COPY_TICKS_ALL     = 3,       // ticks com alterações
    COPY_TICKS_TIME_MS = 1<<8,    // tempo em milissegundos
    COPY_TICKS_BID     = 1<<9,    // preço Bid
    COPY_TICKS_ASK     = 1<<10,   // preço Ask
    COPY_TICKS_LAST    = 1<<11,   // preço Last
    COPY_TICKS_VOLUME  = 1<<12,   // volume
    COPY_TICKS_FLAGS   = 1<<13,   // sinalizadores de tick
    Quando vários tipos de dados são selecionados (disponível apenas para matrizes), a ordem das linhas na matriz corresponderá à ordem dos valores na enumeração.

  2. Expandidos os recursos dos métodos matrix::Assign e vector::Assign.

    Agora, um array ou vetor unidimensional pode ser atribuído à matriz:
    bool matrix::Assign(const vector &vec);
    O resultado será uma matriz de uma linha.

    Além disso, uma matriz agora pode ser atribuída a um vetor (com suavização da matriz):
    bool vector::Assign(const matrix &mat);
  3. Adicionados métodos de Swap para vetores e matrizes.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Cada array, vetor ou matriz aponta para um buffer de memória que contém os elementos de dado objeto. O método Swap realmente troca de lugar os ponteiros para esses buffers sem gravar os elementos na memória. Desse modo, a matriz continua sendo uma matriz e o vetor continua sendo um vetor. Quando você troca uma matriz e um vetor, obtém uma matriz de uma linha com elementos vetoriais e um vetor com elementos de matriz em uma representação plana (consulte o método Flat).
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap matrix pointers
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    O método Swap também permite trabalhar com arrays dinâmicos (um array de tamanho fixo que não pode ser passado como parâmetro). Neste caso, a matriz pode ser de qualquer dimensão, mas de um tamanho acordado. Isso significa que o tamanho total de uma matriz ou vetor deve ser um múltiplo da dimensão zero da matriz. A dimensão zero de uma matriz é o número de elementos contidos no primeiro índice da matriz. Por exemplo, para um array tridimensional dinâmico double array[][2][3], a dimensão zero será o produto dos tamanhos da segunda e da terceira dimensão, ou seja, 2x3=6. Isso significa que tal array só pode ser usado no método Swap com matrizes e vetores cujo tamanho total seja múltiplo de 6: 6, 12, 18, 24, etc.

    Vamos mostrar isso com um exemplo:
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- preenchemos a matriz 1x10 com o valor 7,0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- tentamos realizar um intercâmbio entre uma matriz e um array
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // o tamanho da matriz não é um múltiplo do tamanho da primeira dimensão do array
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- pegamos uma matriz maior e tentamos a realizar o intercâmbio novamente
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // um array estático não pode ser usado para troca com uma matriz
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- outra tentativa de trocar um array e uma matriz
      double array_dynamic[][10];    // array dinâmico
      ArrayResize(array_dynamic, 3); // colocamos o tamanho da primeira dimensão
      ArrayCopy(array_dynamic, array_static);
    //--- agora usamos um array dinâmico para realizar o intercâmbio
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  não há erros
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. Adicionados métodos LossGradient para vetores e matrizes. Este método calcula um vetor ou matriz de derivadas parciais da função de perda em relação aos valores previstos. Na álgebra linear, esse vetor é chamado de gradiente e é usado no aprendizado de máquina.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. Habilitado o uso de FOREIGN KEYS no SQLite, o que permite construir relacionamentos entre tabelas em consultas SQL.   Por exemplo:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. Corrigida a seleção do método de classe necessário dependendo da constância do método e do objeto.

MetaEditor

  1. O tamanho do comentário com suporte foi aumentado para commits para MQL5 Storage.  Comentários detalhados ao enviar alterações ao repositório são considerados uma boa prática ao trabalhar em grandes projetos, mas essas mensagens eram anteriormente limitadas a 128 caracteres. O limite agora está definido para 260 caracteres.

MetaTester

  1. Maior sensibilidade do interruptor de velocidade de teste no modo visual.

Correções de crash-logs.


17 setembro 2022
MetaTrader 5 build 3440: Novo relatório sobre a conta de negociação

Terminal

  1. Adicionado um novo relatório de histórico de negociação de conta. Em termos de parâmetros e apresentação de informações, é semelhante aos já conhecidos relatórios de Sinais. Agora na própria plataforma você terá acesso a:
    • Indicadores de crescimento mensais na forma de gráfico e tabela
    • Gráfico de capital líquido
    • Gráfico de radar que permite avaliar rapidamente o estado da conta
    • Estatísticas de negociação por instrumento
    • Muitos indicadores adicionais para análise de negociação

    O relatório agora pode ser visualizado diretamente na plataforma sem antes exportá-lo para um arquivo. Para abri-lo, clique em "Relatórios" no menu "Exibir".




  2. Corrigido o preenchimento do quadro de opções quando o número ou tipo de instrumento não coincide entre os contratos Call e Put.
  3. Corrigida a seleção de posição na caixa de diálogo de negociação ao fechar uma posição com uma oposta. Ocorria um erro ao classificar ordens opostas disponíveis por qualquer coluna que não seja o ticket.
  4. Acelerada a exibição de entradas para o log da plataforma.
  5. Corrigida a exibição de comentários em gráficos de símbolos personalizados.

MQL5

  1. Corrigido o trabalho da função CArrayList::LastIndexOf. Anteriormente, sempre retornava -1 em vez do índice do último elemento encontrado.
  2. Adicionado método de atribuição de vetores e matrizes. Ele permite que você substitua o conteúdo de uma matriz/vetor pelos dados da matriz/vetor ou array passado.
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    Por exemplo:
      //--- copying matrices
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- copying an array to a matrix
      double arr[5][5]={{1,2},{3,4},{5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */
  3. Adicionado método de vetores e matrizes CopyRates. Ele permite que você copie facilmente matrizes de dados de preços em vetores e matrizes.
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    O tipo de dados a ser copiado é especificado no parâmetro rates_mask usando a enumeração ENUM_COPY_RATES. Estão disponíveis os seguintes valores:
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATES_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    Os dois últimos valores se destinam à seleção conveniente de vários parâmetros da barra principal de uma só vez - preços Open, High, Low, Close e horário.

    Quando vários tipos de dados são selecionados (disponível apenas para matrizes), a ordem das linhas na matriz corresponderá à ordem dos valores na enumeração.

  4. Corrigida a exibição de objetos "Rótulo de texto". Ao usar as propriedades OBJPROP_XOFFSET e OBJPROP_YOFFSET, um fragmento de imagem incorreto pode ser exibido no gráfico.

  5. Corrigido o erro de alteração em um parâmetro constante passado para uma função como referência a um ponteiro de objeto.

    Lembre-se de que o especificador const declara variável constante e não permite alterar o valor desta variável durante a execução do programa. Apenas uma vez permitida a inicialização da variável quando ela é declarada. Exemplo de variáveis constantes na função OnCalculate:

    int OnCalculate (const int rates_total,      // price[] array size
                     const int prev_calculated,  // bars processed on previous call
                     const int begin,            // meaningful data starts at
                     const double& price[]       // array for calculation
       );
    

    Mas no exemplo abaixo, houve um erro do compilador que permitia a conversão implícita de ponteiro para parâmetros de referência:

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b);  // não permitido
            Print( a,":",b );
      }
    Agora esta operação ilegal será detectada pelo compilador e gerará um erro.

MetaEditor

  1. Corrigida a exibição de referências a números complexos no depurador.
  2. Aprimorado desempenho do MQL5 Cloud Protector. Anteriormente, a proteção de arquivos podia falhar em casos raros.
  3. Correções de crash-logs.

Novo terminal web MetaTrader 5

Apresentamos um novo terminal web para o MetaTrader 5. Nós o fizemos moderno e rápido, atualizando não apenas o visual, mas também reescrevendo completamente o núcleo. Em termos de interface, o terminal web evoluiu de forma similar à já familiar versão iPad da plataforma:



Comparado com a versão antiga, tem muitos recursos novos:

  • Pedido de contas reais, preenchendo um formulário de registro detalhado e fornecendo documentos comprobatórios
  • Suporte para assinaturas de dados de preços e recepção de cotações com atraso
  • Mais objetos analíticos, gerenciamento mais conveniente
  • Exibição de entradas e saídas de mercado no gráfico
  • Visualização de eventos de calendário econômico
  • Configuração conveniente de instrumentos no Market Watch, visualização de alterações diárias de preços
  • A interface foi significativamente simplificada: o menu de contexto do gráfico e o menu superior foram removidos; todos os comandos para gerenciar o gráfico, objetos e indicadores sobrepostos foram colocados nos painéis à esquerda e superior; o resto dos comandos estão em um menu de hambúrguer
  • Tema da interface noturna
Experimente o novo terminal web no www.mql5.com agora mesmo. Suas corretoras o terão em breve.
4 agosto 2022
MetaTrader 5 build 3390: Float em OpenCL e funções matemáticas, métodos de ativação e perda para aprendizado de máquina

Terminal

  1. Adicionada a abertura automática de tutorial ao se conectar a uma conta de negociação pela primeira vez. Isso permite que os iniciantes dominem rapidamente os fundamentos da negociação e se familiarizem com os recursos da plataforma diretamente no terminal. O tutorial é dividido em várias seções, cada uma das quais fornece informações breves. O progresso de cada tópico a aprender é mostrado com uma linha azul.

    Atualizada a base de dados fundamental de instrumentos de negociação.

  2. Corrigido o erro das operações em massa "Fechar posições lucrativas/não lucrativas". Anteriormente, a plataforma usava posições opostas, se houvesse, para fechar as posições correspondentes. Por exemplo, se você tivesse duas posições de compra não lucrativas em EURUSD e uma posição de venda lucrativa em EURUSD, todas as três posições existentes seriam encerradas durante o fechamento em massa de posições não lucrativas. A compra e a venda seriam fechadas com uma operação de fechamento com a posição oposta, e a compra restante seria fechada com uma operação de fechamento normal. Agora as equipes trabalham conforme o planejado, fechando apenas posições selecionadas - lucrativas ou não lucrativas.
  3. Corrigida a exibição do histórico de preços para preços negativos em gráficos com período D1. Agora os gráficos com preços negativos são exibidos corretamente em todos os períodos gráficos.
  4. Otimizado e reduzido significativamente o consumo de recursos do sistema pelo terminal.
  5. O número de agregadores disponíveis para visualização de um instrumento de mercado foi ampliado para 15, o que permite encontrar informações sobre o número máximo de tickers nos agregadores econômicos mais populares.

    Atualizada a base de dados fundamental de instrumentos de negociação.

    Existem pelo menos 7.000 ações líquidas e mais de 2.000 ETFs listados no mercado global. Além disso, existem muitos futuros e outros derivativos. A plataforma MetaTrader 5 contém um enorme banco de dados de instrumentos bolsistas e também permite que você acesse o site do agregador em um clique e, assim, obtenha dados fundamentais diretamente do Market Watch. Para conforto dos investidores, oferecemos uma variedade de fontes de informação para cada título.

  6. Corrigida a substituição dos níveis de Stop Loss e Take Profit na janela para posicionar uma nova ordem. Agora, para contas operando no modo FIFO, os níveis de stop serão definidos automaticamente de acordo com os níveis de stop das posições já abertas para o mesmo instrumento. Isso é necessário para cumprir a regra FIFO.

MQL5

  1. : As funções matemáticas agora podem trabalhar com matrizes e vetores.

    Continuamos a expandir os recursos da plataforma MetaTrader 5 para negociação algorítmica e aprendizado de máquina. Anteriormente, adicionamos um novo tipo de dados, isto é, matrizes e vetores, que permitem abandonar o uso de matrizes para processamento de dados. Para trabalhar com ele, adicionamos mais de 70 métodos à linguagem MQL5 que permitem realizar cálculos de álgebra linear e estatística na forma de uma única operação. Agora multiplicação, transformação e solução de sistema de equações são feitas de forma simples e sem programação desnecessária. A adição de novos tipos não deixou de lado as funções matemáticas.

    As funções matemáticas foram originalmente projetadas para operações matemáticas em valores escalares. Agora, a maioria dessas funções pode ser usada com novos tipos de dados - matrizes e vetores - MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1 , MathLog1p, MathArccosh, MathArcsinh, MathArctanh, MathCosh, MathSinh, MathTanh. Neste caso, a matriz ou vetor é processado termo a termo, por exemplo:
    //---
      matrix a= {{1, 4}, {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    No caso de MathMod e MathPow, um escalar, uma matriz ou um vetor de tamanho apropriado pode ser usado como segundo parâmetro.

    Vamos usar um exemplo para mostrar como calcular o desvio padrão usando funções matemáticas sobre um vetor.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- используем инициализирующую функцию для заполнения вектора
      vector r(10, ArrayRandom); // массив случайных чисел от 0 до 1
    //--- вычислим среднее значение
      double avr=r.Mean();       // среднее значение массива
      vector d=r-avr;            // вычислим массив отклонений от среднего значения
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // массив квадратов отклонений
      double sum=s2.Sum();       // сумма квадратов отклонений
    //--- вычислим стандартное отклонение 2-мя способами
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. As funções de modelo agora podem usar as entradas matrix<double>, matrix<float>, vector<double>, vector<float> em vez dos tipos matrix, matrixf, vector, vectorf correspondentes.
  3. Aprimoradas as funções matemáticas para trabalhar com o tipo float. Devido ao surgimento da aplicação de funções matemáticas a matrizes e vetores flutuantes, as funções correspondentes aplicadas a escalares flutuantes também foram melhoradas. Anteriormente, os parâmetros dessas funções eram convertidos incondicionalmente no tipo double, a implementação correspondente da função matemática era chamada e, em seguida, o resultado era convertido no tipo float. Agora, no caso do tipo float, os parâmetros e resultados não são convertidos, pois são chamadas as implementações das funções matemáticas correspondentes ao tipo float.

    A diferença nos cálculos usando o exemplo de um seno matemático:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  массив случайных чисел от 0 до 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Adicionados métodos de matrizes e vetores Ativation (função de ativação) e Derivative (derivada da função de ativação) com parâmetros:
    AF_ELU               Exponential Linear Unit
    AF_EXP               Exponencial
    AF_GELU              Gaussian Error Linear Unit
    AF_HARD_SIGMOID      Hard Sigmoid
    AF_LINEAR            Linear
    AF_LRELU             Leaky REctified Linear Unit
    AF_RELU              REctified Linear Unit
    AF_SELU              Scaled Exponential Linear Unit
    AF_SIGMOID           Sigmoid
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Swish
    AF_TANH              Hyperbolic Tangent
    AF_TRELU             Thresholded REctified Linear Unit
    Uma função de ativação em uma rede neural determina como a soma ponderada de um sinal de entrada é convertida no sinal de saída de um nó ou nós a nível da rede. A escolha da função de ativação tem um grande impacto nas capacidades e no desempenho da rede neural. Diferentes partes do modelo podem usar diferentes funções de ativação. A linguagem MQL5 implementa não apenas todas as funções de ativação conhecidas, mas também derivações da função de ativação. Funções derivadas são necessárias para calcular rapidamente a correção com base no erro recebido durante o treinamento da rede neural.
  5. Adicionado método de matrizes e vetores Loss (função de perda) com os seguintes parâmetros:
    LOSS_MSE            Mean Squared Error
    LOSS_MAE            Mean Absolute Error
    LOSS_CCE            Categorical Crossentropy
    LOSS_BCE            Binary Crossentropy
    LOSS_MAPE           Mean Absolute Percentage Error
    LOSS_MSLE           Mean Squared Logarithmic Error
    LOSS_KLD            Kullback-Leibler Divergence
    LOSS_COSINE         Cosine similarity/proximity
    LOSS_POISSON        Poisson
    LOSS_HINGE          Hinge
    LOSS_SQ_HINGE       Squared Hinge
    LOSS_CAT_HINGE      Categorical Hinge
    LOSS_LOG_COSH       Logarithm of the Hyperbolic Cosine
    LOSS_HUBER          Huber

    A função de perda é responsável por avaliar quão bem o modelo prevê o valor real. Construir um modelo é basicamente resolver o problema de minimizar o valor dessa função em cada estágio. Dependendo do tipo de dados, você precisa usar abordagens diferentes, ou seja, funções diferentes. A função de perda também pode depender de pesos e tendências variáveis. A função de perda é unidimensional e não é um vetor porque avalia o desempenho da rede neural como um todo.
  6. Adicionados métodos de matrizes e vetores matrix::CompareByDigits e vector::CompareByDigits. Eles comparam se dígitos significativos dos elementos de duas matrizes/vetores coincidem.

  7. Adicionado suporte a funções MathMin e MathMax para strings. Nesse caso, as funções usarão comparação lexicográfica, isto é, as letras são comparadas alfabeticamente e diferenciam maiúsculas de minúsculas.

  8. Aumentado o número máximo de objetos OpenCL de 256 para 65536. As CLContextCreate, CLBufferCreate e CLProgramCreate ajudam a criar identificadores para objetos OpenCL em programas MQL5. O limite anterior de 256 identificadores não permitia que você trabalhasse efetivamente em métodos de aprendizado de máquina.

  9. Permitido usar OpenCL em placas sem suporte para double. Anteriormente, os programas MQL5 usavam apenas GPUs com suporte para double, embora muitas tarefas permitissem e fossem projetadas para cálculos usando floats. O tipo float é inicialmente considerado nativo para computação paralela, pois ocupa menos espaço. Este requisito já foi removido.

    Se uma tarefa precisar usar apenas uma GPU com suporte para double, isso poderá ser especificado explicitamente ao chamar CLContextCreate usando o novo valor CL_USE_GPU_DOUBLE_ONLY (somente dispositivos que suportam cálculos com o tipo double podem ser usados).
       int cl_ctx;
    //--- инициализация OpenCL контекста
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Corrigido o trabalho da função CustomBookAdd. Anteriormente, se um valor zero fosse especificado no campo MqlBookInfo::volume_real, o devido instantâneo do livro de ofertas não era criado. Agora a verificação é feita assim:
    A exatidão dos dados transmitidos é verificada, sendo que o tipo, o preço e o volume devem ser indicados para cada elemento. Ao mesmo tempo, MqlBookInfo.volume e MqlBookInfo.volume_real não devem ser zero ou negativos: se ambos os volumes forem negativos, isso será considerado um erro. Você pode especificar qualquer um dos volumes ou ambos, pois é tomado o que é indicado ou positivo:

       volume=-1 && volume_real=2 — será usado volume_real=2,

       volume=3 && volume_real=0 — será usado volume=3.

    Volume com maior precisão MqlBookInfo.volume_real tem uma prioridade mais alta do que MqlBookInfo.volume normal. Se ambos os valores forem especificados para o elemento do livro de ofertas, será utilizado volume_real.

    Se pelo menos um elemento do livro de ofertas for descrito incorretamente, o sistema descartará completamente o estado transferido.

  11. Corrigida a operação da função CalendarValueLast. O bug era que, em alguns casos, chamadas sucessivas para a função após alterações no calendário econômico (o parâmetro de alteração recebia um novo valor após a chamada) podiam ignorar eventos ao usar o filtro de moeda.
    CalendarValueLast(change, result, "", "EUR")
  12. Corrigido o comportamento da função ArrayBSearch. Se houver vários elementos idênticos, será retornada uma referência ao primeiro e não, a um aleatório, como era antes.
  13. Corrigida a visibilidade de função de modelo em uma classe. O erro era que as funções do modelo de classe declaradas como private/protected acabavam sendo de fato public (public).

MetaEditor

  1. Corrigidos bugs e comportamento ambíguo MetaAssist.
  2. Adicionado suporte para a macro %terminal%, que significa o caminho para o diretório de dados da plataforma onde este terminal está instalado. Por exemplo, %terminal%\MQL5\Experts. 


    Adicionado suporte para a macro %terminal%, que significa o caminho para o diretório de dados da plataforma onde este terminal está instalado.

  3. Aprimorada a exibição de matrizes no depurador.
  4. Aumento do buffer para copiar valores a partir do depurador.
  5. Aprimoradas dicas de erro.
  6. Caminhos relativos agora são escritos no arquivo de projeto *.mproj. Anteriormente, os caminhos eram absolutos, o que resultava em erros de compilação ao mover um projeto.
  7. Adicionada incorporação automática de recursos BMP como matrizes de bitmap de 32 bits disponíveis globalmente quando incluídas em projetos. Isso elimina a necessidade de chamar ResourceReadImage no código para ler o recurso gráfico.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Aprimorada a leitura de formatos de arquivos BMP estendidos.
  9. Traduções de IU atualizadas.
  10. Correções de crash-logs.


2 junho 2022
MetaTrader 5 build 3320: Melhorias e correções

Terminal

  1. Aprimoradas as dicas de ferramentas para objetos de negociação exibidos em gráficos.
    • A exibição de lucro foi adicionada para negociações de saída do mercado.
    • Para as transações realizadas como resultado de um acionamento de Take Profit ou Stop Loss, foi adicionada a indicação correspondente - TP/SL.

    Dicas semelhantes foram adicionadas às linhas que conectam as negociações de entrada e saída.

    Estendidas dicas de ferramentas para objetos de transações


  2. Acelerado o trabalho do sistema gráfico.
  3. Adicionado o registo em log de operações em massa sobre ordens e posições abertas. Ao executar esse comando, uma mensagem do tipo "bulk closing of XXX positions started" é registada no log.
  4. Corrigido o fechamento de posições em massa por meio de posições contrárias.
  5. Corrigida a atualização dos objetos que representam o histórico de negociação no gráfico. Esse erro ocorria quando o instrumento de negociação era alterado no gráfico.

MQL5

  1. Continuamos a trabalhar nas funções para matrizes e vetores: adicionada o suporte a float e complex.
  2. O operador "!" (LNOT) para ponteiros verifica agora se ele é válido através de uma chamada implícita da função CheckPointer. O operador "==" deve ser utilizado para verificar rapidamente se ele é NULL, assim: ptr==NULL ou ptr!=NULL.

MetaTester

  1. Corrigida a exibição de objetos de transações no gráfico de teste.
  2. Acelerado o funcionamento do sistema gráfico.

MetaEditor

  • Atualizadas traduções da interface.

Correções de crash-logs.

20 maio 2022
MetaTrader 5 build 3300: Compilação rápida e melhor navegação pelo código no MetaEditor

Terminal

  1. Adicionada a capacidade de redimensionar o objeto gráfico "Rectângulo" arrastando qualquer um dos quatro cantos.



  2. Acelerada a renderização da GUI.
  3. Melhorado o suporte a endereços IPv6.
  4. Corrigido o cálculo da altura do campo de data e a largura do campo de preço logo na primeira inicialização da plataforma.

MQL5

  1. Adicionada a função para manusear matrizes e vetores —  RegressionMetric. Ela especifica o cálculo para avaliar a regressão.
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    Os cálculos que podem ser utilizados são:
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // Erro médio absoluto
       REGRESSION_MSE,     // Erro médio quadrático
       REGRESSION_RMSE,    // Raiz do erro médio quadrático
       REGRESSION_R2,      // R ao quadrado
       REGRESSION_MAPE,    // Erro médio absoluto em porcentagem
       REGRESSION_MSPE,    // Erro médio quadrático em porcentagem
       REGRESSION_RMSLE    // Erro médio logarítmico quadrático
      };
  2. Adicionado o recurso para escrever matrizes com um tamanho de dados maior que INT_MAX (matrizes de estruturas).

MetaEditor

  1. Redesenhado o painel de guias:

    • O painel não fica oculto mesmo que apenas uma janela esteja aberta. Assim, os comandos do menu de contexto da guia estão sempre disponíveis.
    • Um botão "X" foi adicionado a cada guia para fechamento. Além disso, as guias podem ser fechadas com o botão do meio do mouse ou através do menu de contexto.

  2. Adicionado o comando para a rápida compilação de programas. Nenhuma otimização de código é realizada neste modo, o que reduz significativamente o tempo necessário para criar um arquivo EX5 executável. Use este modo quando você estiver em um estágio ativo de desenvolvimento e precisar verificar o código escrito rapidamente. Já ao compilar o programa, mude para o modo de otimização máxima para obter o melhor desempenho.

    O parâmetro "Otimização máxima" nas configurações do projeto desempenha a mesma função.
    Todas as operações relacionadas à compilação foram colocadas no menu "Compilação".

  3. Melhorado o gerenciamento de código:
    • Foram separados os comandos para acessar a declaração e a implementação. Anteriormente, era usado um comando que exibia um menu de seleção. Agora você pode pular imediatamente para a parte necessária do código.
    • Acrescentada a substituição de palavra-chave atribuída, pressionando "Tab", além de "Enter".


  4. Adicionada a exibição automática de variáveis locais na lista de monitoramento do depurador. Para fazer isso, ative a opção "Locais" no menu de contexto. Durante a depuração, conforme você navega pelo código, as variáveis do escopo atual serão exibidas automaticamente na lista.



  5. Melhorado o funcionamento da lista de monitoramento para vetores e matriz no depurador.
  6. Corrigidos os caminhos para os arquivos de projeto. O erro podia acarretar o desaparecimento de arquivos.

Tester

  1. Melhorada o desligamento de agentes de teste ao encerrar a plataforma.
  2. Adicionado um quinto nó para a MQL5 Cloud Network, está localizado em Hong Kong. Isso acelerará a otimização dos robôs que utilizam a rede nas regiões mais próximas.

Correções de crash-logs.
29 abril 2022
MetaTrader 5 build 3280: melhorias e correções baseadas no feedback dos traders

Terminal

  1. Corrigido o preenchimento dos níveis de Trailing Stop padrão no menu de contexto de ordens e posições abertas.



  2. Atualizadas as traduções da interface do usuário.

Correções de crash-logs.
21 abril 2022
MetaTrader 5 build 3270: Melhorias e correções

Terminal

  1. Bate-papo embutido melhorado:
    • O design foi atualizado e as mensagens agora aparecem sem "nuvens", liberando a conversa de detalhes desnecessários. Adicionados avatares e separadores de datas.
    • Comandos de cópia e exclusão foram adicionados ao menu de mensagens.
    • Corrigidos erros e melhorada a estabilidade.



  2. Corrigido o funcionamento do comando para o fechamento de posições em massa. O erro ocorria em contas com um sistema de registro de posições com cobertura.
  3. Corrigido o cálculo de alguns tipos de negócios ao gerar o histórico de posições.

Correções de crash-logs.
15 abril 2022
MetaTrader 5 build 3260: Operações em massa, funções matriciais e vetoriais, e melhorias no bate-papo

Terminal

  1. Adicionados comandos para fechamento de posições e remoção de ordens pendentes em massa.

    No menu de contexto da seção de negociação, foi acrescentada uma nova seção, "Operações em massa". A lista de comandos disponíveis é gerada de forma inteligente, dependendo da operação selecionada e do seu tipo de conta.



    Os comandos estão sempre disponíveis no menu:
    • Fechamento de todas as posições. Para as contas de cobertura, o sistema primeiro tenta fechar posições com posições contrárias, e depois fecha as posições restantes de acordo com o procedimento normal.
    • Fechamento de todas as posições lucrativas e todas as posições desfavoráveis
    • Remoção de todas as ordens pendentes
    • Remoção de todas as ordens pendentes separadamente por tipo: Limit, Stop, Stop Limit

    Se uma posição for selecionada, comandos adicionais aparecem no menu:
    • Fechamento de todas as posições com o mesmo símbolo
    • Fechamento de todas as posições na mesma direção (para contas de cobertura)
    • Fechamento de posições contrárias com o mesmo símbolo (para contas de cobertura)
    • Reversão de posição (para contas de compensação)

    Se uma ordem pendente for selecionada, comandos adicionais aparecem no menu:
    • Remoção de todas as ordens pendentes com o mesmo símbolo
    • Remoção de todas as ordens pendentes com o mesmos tipo e símbolo

    Para que estes comandos funcionem, o usuário deve habilitar a negociação com um clique nas configurações da plataforma: Serviço \ Configurações \ Negociação.
  2. Expandidas as funções de bate-papo embutidas:
    • Adicionada a opção de responder a mensagens. O texto da mensagem original será incluído na resposta como uma citação.
    • Adicionada a criação de mensagens com diferentes tipos de conteúdo: imagens com texto, texto com anexos, etc.
    • Corrigida a exibição do separador de mensagens lidas e não lidas.
    • Corrigidos vários erros e alcançada uma maior estabilidade.



  3. Otimizada e significativamente acelerada a operação do sistema gráfico do terminal. Menos recursos serão gastos na exibição da interface.
  4. Corrigido o cálculo da variação diária do preço de futuros. Se a corretora transmitir o preço de compensação, o cálculo será feito a partir dele.
    ((Last - preço de compensação)/preço de compensação)*100
    Você pode saber mais sobre o cálculo para cada tipo de instrumento na documentação.

  5. Corrigidos erros ao adquirir serviços MQL5:
    • Em alguns casos, os sistemas de pagamento podiam exibir mensagens de erro incorretas relativas a operações bem sucedidas.
    • Em estágios intermediários de aluguel de produtos no Mercado, a página podia apresentar um preço incorreto.

  6. Corrigido o funcionamento do botão "Iniciar" na página do produto comprado/descarregado via Mercado. Agora ele executa o aplicativo corretamente no primeiro dos gráficos abertos.
  7. Corrigido o cálculo de alguns tipos de negócios ao gerar o histórico de posições.

MQL5

  1. Adicionadas novas funções para trabalhar usando matrizes e vetores:
    • Median — retorna a mediana dos elementos da matriz ou vetor
    • Quantile — retorna o q-ésimo quantil de elementos da matriz/vetor ou elementos ao longo do eixo matricial especificado
    • Percentile — retorna o q-ésimo percentil dos elementos da matriz/vetor ou elementos ao longo do eixo matricial especificado
    • Std — calcula o desvio padrão dos elementos de uma matriz ou vetor
    • Var — calcula a variância dos elementos de uma matriz ou vetor
    • CorrCoef — calcula o coeficiente de correlação de uma matriz ou vetor
    • Correlate — calcula a correlação cruzada dos dois vetores
    • Convolve — retorna uma convolução linear discreta de dois vetores
    • Cov — calcula a matriz de covariância

  2. Continuam os trabalhos para adicionar métodos embutidos para matrizes numéricas. Isto ampliará a facilidade de escrita do código, o tornará mais compacto e melhorará a compatibilidade com outras linguagens.

    Atualmente, há três métodos disponíveis:
    • ArgSort — classifica a matriz por uma dada dimensão, por padrão pela mais recente (axis=-1).
    • Range — retorna o número de elementos na dimensão especificada da matriz. Análogo a ArrayRange.
    • Size — retorna o número de elementos da matriz. Análogo a ArraySize.

    Exemplo:
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
            {10, 36,  2, 12,  5},
            {33, 37, 25, 13,  4},
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- Classificamos a matriz
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // Resultado no log:
    // indexes
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. Em andamento esforços para acrescentar métodos embutidos para strings.

    Os seguintes métodos estão atualmente disponíveis:
    • BufferSize — retorna o tamanho do buffer alocado para a cadeia.
    • Compare — compara duas strings e retorna o resultado como um inteiro.
    • Length — retorna o número de caracteres na string.
    • Find — procura uma substring na string.
    • Upper — converte a string em maiúsculas.
    • Lower — Upper — converte a string em minúsculas.
    • Replace — substitui a substring.
    • Reserve — reserva um buffer para a string.

    Todos os métodos funcionam da mesma maneira que as funções de string.

    Exemplo:
    void OnStart()
      {
       string test="some string";
       PrintFormat("String length is %d",test.Length());
      }
    
    // Resultado no log:
    // String length is 11
  4. Adicionado o valor SYMBOL_SUBSCRIPTION_DELAY à enumeração ENUM_SYMBOL_INFO_INTEGER — tamanho do atraso nas cotações transmitidas pelo símbolo.

    Usado somente para instrumentos baseados em assinaturas, geralmente, ao transmitir dados em modo de teste gratuito.

    A propriedade só pode ser consultada para símbolos selecionados na Observação do Mercado. Caso contrário, você receberá o erro ERR_MARKET_NOT_SELECTED (4302).

  5. Adicionada a propriedade ACCOUNT_HEDGE_ALLOWED à propriedade ENUM_ACCOUNT_INFO_INTEGER — permissão para abrir posições opostas e ordens pendentes. Usado somente para contas de cobertura, permitindo a implementação das exigências de alguns reguladores quando a conta é proibida de ter posições opostas, mas permitido ter múltiplas posições do mesmo símbolo na mesma direção.

    Se esta opção for desativada, não é permitido que as contas tenham posições e ordens opostas para o mesmo instrumento ao mesmo tempo. Por exemplo, se houver uma posição Buy na conta, o usuário não poderá abrir uma posição Sell ou colocar uma ordem de venda pendente. Se o usuário tentar fazer isso, ele receberá o erro TRADE_RETCODE_HEDGE_PROHIBITED.

  6. Acrescentadas novas propriedades à enumeração ENUM_SYMBOL_INFO_DOUBLE:
    • SYMBOL_SWAP_SUNDAY
    • SYMBOL_SWAP_MONDAY
    • SYMBOL_SWAP_TUESDAY
    • SYMBOL_SWAP_WEDNESDAY
    • SYMBOL_SWAP_THURSDAY
    • SYMBOL_SWAP_FRIDAY
    • SYMBOL_SWAP_SATURDAY

    Elas permitem que você obtenha a taxa de acumulação de swaps para cada dia da semana. 1 — único swap acumulado, 3 — triplo, 0 — sem acumulação.

  7. Corrigido um bug, ao usar CopyTicks e CopyTicksRange, que fazia com que os dados desatualizados fossem dados à meia-noite. Ocorria quando não eram recebidos ticks do instrumento.
  8. Correções de crash-logs.
11 fevereiro 2022
MetaTrader 5 build 3210: adicionamos novos métodos de matrizes e controle de valor mínimo/máximo de indicador

MQL5

  1. Adicionadas as funções Min, Max, ArgMin, ArgMax e Sum para vetores e matrizes, que permitem encontrar valores mínimos e máximos, índices e soma correspondentes.
  2. Adicionado suporte para métodos Flat para matrizes. Isto permite que um elemento matricial seja endereçado através de um único índice, e não através de dois.
    double matrix::Flat(ulong index) const;      // getter
    void matrix::Flat(ulong index,double value); // setter

    Pseudocódigo para calcular o endereço de um elemento da matriz:

    ulong row=index / mat.Cols();
    ulong col=index % mat.Cols();
    
    mat[row,col]

    Por exemplo, para uma matriz matrix mat(3,3) o acesso aos elementos pode ser registrado assim:

      para leitura —  x=mat.Flat(4), o que corresponde à expressão x=mat[1][1]
      para registro —  mat.Flat(5, 42), o que corresponde à expressão mat[1][2]=42

    Caso seja chamada uma função com um índice de matriz inválido, será gerado um erro crítico de
    execução - OutOfRange.
  3. Melhorada a formatação de números fracionários nos parâmetros de entrada MQL5 do programa. Quando eram lidos alguns números reais, nos parâmetros de entrada eram substituídos números com mais zeros, por exemplo, 0,4 era representado como 0.400000000002.
  4. Corrigidos bugs da biblioteca matemática Math\Stat\Math.mqh. Além disso, foi modificada a função MathSample desta biblioteca para corresponder ao comportamento clássico do mesmo tipo de bibliotecas matemáticas quando da amostragem com retorno.
  5. Corrigido um bug ao usar CopyTicks/CopyTicksRange, este erro fazia com que os dados desatualizados fossem dados à meia-noite para aqueles casos em que não eram recebidos ticks do instrumento.
  6. Acrescentados os novos valores INDICADOR_FIXED_MINIMUM e INDICADOR_FIXED_MAXIMUM à enumeração ENUM_CUSTOMIND_PROPERTY_INTEGER.
    Estas propriedades são utilizadas para habilitar/desabilitar a fixação dos valores mínimos e máximos do indicador através da função IndicatorSetInteger. Ao chamar IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true) é usado o valor mínimo/máximo atual, respectivamente.



Tester

  1. Alterado o algoritmo de cálculo Sharpe Ratio, agora é calculado da maneira clássica e seu valor é reduzido ao intervalo anual. O algoritmo anterior se baseava no PnL (spread of profits and losses), mas não levava em conta as flutuações do capital líquido em posições abertas. Agora são levados em conta os altos e baixos do capital líquido, e o valor do próprio índice de Sharpe é tratado classicamente:
    •  Sharpe Ratio < 0              Estratégia não lucrativa, não é boa.  Ruim.
    •  0 < Sharpe Ratio  < 1.0    Risco não compensa. Tais estratégias podem ser tomadas para operar se não houver alternativas.  Incerto.
    • Sharpe Ratio ≥ 1.0            Caso o índice de Sharpe seja maior que um, o risco está compensando, a carteira/estratégia está funcionando. Bom.
    • Sharpe Ratio ≥ 3.0            Um número alto indica que a probabilidade de ocorrência de uma perda em qualquer negócio em particular é muito baixa. Muito bom

Terminal

  1. Otimizado o consumo de memória do terminal.
  2. Aprimorado o funcionamento do subsistema de rede para melhorar o desempenho e reduzir a latência da rede.
  3. Removida a exibição do zero da grade no indicador quando a renderização da grade estiver desativada.


28 janeiro 2022
MetaTrader 5 build 3180: Vetores e matrizes em MQL5 e uso mais prático

Terminal

  1. Adicionada a ativação da janela do gráfico ao soltar nela quer seja um símbolo desde a "Observação do mercado" ou uma operação de negociação desde o histórico da conta.

    Ambas as ações alteram o símbolo do gráfico para o selecionado. Anteriormente, isso não causava que a janela do gráfico ficasse ativa. Assim, algumas ações adicionais, como chamar a caixa de diálogo de negociação (F9) ou alterar a escala (+/-) usando teclas de atalho, podem ser aplicadas inesperadamente a outro gráfico para o usuário. Agora, após arrastar o gráfico do símbolo alterado, este fica imediatamente selecionado.

  2. Adicionada a abertura de uma nova janela de ordem ao clicar duas vezes em uma operação no histórico da conta. O instrumento financeiro da operação em que você clicou é imediatamente substituído na caixa de diálogo, permitindo negociar mais rapidamente. Um comando semelhante foi adicionado ao menu de contexto.




  3. Adicionada a inclusão inteligente de volumes reais ou de ticks ao abrir novos gráficos. Esses dados são importantes na hora de analisar o mercado, porém, nem todos os traders estão cientes de sua disponibilidade na plataforma.

    A prioridade é dada aos volumes reais de negociação. Se forem fornecidos por uma corretora, sua exibição será habilitada no gráfico. Caso contrário, será habilitada a exibição de volumes de ticks.

    O mecanismo é usado apenas se o gráfico for aberto como modelo default.tpl. Se o usuário desabilitar manualmente a exibição de volumes nas configurações do gráfico, ele não será habilitado novamente quando for reaberto. Os modelos personalizados não são afetados.

  4. Corrigida e significativamente acelerada a exibição da interface do usuário.
  5. Aprimorada a função de impressão de gráfico, chamada através do menu "Arquivo":
    • Corrigido o salvamento das configurações de impressão
    • Melhorada a aparência da página impressa: ampliadas linhas de grade, escondido nome do programa, atualizada fonte do cabeçalho
    • Aumentada a caixa de diálogo de impressão para exibir a interface corretamente

  6. Corrigido o funcionamento do campo de volume no painel de negociação rápida no gráfico. Anteriormente, após inserir um novo valor e pressionar a tecla Tab, o valor era redefinido para o valor anterior.
  7. Corrigida a exibição de histórico de negociação no gráfico. Anteriormente, ao alternar entre contas, as operações da conta anterior não eram removidas dos gráficos.
  8. Corrigido o pagamento de serviços da MQL5.com via PayPal.
  9. Corrigido o congelamento da plataforma ao exibir o gráfico de volatilidade de opções.
  10. Corrigida a verificação de número de telefone na janela de registro da conta real. Em alguns casos, após inserir o número certo, a plataforma não permitia avançar para a próxima etapa do registro.
  11. Corrigida a verificação de direitos ao entrar em um bate-papo em grupo com membros da comunidade MQL5.com. Anteriormente, um usuário recém-conectado só podia ler, mas não escrever mensagens.
  12. Substituído o rótulo no gráfico na ausência de dados. Agora, o nome, o timeframe e a descrição do instrumento são exibidos em vez de "Waiting for update".
  13. Melhorado o suporte de preços negativos, adicionado no build 2450. Para os respectivos instrumentos, a "Observação do mercado" agora também pode exibir valores zero.
  14. Corrigida a exibição de logotipos de produtos no Mercado ao trabalhar no Wine.

MQL5

  1. Continuamos a trabalhar o suporte para vetores e matrizes. As novas funções ampliam significativamente as possibilidades para desenvolvedores de soluções baseadas em redes neurais.

    Já existem muitas funcionalidades neste momento:
    • Eye — cria uma matriz com uns na diagonal especificada e zeros nos outros lugares.
    • Identity — cria uma matriz com o tamanho especificado com uns na diagonal principal e zeros nos outros lugares.
    • Ones — cria uma matriz com o tamanho especificado, preenchida com uns.
    • Zeroes — cria uma matriz com o tamanho especificado, preenchida com zeros.
    • Full — cria uma matriz com o tamanho especificado, preenchida com os valores especificados.
    • Copy — cria uma cópia de uma matriz ou de um vetor.
    • Diag — extrai uma diagonal de uma matriz, e preenche a diagonal especificada com valores provenientes de um vetor.
    • Tri — cria uma matriz com uns na diagonal especificada e sob ela e zeros nos outros lugares.
    • Row — retorna uma linha de matriz como um vetor, e preenche a linha especificada com valores provenientes de um vetor.
    • Col — retorna uma coluna de matriz como um vetor, e preenche a coluna especificada com valores provenientes de um vetor.
    • Rows — retorna o número de linhas em uma matriz.
    • Cols — retorna o número de colunas em uma matriz.
    • Transpose — transposição da matriz.
    • * — produto de matrizes, de vetores e de escalares — produto dot.
    • Power — exponenciação de matriz.
    • Kron — produto de Kronecker.
    • Cholesky — decomposição de Cholesky.
    • QR — fatoração QR.
    • SVD — decomposição SVD.
    • LU — decomposição LU.
    • LUP — decomposição LUP.
    • Norm — cálculo de norma de matriz.
    • Cond — cálculo de número de condição de matriz.
    • Spectrum — cálculo de espetro de matriz.
    • Det — cálculo de determinante de matriz.
    • Rank — cálculo de posto de matriz.
    • SLogDet — obtém o sinal e o logaritmo de um determinante de matriz
    • Trace — cálculo de traço de matriz.
    • Solve — solução de sistemas de equações lineares.
    • LstSq — solução de sistemas de equações lineares pelo método dos mínimos quadrados.
    • Inv — cálculo de inversa de matriz.
    • PInv — cálculo de pseudoinverso pelo método Moore-Penrose
    • Compare — comparação de duas matrizes pelo método Épsilon.

    Informações detalhadas sobre a formatação estão disponíveis na documentação MQL5:

  2. Corrigidos erros ao trabalhar usando arquivos e bancos de dados relacionados à restrição de comprimento de caminho. Em particular, a função DatabaseOpen permitia definir um caminho maior que o permitido, causando a criação incorreta do banco de dados. A função agora retornará corretamente o código de erro ERR_TOO_LONG_FILE_NAME.
  3. Corrigido o controle de constância de variáveis. Em alguns casos, o compilador podia não gerar o erro "constant variable cannot be passed as reference".
  4. Corrigidos avisos errôneos do compilador sobre o uso de uma variável não inicializada.
  5. Corrigido o funcionamento da função ChartWindowOnDropped para indicadores. Anteriormente, sempre retornava valor zero.
  6. Adicionado ao módulo de integração com Python o suporte para Python 3.10.

VPS

  1. Corrigida a exibição do item VPS no Navegador. Em alguns casos, desaparecia ao alternar entre contas.

MetaEditor

  1. Corrigida expansão de expressões complexas na janela de visualização durante a depuração.

Tester

  1. Corrigida a exportação de relatórios de teste para um arquivo. Alguns valores eram arredondados incorretamente quando uma moeda com 0 casas decimais era usada como moeda de depósito. Por exemplo, o JPY.
22 outubro 2021
MetaTrader 5 build 3091: melhorias de desempenho

Terminal

  1. Corrigida a transição para uma página em branco após a compra de serviços MQL5. Os usuários agora serão diretamente reencaminhados para os resultados da operação.
  2. Corrigida a compressão excessiva de imagens de documentos carregadas ao solicitar contas reais. Isso melhorou a qualidade das verificações KYC automatizadas e a velocidade de tomada de decisão.
  3. Corrigido o funcionamento do gráfico aberto quando o teste é concluído.

MQL5

  1. Adicionado suporte para SQLite 3.36.0.

MetaEditor

  1. Adicionado destaque de fundo para parêntesis emparelhados. Para habilitar vá para as configurações gerais do MetaEditor.
  2. Aprimorado o desempenho do depurador de programas MQL5.

Correções de crash-logs.
21 outubro 2021
MetaTrader 5 build 3090: melhorias de desempenho

Terminal

  1. Corrigido um bug que em alguns casos acabava por fazer desaparecer ferramentas de negociação personalizadas.
  2. Aprimorados ícones de menu e de barra de ferramentas.
  3. Adicionados três novos idiomas no MQL5.com: francês, italiano e turco.

    Já é o decimo primeiro idioma disponível na maior comunidade de traders - MQL5.community. Traduzimos completamente a interface e a documentação do site, bem como várias dezenas de tópicos importantes do fórum. A tradução de artigos e calendário econômico estará disponível em breve.

  4. Correções de crash-logs.

MQL5

  1. Corrigidos bugs que causavam problemas com a função StringConcatenate.
  2. Corrigida a configuração do valor _LastError ao usar a função FileSave. Em alguns casos, em vez de descrever o erro ocorrido na função, a variável acabava por conter um valor nulo.
  3. Corrigida a importação de dados desde recursos em matrizes de tipo double.
MetaTester
  1. Corrigido um erro que fazia com que a janela do gráfico travasse durante o teste visual.
Documentação atualizada.
14 outubro 2021
MetaTrader 5 build 3081: melhorias nos serviços MQL5 e design atualizado

Terminal

  1. Aprimorada navegação pelos serviços da MQL5.community.

    As subseções Mercado, Sinais e Hospedagem foram movidas da área de trabalho para o Navegador. Isso facilitará encontrar produtos, bem como gerenciar suas compras e assinaturas. Para cada serviço foi adicionada uma seção "Como funciona" com informações úteis sobre como usá-lo.


    Aprimorada navegação pelos serviços da MQL5.community


  2. Completamente atualizados ícones para todos os menus, barras de ferramentas e diálogos. Graças a eles, a interface do terminal e do MetaEditor se tornou mais fácil de entender:

    • Reduzido o número de detalhes pequenos que são difíceis de distinguir
    • Usadas menos cores, reduzindo o ruído de cor
    • Usados menos gradientes, melhorando a legibilidade
    • Usadas metáforas mais compreensíveis


    Na plataforma foram atualizados todos os menus, barras de ferramentas e diálogos


  3. Adicionada exibição de custos no histórico de negociação ao efetuar operações. Este recurso é usado por corretoras regulamentadas da NFA.


    O histórico da conta agora mostra os custos de transação


    Se sua corretora habilitar o cálculo da indicador correspondente, "Custos" aparecerá entre as colunas disponíveis no histórico de negociação. Essa medida mostra o custo da transação em relação ao preço médio do instrumento (mid-point spread cost).

  4. Adicionado suporte para a versão coreana do site MQL5.com.

    Já é o oitavo idioma disponível na MQL5.community. Traduzimos completamente a interface do site, artigos, calendário econômico, tópicos importantes do fórum. A tradução da documentação do MQL5 aparecerá em breve.

  5. Corrigido o carregamento de instrumentos de negociação personalizados. Em alguns casos, as configurações de símbolos recém-criados podiam substituir as configurações dos símbolos existentes.
  6. Corrigida a exibição do histórico de negociação de sinal no gráfico. Quando essa opção era habilitada, as operações eram marcadas no gráfico para todos os instrumentos de uma vez, e não apenas para o instrumento do gráfico.
  7. Adicionada exportação da coluna "Coletar" para o relatório do histórico de negociação. Anteriormente, esse indicador era exibido apenas no histórico, e não era salvo em um arquivo.
  8. Otimizada e acelerada significativamente a operação de painéis para negociação com um clique na Observação do Mercado e em gráficos.
  9. Corrigido o funcionamento do campo "Taxas de margem" para instrumentos de negociação customizados. Em alguns casos, os pontos de ajuste podiam ser redefinidos para zero.
  10. Continua o aprimoramento do serviço de assinaturas para corretoras. Corrigidos erros na janela de assinatura de cotações.
  11. Corrigida a exibição do objeto analítico "linha de tendência". Ele podia desaparecer ao dimensionar e redimensionar a janela do gráfico.
  12. Corrigida a exibição do objeto analítico "retângulo". Quando um dos pontos de ancoragem saía da área de visibilidade do gráfico, o objeto podia desaparecer.
  13. Corrigido e significativamente acelerado o trabalho dos bate-papos integrados da MQL5.community.
  14. Corrigido o arredondamento do parâmetro "Custo" na lista de posições abertas. Anteriormente, a parte fracionária do valor podia não ser mostrada.
  15. Corrigida a validação de telefones celulares durante a abertura de contas. Para algumas operadoras da China, o telefone era detectado como especificado incorretamente.
  16. Adicionado suporte para senhas com mais de 32 caracteres em contas MQL5.
  17. Corrigida a exportação de certificados ao trabalhar no Wine. Este recurso é usado para contas com autenticação estendida ao migrar de desktop para celular.
  18. Corrigido o funcionamento dos botões para alternar para serviços MQL5 localizados no painel inferior da janela "Ferramentas". Quando a janela era desencaixada, os botões ficavam inativos.
  19. Limitado o tamanho do menu "Arquivo \ Novo gráfico": não mais do que 128 submenus com grupos de símbolos e não mais do que 32 símbolos em cada submenu. Isso permite que você agilize o terminal e evite bloqueios ao adicionar um inúmeros instrumentos (2 000 e mais) à "Observação do mercado".

MQL5

  1. Continuamos a trabalhar o suporte para vetores e matrizes. As novas funções irão expandir significativamente as possibilidades para desenvolvedores de soluções baseadas em redes neurais.
  2. Adicionados os valores DEAL_SL e DEAL_TP à enumeração ENUM_DEAL_PROPERTY_DOUBLE - níveis de stop-loss e take-profit da operação de negociação.

    Para operações de entrada e reversão, essas propriedades são definidas de acordo com o valor de stop-loss/take-profit das ordens que desencadearam sua execução. Para operações de saída, são usados os valores de stop-loss/take-profit das devidas posições quando estas últimas são encerradas.

  3. Adicionado o valor MQL_HANDLES_USED à enumeração ENUM_MQL_INFO_INTEGER - o número de objetos de classes ativos (identificadores) em um programa MQL. São levados em conta objetos dinâmicos (criados por meio de novos) e não dinâmicos, variáveis globais/locais ou membros de classe. Quanto mais identificadores um programa usa, mais recursos ele consome.

  4. Adicionados novos métodos para trabalhar com a estrutura MqlCalendarValue que descreve um evento no calendário econômico:

    • HasActualValue(void) — retorna true se o valor real do evento estiver definido, caso contrário, false
    • HasForecastValue(void) — retorna true se o valor do evento de previsão estiver definido, caso contrário, false
    • HasPreviousValue(void) — retorna true se o valor do evento anterior estiver definido, caso contrário, false
    • HasRevisedValue(void) — retorna true se o valor revisado do evento estiver especificado, caso contrário, false
    • GetActualValue(void) — retorna o valor atual do evento (double) ou nan se não estiver definido
    • GetForecastValue(void) — retorna o valor de evento de previsão (double) ou nan se não estiver definido
    • GetPreviousValue(void) — retorna o valor do evento anterior (double) ou nan se não estiver definido
    • GetRevisedValue(void) — retorna o valor do evento revisado (double) ou nan se não estiver definido

  5. Corrigida a depuração de programas MQL5 usando bibliotecas na forma de arquivos EX5.
  6. Acelerada compilação de programas que contêm grandes matrizes inicializadas por uma sequência.
  7. Corrigido um bug na função CopyTicksRange que ocorria ao trabalhar com dados de instrumentos de negociação personalizados. Em alguns casos, a função retornava dados que não correspondiam ao período solicitado.
  8. Corrigida a verificação de presença dos parâmetros do modelo ao especializar por parâmetros. Em alguns casos, a compilação do código com modelos sob depuração causava o erro "code generation error".

Signals

  1. Adicionada a capacidade de renovar automaticamente a assinatura de Sinais.

    Agora você não precisa se preocupar com o término abrupto de sua assinatura. Quando o prazo expirar, o sistema o renovará automaticamente por mais um mês usando a mesma forma de pagamento usada na compra.


    Ative a renovação automática da assinatura de Sinal


    Se durante o pagamento foi selecionado um cartão, mas o pagamento para a renovação falhar, o sistema tentará usar o saldo de sua conta MQL5.

    Não se preocupe com alterar o preço da assinatura. Se o preço aumentar, não haverá renovação automática. Você será notificado sobre isso pelo e-mail especificado em sua conta MQL5.

    A renovação automática pode ser habilitada ou desabilitada a qualquer momento por meio da seção "Minhas assinaturas" em MQL5.com.


    Gerencie a renovação automática na seção &quot;Minhas assinaturas&quot; em MQL5.com


  2. Corrigidos erros na exibição do mostruário de sinais. Agora o sistema passará a considerar mais corretamente a compatibilidade dos sinais com a conta atual.

Market

  1. Adicionada pesquisa por nome e login do autor do produto no mostruário do Mercado. Anteriormente, a pesquisa só funcionava por nome e descrição de produto.

VPS

  1. Aprimorado sistema de renovação automática de assinatura de VPS.

    Anteriormente, você só podia pagar pela renovação automática com o saldo da sua conta MQL5. Dessa forma, para que a renovação fosse realizada, era necessário ter o saldo suficiente.

    Agora você não precisa se preocupar com o reabastecimento de conta em tempo hábil. Para renovação automática, o sistema usará o mesmo método de pagamento que você usou quando efetuou a assinatura pela primeira vez. Se você pagou a hospedagem com cartão e ativou a renovação automática, quando o período atual expirar, o sistema renovará a assinatura pelo mesmo valor, após debitar o devido valor do mesmo cartão. Se o pagamento com cartão falhar, o sistema tentará usar o saldo da sua conta MQL5 como antes.


    Agora você pode usar cartões e outros métodos de pagamento para renovação automática


    Com a nova função, você pode ter certeza de que sua assinatura não irá expirar, seus EAs continuarão a trabalhar e a cópia de sinais não será interrompida. Você não precisa verificar e carregar seu saldo manualmente.
    A função funciona apenas para novas assinaturas. Para as existentes, será utilizado o antigo esquema de renovação automática com pagamento através do saldo da conta MQL5.

Tester

  1. Corrigido um bug no teste visual. Em alguns casos, os indicadores usados no Expert Advisor não eram exibidos no gráfico.

MetaEditor

  1. Corrigida a transição para a declaração de função ou variável usando as teclas Alt+G. Se a declaração estava abaixo da linha de origem da chamada, a transição não era feita.
  2. Adicionada exibição de tipo de objeto para referências a objetos de classe no depurador.
  3. Adicionado suporte para exibir 'union' na lista de expressões observadas.

MetaTrader 5 iPhone/iPad, MetaTrader 5 Android

  1. Adicionada a exibição de caixa de diálogo de isenção de responsabilidade ao iniciar o aplicativo. Por favor, leia com atenção. Além disso, algumas corretoras podem criar contas de demonstração para você automaticamente ao iniciar o aplicativo pela primeira vez. Nesse caso, será exibida uma caixa de diálogo avisando sobre as regras.


    Adicionados alertas especiais no MetaTrader 5 para iPhone/iPad

  2. Adicionada a capacidade de conectar uma conta ao monitoramento no serviço "Sinais" diretamente do aplicativo móvel. Para fazer isso, selecione "Monitoramento de conta" no menu. Por conveniência, o número da conta e o nome da corretora são imediatamente colocados na janela de registro. Você só precisa especificar o nome do sinal e a senha do investidor.

    Ao conectar a conta ao monitoramento, você receberá estatísticas avançadas sobre sua negociação, poderá compartilhar os resultados com outros operadores, bem como vender sinais.

  3. Adicionado suporte para Huawei AppGallery e HMS Services para terminais móveis com sistema operacional Android. Os proprietários de smartphones Huawei poderão instalar o aplicativo desde sua loja e trabalhar com notificações push.

Documentação atualizada.

18 junho 2021
MetaTrader 5 build 2980: Notificações push sobre operações de negociação

Terminal

  1. Adicionada a possibilidade de receber notificações Push sobre operações a partir do servidor de negociação - funcionam mesmo quando o terminal está desligado.



    Anteriormente, você só podia receber notificações em dispositivos móveis a partir de seu próprio terminal desktop. Assim que uma operação comercial era realizada, o terminal enviava uma mensagem para a MetaQuotes ID especificada nas configurações. Consequentemente, isso só funcionava enquanto permanecia ligado. Agora não existem tais restrições. Se um Take Profit for acionado no servidor e seu computador estiver desligado, você receberá uma notificação sobre o fechamento da posição em seu dispositivo móvel.

    Para receber notificações do servidor, você deve:
    • Ter uma conta real, uma vez que as notificações vindas do servidor não funcionam para contas de demonstração
    • Instalar o terminal móvel MetaTrader 5 em seu smartphone para iOS ou Android
    • Abrir a seção de mensagens, encontrar sua MetaQuotes ID e especificá-la nas configurações do terminal desktop
    • Habilitar as notificações do servidor nas configurações do terminal desktop

    A disponibilidade e os detalhes das notificações dependem da sua corretora

    São suportados três tipos de notificações: sobre ordens, sobre operações e sobre operações de balanço. Se esta opção estiver ativada, os tipos de notificações disponíveis serão exibidos no log do terminal:
    '1222': subscribed to deals, orders, balance notifications from trade server

  2. Atualizamos o mostruário do VPS MetaTrader, tornando-o mais moderno e conveniente:
    • A interface se adapta a qualquer largura de tela.
    • O mostruário ocupa menos espaço em altura para caber sempre na janela de trabalho.
    • As informações necessárias aparecem apenas no momento em que são requeridas. Até que você tenha escolhido uma tarifa, não serão mostrados detalhes adicionais de pagamento.



  3. Comandos para mudança rápida para serviços MQL5 e a janela "Ferramentas" foram adicionados ao painel do Testador de Estratégia. Eles são exibidos apenas na seção "Visão Geral"; nas outras guias, o painel é usado para gerenciar os testes.



  4. Adicionado o estado salvo de janela para serviços MQL5. Se você deixar o Mercado aberto antes de desligar o terminal, irá encontrá-lo no mesmo estado na próxima vez que o ligar.
  5. Corrigida a sincronização periódica do estado de uma conta MQL5. Em alguns casos, o erro podia impedir a cópia de sinais.
  6. Corrigida a exibição de uma seleção de produtos recomendados no Mercado.
  7. Corrigido o funcionamento do menu de contexto de sinais no Navegador. Usando-o, você pode ir para ver o sinal ao qual você está inscrito, bem como cancelar a inscrição.

MQL5

  1. Corrigido erro no funcionamento do operador "-" durante a implementação de números complexos na biblioteca padrão (arquivo MQL5\Include\Math\Alglib\complex.mqh).
  2. Agora você pode usar qualquer expressão na inicialização de seqüências, não apenas constantes. Isto melhorará a usabilidade e a compatibilidade com o código C++.
    struct POINT
      {
       int x,y;
      };
    
    int GetYFunc(y)
      {
       return(y * y);
      }
    
    void SomeFunction(int x1,int x2,int y)
      {
       POINT pt={ x1+x2, GetYFunc(y) };
       ProcessPoint(pt);
      };
  3. Corrigido um erro que ocorria durante a compilação union ao manipular grandes quantidades de dados.
  4. Corrigida a operação da função StringToCharArray. Agora ela converte toda a string passada numa matriz Char, em vez de parar no primeiro caractere nulo de término.
  5. Adicionado controle sobre a presença explícita de uma chamada de construtor no código para classes/estruturas cuja a classe pai não tem um construtor padrão.

MetaEditor

  1. Adicionada exibição do local de chamada para funções inline no relatório do criador de perfil.
    No exemplo abaixo, a chamada de func(); agora é destacada:




    A função func em si não é destacada, pois seu código está completamente colocado em OnStart.

  2. Adicionada a capacidade de criar um projeto em branco. Isso será útil para o desenvolvimento fora do padrão com sua própria estrutura de arquivo, quando os modelos padrão não são adequados.



    Quando você cria um projeto desta forma, apenas um arquivo de configurações vazio "mqproj" é criado. Os arquivos para o código fonte devem ser criados por você mesmo depois.

  3. Acelerada a inicialização do MetaEditor.
  4. Corrigido um erro de exibição de dados na lista de expressões observadas durante a depuração. Em alguns casos, podia mostrar valores das variáveis de maneira incorreta.
  5. Corrigida a adição automática da extensão ".py" aos arquivos de scripts em Python criados usando o MQL Wizard.

Documentação atualizada.
21 maio 2021
MetaTrader 5 build 2940: Transferência dos mostruários dos Serviços MQL5 para o espaço de trabalho e atualização do design

Terminal

  1. Os serviços "Mercado", "Sinais" e "Hospedagem Virtual" foram transferidos para a área de trabalho principal da plataforma para um trabalho mais conveniente.
    Anteriormente, as seções para comprar serviços MQL5 estavam localizadas na janela "Ferramentas", onde apenas um pequeno espaço estava disponível. A área de trabalho principal, por outro lado, permite mostrar aos usuários mostruários completos, onde eles podem selecionar convenientemente os produtos desejados. Ao mesmo tempo, menos guias na caixa de ferramentas facilitarão trabalhar com outras funções da plataforma.



    Tentamos garantir que o acesso a serviços adicionais não dificulte as principais tarefas dos traders - negociação e análise de gráficos:
    • As guias de serviço estão localizadas no final, após todos os gráficos.
    • Se as janelas de serviço não forem necessárias, elas podem ser simplesmente fechadas. Você pode acessá-las facilmente através do "Navegador", da barra de ferramentas ou do menu "Serviços".

    Além da transferência, redesenhamos completamente os serviços. Tornaram-se mais leves e modernos. Os sinais agora contêm dados adicionais que antes estavam disponíveis apenas na vitrine do site MQL5.community: um diagrama de teia com as principais características, um indicador de confiabilidade e atividade, etc.



  2. Adicionado o suporte completo para endereços IPv6.
    O IPv4, que agora é usado em todas as redes, foi inventado há mais de 30 anos. Ele contém endereços IP de 32 bits e é representado como quatro números de 8 bits, separados por pontos. Isso permite ter mais de quatro bilhões de endereços IP exclusivos. No entanto, agora o número de dispositivos e sites em todo o mundo cresceu tanto que os endereços não são mais suficientes para todos os interessados.

    Nesse sentido, os produtos estão gradualmente migrando para o suporte paralelo a um protocolo mais moderno - IPv6. Ele contém um endereço de 128 bits e é representado como x:x:x:x:x:x:x:x, onde cada letra x é o valor hexadecimal dos seis elementos de 16 bits do endereço. Este formato permite obter 5 x 10 ^ 28 endereços exclusivos. Além do espaço de endereço significativamente maior, o protocolo tem várias outras vantagens sobre a versão anterior. Você pode ler sobre isso em artigos especializados.

    Mais importante ainda, a plataforma MetaTrader 5 agora está totalmente pronta para IPv6. Se sua corretora ou fornecedor o transferir para um novo esquema de trabalho, você não sentirá nenhuma mudança e continuará a negociar sem obstáculos.

  3. Continuamos a melhorar o gerenciador de tarefas apresentado no build 2815. Agora, para gráficos nos quais a depuração ou criação de perfil de programas MQL5 está em execução, há uma indicação explícita disso.



  4. Acelerada a inicialização da plataforma no Wine em computadores macOS e Linux. Realizamos uma otimização substancial do funcionamento - corrigimos erros:
    • Aprimorada exibição de menus, barras de ferramentas e caixas de diálogo.
    • Corrigidos erros na exibição das seções "Mercado", "Sinais" e "VPS". Em particular, corrigimos o carregamento de logotipos de produtos no mostruário do "Mercado".
    • Atualizado o pacote para fácil instalação do MetaTrader 5 em computadores macOS. Ele facilita a instalação da plataforma como um aplicativo normal.
      O pacote inclui componentes adicionais necessários para um trabalho mais estável e rápido. Aqueles que o usam são fortemente aconselhados a reinstalar o MetaTrader 5 a partir do link https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/MetaTrader5.pkg.zip
    Se você usar CrossOver, reinstale completamente o MetaTrader 5 nele para obter a versão de 64 bits mais recente da plataforma.

  5. Corrigida a operação do atalho de teclado "Ctrl+F9". Agora muda o foco para a guia de negociação em "Caixa de Ferramentas".

MQL5

  1. Continuamos abandonando tecnologias antigas, incluindo componentes de 32 bits:
    • Terminais de 32 bits não podem mais carregar programas a partir do "Mercado".
    • Terminais de 32 bits não podem usar o serviço de hospedagem.
    • No MetaEditor de 32 bits, a função de proteção adicional de arquivos via MQL5 Cloud Protector já não está mais disponível.
    • Os programas MQL5 compilados em versões muito antigas do MetaEditor (lançado há 5 anos ou mais) não serão executados na nova versão do terminal.

    O suporte para a versão de 32 bits da plataforma parou há um ano no build 2361. Recomendamos fortemente a atualização para a versão de 64 bits do MetaTrader 5 para usar todos os recursos da plataforma.
    Todos os vendedores que fizeram upload de versões de produtos de 32 bits no Mercado são fortemente aconselhados a recompilá-los no MetaEditor de 64 bits mais recente e carregar as versões atualizadas. Nas próximas versões, desabilitaremos completamente a capacidade de inicialização de programas MQL5 de 32 bits em terminais.

MQL5

  1. Adicionado suporte para trabalhar com números complexos.
    Adicionado novo tipo integrado "complex".
    struct complex
      {
       double             real;   // parte real
       double             imag;   // parte imaginária
      };
    O tipo "complex" pode ser passado por valor como um parâmetro para funções MQL5 (ao contrário de estruturas comuns, que são passadas apenas por referência). Para funções importadas a partir de DLLs, o tipo "complex" deve ser passado apenas por referência.

    O sufixo 'i' é usado para descrever constantes complexas:
    complex square(complex c)
      {
       return(c*c);
      }
      
    void OnStart()
      {
       Print(square(1+2i));  // como parâmetro é passada a constante
      }
    
    // será exibido "(-3,4)", que é uma representação de string para um número complexo
    Para números complexos, atualmente estão disponíveis apenas operações simples: =, +, -, *, /, +=, -=, *=, /=, ==, !=.

    No futuro, funções matemáticas adicionais serão adicionadas: obtenção do valor absoluto, seno, cosseno e muitos outros.

  2. Adicionado código de erro TRADE_RETCODE_HEDGE_PROHIBITED - abrir uma posição ou colocar uma ordem pendente é impossível, uma vez que posições sobrepostas são proibidas. Um erro é retornado ao tentar realizar uma operação de negociação se o hedge for proibido e se a conta do usuário já tiver uma posição ou ordem na direção oposta para o mesmo símbolo.

MetaEditor

  1. Corrigida a interrupção da depuração e criação de perfil no modo não visual.
  2. Corrigida a criação de perfil de indicadores baseados em dados reais. Em alguns casos, não podia iniciar.

VPS

  1. Corrigido bug de migração do ambiente para um VPS. Ele surgia quando um Expert Advisor portátil tinha um indicador na forma de recurso.

Sinais

  1. Corrigida a verificação do modo de negociação ao copiar sinais. A negociação de instrumentos pode ser limitada no lado da corretora: poderão vir a ser permitidas apenas posições longas, apenas posições curtas ou apenas posições fechadas. Anteriormente, para uma cópia bem-sucedida, o serviço exigia permissão total para negociar, caso contrário, a sincronização era interrompida. Símbolos com negociação parcialmente permitida agora também serão considerados "negociáveis". Os clientes das corretoras bolsistas poderão copiar sinais sem obstáculos.

Tester

  1. Corrigida a verificação da sessão de negociação durante o teste. Em alguns casos, as operações de negociação durante o teste podiam falhar com o erro "market closed", apesar do fato de serem parte da sessão de negociação.
Documentação atualizada.
2 abril 2021
MetaTrader 5 build 2875: Melhorias e correções

Terminal

  1. Corrigido um erro que fazia com que a atualização dos programas MQL5 padrão fossem copiados para a raiz do diretório de dados do terminal e não, para o subdiretório MQL5. Da mesma forma, os usuários podem encontrar Experts, Images, Include, etc.

    Ao atualizar para uma nova versão da plataforma, diretórios desnecessários serão excluídos automaticamente após verificação adicional.

Terminal

  1. Corrigido um erro que, em alguns casos, tornava impossível fazer login no chat da MQL5.community embutido no terminal.

Tester

  1. Corrigida a otimização de EAs via MQL5 Cloud Network. Em alguns casos, ela não podia ser inicializada.

MetaEditor

  1. Corrigidos erros e travamentos ao depurar e criar perfis de programas MQL5.

Documentação atualizada.
26 março 2021
MetaTrader 5 Build 2860: melhorias para Wine e expansão da integração com SQL

Terminal

  1. Adicionada a capacidade de ativar/desativar serviços adicionais da MQL5.community. Por exemplo, se você não está interessado em artigos sobre programação em MQL5 ou em copy-trading do serviço Sinais, você pode desativá-los para economizar recursos e espaço de trabalho do terminal.



    Todos os serviços são ativados por padrão.

  2. Realizada uma otimização grande do terminal para o Wine em computadores com macOS e Linux:
    • Agora as janelas de serviço desencaixadas (Navegador, Ferramentas) não podem ser arrastadas para fora do terminal. Anteriormente, em tais casos, os usuários podiam ter dificuldade para retornar as janelas para os limites do terminal.
    • Corrigido o redimensionamento do conteúdo da janela de serviço ao redimensionar a própria janela.
    • Corrigida a exibição de métricas de desempenho no Gerenciador de Tarefas.
    • Aprimorada exibição de ícones na barra de ferramentas.
    • Corrigido contador de mensagens não lidas no bate-papo.
    • Corrigida exibição dos comandos do sistema gráfico: Ocultar, Expandir, Fechar.
    • Corrigida a exibição do log.
    • Corrigida a exibição de dicas de ferramentas para gráficos.
    • Corrigido o funcionamento de comandos para impressão de gráficos.
    • Corrigida a exibição do menu superior ao usar temas de exibição no Linux.
    • Corrigida a pesquisa via GitHub, MSDN e Stack Overflow no MetaEditor.

    Recomendamos que todos os usuários façam upgrade para a última versão estável do Wine. Isso aumentará a velocidade e a confiabilidade da plataforma.
  3. Adicionado suporte para ordens "Market To Limit" ao negociar na Bolsa de Valores de Istambul (BORSA Istambul). Inicialmente, tal ordem é executada como uma ordem de mercado, mas se não houver liquidez suficiente, o restante é colocado no livro de ofertas na forma de uma ordem limitada com o preço da última transação.
  4. Corrigida a exibição do gráfico de volatilidade. Agora é plotado levando em consideração o prazo de validade selecionado no quadro de opções.
  5. Corrigida a adição de instrumentos de negociação à Observação do Mercado por meio da barra de pesquisa rápida. Quando havia um espaço no nome do instrumento, este não era adicionado à lista.




MQL5

  1. Expandidas as possibilidades para trabalhar com bancos de dados SQL. Agora você pode usar uma variedade de funções estatísticas e matemáticas em suas consultas.

    Funções estatísticas
    • mode — moda
    • median — mediana (50º percentil)
    • percentile_25 — 25ºpercentil
    • percentile_75 — 75º percentil
    • percentile_90 — 90º percentil
    • percentile_95 — 95º percentil
    • percentile_99 — 99º percentil
    • стандартное отклонение выборки
    • stddev или stddev_samp — desvio padrão da população
    • variance or var_samp — variância da amostra
    • var_pop — variação da população

    Funções matemáticas

    Exemplo
    select
      count(*) as book_count,
      cast(avg(parent) as integer) as mean,
      cast(median(parent) as integer) as median,
      mode(parent) as mode,
      percentile_90(parent) as p90,
      percentile_95(parent) as p95,
      percentile_99(parent) as p99
    from moz_bookmarks;
  2. Adicionados novos macros:
    • __COUNTER__ — em cada chamada é aumentado em 1. Contadores separados são mantidos quando usados em modelos e macros.
    • __RANDOM__ — gera um número ulong aleatório, é semelhante à função MathRand.

  3. Corrigida a operação de solicitações síncronas para o gráfico nos casos em que o símbolo do gráfico não existe. Agora, em vez de esperar indefinidamente pelo resultado, as funções retornarão um erro. Um evento de símbolo inexistente pode surgir ao alternar entre contas de negociação com um conjunto diferente de instrumentos de negociação disponíveis.
  4. Otimizado e acelerado significativamente o trabalho das funções CopyTicks *.

MetaEditor

  1. Alterado a ordem de perfilamento e depuração com base em dados históricos.

    A criação de perfil agora é sempre feita no modo não visual. A depuração também é realizada no modo não visual por padrão, mas você pode alterar isso manualmente nas configurações do MetaEditor:



  2. Adicionado recurso de criação de perfil de serviços. É realizado da mesma forma que para outros tipos de programas MQL5.
  3. Corrigida exibição de nomes de funções no relatório do criador de perfil. Em alguns casos, eles podiam ser especificados como <unknown>.

Documentação atualizada.
26 fevereiro 2021
MetaTrader 5 build 2815: Acesso ao livro de ofertas desde Python, melhorias no depurador e no criador de perfil

Terminal

  1. Adicionado um recurso para obter dados do livro de ofertas através do Python API.
    Três novos recursos permitem que obter dados de forma rápida e fácil para computação estatística e aprendizado de máquina usando um grande número de bibliotecas Python prontas.
    • market_book_add — assina do terminal MetaTrader 5 para receber eventos sobre mudanças no livro de ofertas para o símbolo especificado.
    • market_book_get — retorna uma tupla desde BookInfo contendo os registros do livro de ofertas para o símbolo especificado.
    • market_book_release — cancela a assinatura do terminal MetaTrader 5 para receber eventos sobre alterações no livro de ofertas para o símbolo especificado.

  2. O comprimento máximo das mensagens push foi aumentado de 256 para 1024 caracteres. Agora você pode enviar muitas mais informações sobre dispositivos móveis desde seus programas MQL5.
  3. Adicionada uma versão preliminar do "Gerenciador de Tarefas" chamado pressionando a tecla F2.
    O Gerenciador de Tarefas é um sistema de monitoramento dos recursos consumidos pela plataforma. Ele permite ver quanta memória consomem os gráficos, quantos recursos do processador são usados pelos EAs, etc. Se algo está diminuindo a velocidade de sua plataforma, você pode detectar e corrigir o problema facilmente.



  4. Aprimorado o serviço "Assinaturas". Para instrumentos de negociação cujos dados são transmitidos com atraso, foi adicionada uma indicação especial:
    • Os símbolos na "Observação do Mercado" são marcados com um ícone de relógio, uma dica de ferramenta exibe o valor do atraso
    • Nos gráficos é exibida uma notificação sobre o atraso dos dados



  5. Corrigida a exibição da lista de assinaturas se não houver conexão com a conta de negociação.
  6. Corrigido o trabalho de links em e-mails e notícias. Eles agora abrem no navegador padrão. Anteriormente, apenas o Internet Explorer era usado para fazer isso.
  7. Corrigidas as conexões desde a função WebRequest para hosts com endereços IPv6 e proteção Cloudflare.
  8. Aprimoradas funcionalidade e capacidade de resposta do Serviço VPS.
  9. Aprimorado o trabalho da plataforma com o Wine e MacOS/Crossover, incluindo versões para macOS Big Sur com processador M1.

MQL5

  1. Corrigido um erro na função ArrayPrint. Anteriormente, em alguns casos, a função não podia exibir a matriz.
  2. Otimizadas operações de arquivo realizadas usando funções File*. Agora, ler e gravar arquivos é muito mais rápido.
  3. Removida a restrição que exigia a especificação do tamanho da segunda, terceira e quarta dimensões de um array dinâmico quando ele era usado como um parâmetro de função. Isso aumentará a capacidade de reutilização e a flexibilidade do código.
    void func(int &arr[ ][ ][ ][ ])
      {
      }
  4.  Corrigido erro na função ArrayBsearch. Ao realizar uma pesquisa binária por um valor em um array classificado, a função pode retornar incorretamente o índice do elemento encontrado.

MetaEditor

  1. Continua o trabalho com a atualização global do depurador.
    • Ao exibir arrays na janela de observação, é levada em consideração sua classificação, especificada pela função ArraySetAsSeries.
    • Adicionado suporte para variáveis estáticas locais.
    • Corrigida a exibição do valor do elemento do array especificado.
    • Corrigido o processamento de campos estáticos de classes.
    • Muitas outras correções para uma depuração mais precisa e confiável.

  2. Adicionada a opção "Habilitar otimização ao criar perfis".
    Para aumentar a granularidade do relatório de criação de perfil, você pode desativar o modo de otimização de código. Sem otimização, a velocidade do código pode cair várias vezes, mas em troca você pode ver uma cobertura de código mais ampla. Ao usar, esteja ciente de que gargalos de código serão imprecisos.
    Se você precisar de um modo de criação de perfil mais suave, desative a opção "Usar inlining ao criar perfil".




    A capacidade de gerenciar a otimização de código também está nas configurações do projeto.
    • Se a otimização estiver desabilitada no projeto, a nova opção será ignorada - a otimização está sempre desabilitada para criação de perfil (incluindo inlining).
    • Se a otimização estiver habilitada no projeto, a nova opção será levada em consideração na compilação para a criação de perfil.

  3. Adicionado registro para depuração e criação de perfil. Na inicialização, os parâmetros do ambiente são exibidos no log, já no desligamento, as estatísticas sobre os dados coletados.
    MQL5 profiler    starting 'ExpertMACD.ex5' on history with parameters:
    MQL5 profiler       symbol: 'EURUSD'
    MQL5 profiler       period: 'H1'
    MQL5 profiler       date from: '2021.01.01'
    MQL5 profiler       date to: '2021.02.22'
    MQL5 profiler       ticks mode: 'every tick'
    MQL5 profiler       execution delay: 0 ms
    MQL5 profiler       deposit: 10000
    MQL5 profiler       currency: 'USD'
    MQL5 profiler       leverage: 1:100
    MQL5 profiler       profit in pips: NO
    MQL5 profiler    profile data received (4640 bytes)
    MQL5 profiler    758 total measurements, 0/0 errors, 470 kb of stack memory analyzed
    MQL5 profiler    7782 total function frames found (1929 mql5 code, 342 built-in, 1403 other, 4108 system)

Tester

  1. Corrigida a configuração de horário não comercial nas configurações de teste avançadas.
Documentação atualizada.
15 janeiro 2021
MetaTrader 5 build 2755: Janela de cotações e depurador melhorados

Terminal

  1. Modificada a janela de cotações que permite visualizar os preços dos instrumentos em telas de qualquer tamanho.

    Agora as informações podem ser exibidas em várias colunas, o que permite um uso mais otimizado do espaço da tela. Para mudar o modo de exibição, use a caixa de diálogo de propriedades da janela.


    Além disso, foram feitas uma série de pequenas melhorias:

    • Adicionado menu de seleção de coluna. Agora tem as mesmas propriedades do instrumento que na "Observação do mercado".
    • Otimizado o trabalho com um grande número de ferramentas. Agora a janela funciona igualmente bem com 10 e 1000 ferramentas.
    • Adicionada exibição de breves informações sobre a ferramenta na dica de ferramenta.
    • Corrigida a aplicação de configurações de cores para exibir preços altistas e baixistas.

  2. Adicionada a exibição de transações no gráfico de ticks do livro de ofertas sintético.

    O livro de ofertas sintético é usado para símbolos dos quais não são transmitidos os preços de Level 2. Nele os níveis são criados automaticamente, pois eles são formados a partir dos melhores Bid e Ask com uma etapa de alteração de preço. Agora, se com base no símbolo forem transmitidos os dados sobre o preço e o volume da última transação, você pode vê-los claramente no gráfico de tick. As informações são exibidas como círculos:
    • Círculos vermelhos — transações de venda.
    • Círculos azuis — transações de compra.
    • Círculos verdes — sentido da transação não definido.

    Quanto maior o tamanho do círculo, maior será o volume da transação.



  3. Corrigido o cálculo das "gregas" no quadro de opções. O erro ocorria quando o ativo base da opção tinha um preço zero para a última transação.
  4. Continua o trabalho com o novo serviço "Assinaturas", permitindo que você compre serviços adicionais para trading. Em particular, foi corrigida a exibição de assinaturas que dependem de outras assinaturas. Essas assinaturas são usadas para serviços agrupados.
  5. Aprimorado o funcionamento da plataforma para Wine.

MQL5

  1. Adicionada a geração de eventos do gráfico ChartEvent ao soltar os botões direito e do meio do mouse. Isso pode ser usado, por exemplo, ao criar painéis gráficos. Para que os eventos funcionem, você deve desativar o menu de contexto do gráfico usando a propriedade CHART_CONTEXT_MENU.
  2. Corrigido um bug que causava um erro significativo no tempo de espera na função Sleep.

MetaEditor

  1. Começamos a trabalhar com a atualização global do depurador. Em particular, foi significativamente melhorada a janela expressões observadas. Adicionada a capacidade de visualizar o conteúdo de arrays e objetos, bem como os valores de ponteiros na forma de listas suspensas.



    Para visualizar uma matriz ou objeto, clique duas vezes sobre ele na janela de observação.

  2. Corrigido travamento ao abrir alguns projetos.
Documentação atualizada.
26 novembro 2020
MetaTrader 5 build 2715: Melhorias gerais

Terminal

  1. Corrigida a falha da plataforma ao usar o quadro de opções. Isso podia acontecer quando o tamanho do tick era definido como zero nas configurações do instrumento de negociação.
  2. Corrigidos erros na exibição da interface em monitores HiDPI.

MQL5

  1. Corrigida a conversão de string atempadamente com ajuda da função StringToTime. O erro ocorria ao especificar a hora no formato "yyyymmdd [hhmiss]".
  2. Corrigido um erro no operador de cópia implícita para objetos contendo matrizes dinâmicas. Agora, ao copiar, o tamanho do objeto de destino é reduzido ao tamanho do objeto copiado.
    struct MyStruct
    {
      string Array[];
    };
    
    void OnStart()
    {
      MyStruct a1,a2;
      ArrayResize(a1.Array,3);
      ArrayResize(a2.Array,1);
      a1=a2;
    }
    Anteriormente, como resultado da chamada de tal função, a matriz "a1" tinha tamanho 3. Agora terá tamanho 1.

MetaTester

  1. Atualizado o algoritmo para calcular a classificação dos agentes de teste na rede de computação em nuvem MQL5 Cloud Network. A classificação será determinada com mais precisão e mudará menos com o tempo.

Documentação atualizada.
123456789101112131415