MetaTrader 4 build 970: abertura de contas demo simplificada e expansão das possibilidades MQL4

Última atualização da MetaTrader 4

3 junho 2016

Terminal

  1. Foi simplificada a janela de abertura da conta demo. Agora você não precisa de preencher um formulário extenso, basta indicar as informações básicas e selecionar as opções de negociação: o tipo de conta, depósito e alavancagem.




MQL4

  1. Foi alterado o formato dos arquivos executáveis EX4 devido ao acrescentamento de novas funcionalidades na linguagem MQL4. Todos os antigos programas EX4 estão compilados no MetaEditor dos anteriores builds, após a atualização funcionarão corretamente. Desse modo, a compatibilidade de baixo para cima foi preservada em sua totalidade.

    Ao mesmo tem, os programas EX4, compilados nos builds 970 e superior, não funcionarão nos terminais dos antigos builds devido à ausência de compatibilidade no sentido oposto.

  2. Foi adicionado o suporte para classes abstratas e funções virtuais puras.

    As classes abstratas são projetadas para criar entidades generalizadas, em cujas bases se supõe que serão criadas classes derivadas mais específicas. Uma classe abstrata é uma classe que pode ser usada apenas como uma classe base para outra classe, por isso é impossível criar um objeto do tipo de classe abstrata.

    Uma classe, que contenha pelo menos uma função meramente virtual, é abstrata. Portanto, as classes derivadas a partir da classe abstrata devem implementar todas suas funções virtuais puras, caso contrário também serão classes abstratas.

    Uma função virtual é considerada "pura" usando a sintaxe de um especificador de pureza. Por exemplo, consideremos a classe CAnimal que é criada apenas para fornecer funções comuns, dito de outro modo, os próprios objetos do tipo CAnimal têm um caráter demasiado amplo para uma aplicação prática. Assim, a classe CAnimal é uma boa candidata para uma classe abstrata:
    class CAnimal
      {
    public:
                          CAnimal();     // construtor
       virtual void       Sound() = 0;   // função virtual pura
    private:
       double             m_legs_count;  // número de patas do animal
      };
    
    Aqui a função Sound() é virtual pura, porque está declarada pelo especificador da função virtual PURE (=0).

    São funções virtuais puras apenas as funções virtuais para as quais é indicado o especificador de pureza PURE, e precisamente: (=NULL) ou (=0). Exemplo de declaração e uso de uma classe abstrata:
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // PURE method, deve ser redefinido no descendente, a mesma classe CAnimal tornou-se abstrata e não pode ser criada
      };
    //--- descendente a partir da classe abstrata
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // PURE redefinido, a classe CCat não é abstrata e pode ser criada
     };
    
    //--- exemplos de utilização incorreta
    new CAnimal;         // erro 'CAnimal' - o compilador emitirá o erro "cannot instantiate abstract class"
    CAnimal some_animal; // erro 'CAnimal' - o compilador emitirá o erro "cannot instantiate abstract class"
    
    //--- exemplos de utilização correta
    new CCat;  // não há erro - a classe CCat não é abstrata
    CCat cat;  // não há erros - a classe CCat não é abstrata
    
    Restrições sobre o uso de classes abstratas
    Quando o construtor chamar uma classe abstrata da função virtual pura (direta ou indiretamente) o resultado será indefinido.
    //+------------------------------------------------------------------+
    //| Classe básica abstrata                                           |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- função virtual pura
       virtual void      Sound(void)=NULL;
       //--- função
       void              CallSound(void) { Sound(); }
       //--- construtor
       CAnimal()
        {
         //--- chamada direta do método virtual
         Sound();
         //--- chamada indireta (através de una terceira função)
         CallSound();
         //--- no construtor e/ou destrutor sempre são chamadas suas funções,
         //--- apesar do caráter virtual e da redefinição da função da chamada no descendente
         //--- se a função chamada for virtual pura, então,
         //--- a chamada provocará um erro crítico de execução: "pure virtual function call"
        }
      };
    
    No entanto, os construtores e destruidores de classes abstratas podem chamar outras funções membro.

  3. Para facilitar a organização de modelos de eventos, foi adicionado o suporte de indicadores para funções.

    Para declarar um indicador para uma função, defina o tipo "indicador para função", por exemplo:
    typedef int (*TFunc)(int,int);
    Agora TFunc é um tipo e é possível declarar o indicador mutável para a função:
    TFunc func_ptr;
    Na mutável func_ptr é possível armazenar o endereço da função para, no futuro, a chamar:
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           // erro: neg não tem tipo  int (int,int)
    Print(func_ptr(10));    // erro: deve ter dois parâmetros
    
    Indicadores para funções podem ser armazenados e transferidos como um parâmetro. É impossível obter um indicador para um método não estático de uma classe.

  4. Na numeração das propriedades do terminal de cliente ENUM_TERMINAL_INFO_INTEGER foi adicionado o valor TERMINAL_SCREEN_DPI — resolução da informação na tela que está definida pelo número de pontos por polegada linear na superfície (DPI). Ao conhecer esse parâmetro, você pode especificar as dimensões dos objetos gráficos para que eles que sejam iguais em monitores com resolução diferente.
  5. Na enumeração das propriedades ENUM_TERMINAL_INFO_INTEGER foi adicionado o valor TERMINAL_PING_LAST — último valor conhecido de um ping até ao servidor em microssegundos. Em um segundo há um milhão de microssegundos.
  6. Nos indicadores personalizados, os buffers DRAW_NONE (sem construção gráfica) agora não participam nos cálculos do mínimo e máximo da janela do gráfico.
  7. Foi corrigida a formação de eventos, ao mover o mouse e pressionar os botões dele sobre os objetos do tipo OBJ_LABEL e OBJ_TEXT. Anteriormente, quando se encontravam nas bordas de outros objetos do tipo OBJ_RECTANGLE_LABEL, OBJ_RECTANGLE, os eventos formavam-se incorretamente.
  8. Nos indicadores personalizados, foi corregido o desenho das barras do histograma de altura zero. Anteriormente, essas barras não se desenhavam, agora elas são desenhadas com uma altura de 1 pixel.

Signals

  1. Foram corrigido os erros de pesquisa de instrumentos de negociação, ao comparar as ferramentas de negociação disponíveis da fonte do sinal e o assinante.

Tester

  1. Foi corrigida a implementação do spread no arquivo fxt, caso nas configurações de teste for utilizado o spread atual.

Market

  1. Foram corrigidos vários erros de exibição no mostruário do Mercado.

MetaEditor

  1. Foi corrigida a pesquisa de palavra por arquivo no modo "Apenas palavra inteira".
  2. Foi adicionada a possibilidade de ir até ao arquivo através de um duplo clique nos resultados da compilação do arquivo respectivo.
  3. Foi corrigida a exibição de alguns elementos de gerenciamento no Windows XP.

Correções de crash-logs.