MetaTrader 4 Build 900: Modelos de Classes em MQL4 e Otimização do Uso de Memória

Última atualização da MetaTrader 4

22 outubro 2015

Terminal

  1. Corrigida a alteração da senha para uma conta inativa (sem conexão).




  2. Otimização do uso e liberação de memória quando se trabalha com grandes quantidades de dados históricos.
  3. Corrigido e otimizado o trabalho com um grande número de categorias de notícias.

Sinais

  1. Corrigido o cancelamento de sinais através do menu de contexto da janela do Navegador.



MQL4

  1. Implementado modelos que permitem criar classes parametrizadas como no C++. Isso permite uma maior capacidade de abstração e uso do mesmo código para trabalhar com objetos de diferentes classes de uma maneira uniforme. Um exemplo de uso:
    //+------------------------------------------------------------------+
    //|                                                    TemplTest.mq5 |
    //|                        Copyright 2015, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2015, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Declara uma classe template                                      |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArray
      {
    protected:
       T                 m_data[];
    
    public:
    
       bool              Append(T item)
         {
          int new_size=ArraySize(m_data)+1;
          int reserve =(new_size/2+15)&~15;
          //---
          if(ArrayResize(m_data,new_size,reserve)!=new_size)
             return(false);
          //---
          m_data[new_size-1]=item;
          return(true);
         }
       T                 operator[](int index)
         {
          static T invalid_index;
          //---
          if(index<0 || index>=ArraySize(m_data))
             return(invalid_index);
          //---
          return(m_data[index]);
         }   
      };
    //+------------------------------------------------------------------+
    //| Classe template do array de ponteiro. No processo de destruição, |
    //| exclui os objetos que são os ponteiros armazenados no array.     |
    //|                                                                  |
    //|  Por favor, note a herança do array da classe template           |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArrayPtr : public TArray<T *>
      {
    public:
       void             ~TArrayPtr()
         {
          for(int n=0,count=ArraySize(m_data);n<count;n++)
             if(CheckPointer(m_data[n])==POINTER_DYNAMIC)
                delete m_data[n];
         }
      };
    //+------------------------------------------------------------------------------+
    //| Declarar a classe. Ponteiros aos respectivos objetos são armazenados no array|
    //+------------------------------------------------------------------------------+
    class CFoo
      {
       int               m_x;
    public:
                         CFoo(int x):m_x(x) { }
       int               X(void) const { return(m_x); }
      };
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    TArray<int>     ExtIntArray;   // criar instância TArray (TArray especializada pelo tipo int)
    TArray<double>  ExtDblArray;   // criar instância TArray (TArray especializada pelo tipo double)
    TArrayPtr<CFoo> ExtPtrArray;   // criar instância TArrayPtr (TArrayPtr especializada pelo tipo CFoo)
    //+------------------------------------------------------------------+
    //| Função "Start" de Programa Script                                |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- preencher o array com dados
       for(int i=0;i<10;i++)
         {
          int integer=i+10;
          ExtIntArray.Append(integer);
          
          double dbl=i+20.0;
          ExtDblArray.Append(dbl);
          
          CFoo *ptr=new CFoo(i+30);
          ExtPtrArray.Append(ptr);
         }
    //--- Saída do conteúdo do array
       string str="Int:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtIntArray[i];      
       Print(str);   
       str="Dbl:";
       for(i=0;i<10;i++)
          str+=" "+DoubleToString(ExtDblArray[i],1);
       Print(str);   
       str="Ptr:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtPtrArray[i].X();      
       Print(str);
    //--- Objetos CFoo criados via nova versão não devem ser suprimidos, uma vez que eles são excluídos no objeto destructor TArrayPtr <CFoo>  
      }
    Resultado da execução:
    TemplTest EURUSD,M1: Ptr: 30 31 32 33 34 35 36 37 38 39
    TemplTest EURUSD,M1: Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
    TemplTest EURUSD,M1: Int: 10 11 12 13 14 15 16 17 18 19
  2. Corrigida a realocação de memória na função ArraycCpy, ocasionalmente poderia causar falhas de programas MQL4.

Testador

  1. Corrigido um erro que ocasionalmente causava nulidade das variáveis ​​declaradas a nível global depois de testado um indicador.
  2. Corrigido o teste quando a conexão com um servidor de negociação era perdido.

MetaEditor

  1. Corrigida a definição do nome de função no MetaAssist na presença de tipo "casting.'
  2. Corrigido a abertura de arquivos grandes.
  3. Implementado a tecla de atalho F para chamar a função de pesquisa da guia Base de Código, bem como várias dicas na barra de status para os comandos de trabalho com um código: aumentar/diminuir o recuo, navegação, deslocamento, etc.
Corrigidos erros relatados nos registros (logs) quebrados.