O que há de novo no MetaTrader 5?

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

20 dezembro 2017
MetaTrader 5 build 1730: projetos no MetaEditor e instrumentos sintéticos

Fim do suporte a versões antigas dos terminais!

Na nova versão da plataforma será descontinuado o suporte a terminais desktop e móveis das versões mais antigas:

  • Terminal do cliente: versões inferiores à 730 de 23 de setembro 2012
  • Terminal móvel para iPhone: versões inferiores à 1171 de 11 de novembro de 2015
  • Terminal móvel para Android: versões inferiores à 1334 de 5 agosto de 2016
Não será possível conectar esses terminais aos servidores de novas versões. Recomendamos que você atualize antes seus terminais.

Modificado o protocolo de trabalho com o MQL5 Storage

Para dar suporte a novos projetos de grupo, foi modificado o protocolo de trabalho com o armazenamento online MQL5 Storage. Infelizmente, após a atualização para uma nova versão da plataforma, você terá que re-extrair todos os dados a partir do repositório. Os dados armazenados nele não serão nem afetados nem perdidos.

Antes de atualizar para uma nova versão da plataforma, recomendamos que você envie todas as alterações locais para o repositório (executar Commit).

Terminal

  1. Adicionado recurso para criar instrumentos financeiros sintéticos, isto é, instrumentos com base em um ou mais dos que temos disponíveis. Basta especificar a fórmula para calcular as cotações, e a plataforma em tempo real gera os ticks do instrumento sintético, bem como cria seu histórico de minuto.

    Como isso acontece?
    • Você cria um instrumento sintético, especificando uma fórmula para ele.
    • A plataforma contará seus ticks a uma frequência de 10 vezes por segundo (só se o preço de pelo menos um dos instrumentos incluídos na fórmula mudar).
    • A plataforma computa o histórico de barras de minutos - durante os últimos dois meses - com base nas barras de minutos dos instrumentos incluídos na fórmula. Todas as barras novas (atuais e ulteriores) serão construídas em tempo real com base nos ticks gerados do instrumento sintético.

    Por exemplo, você pode criar uma ferramenta que mostrará o índice do dólar (USDX). Sua fórmula é a seguinte:

    50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)

    Nota: na fórmula original do índice do dólar, são usados os pares USDEUR e USDGBP. Como na plataforma há apenas pares invertidos, na fórmula do instrumento sintético para eles é usada uma potência negativa e o preço Ask, em vez do Bid.

    A plataforma calculará em tempo real o preço do novo instrumento com base nas cotações de outros seis instrumentos diferentes fornecidos pela sua corretora. Na Observação do mercado e no gráfico, você pode ver como se altera seu preço:




    Crie um novo instrumento personalizado, abra sua especificação e insira a fórmula:




    Por conveniência, o editor de fórmulas exibe uma lista de opções enquanto você digita os nomes dos instrumentos e funções.

    Cálculo de ticks e de barras de minuto do instrumento sintético começará quando ele é adicionado à "Observação do mercado". Além disso, todos os símbolos necessários para seu cálculo são adicionados automaticamente à "Observação do mercado". Ao diário da plataforma será adicionado o registro sobre o início do cálculo: Synthetic Symbol USDX: processing started.
    • Cálculo do instrumento sintético é interrompido quando ele é oculto na "Observação do mercado".
    • Os símbolos que estão sendo utilizados para o cálculo dos instrumentos sintéticos não podem ser ocultos da "Observação do mercado".

    Cálculo de cotações em tempo real
    A cada 100 ms (dez vezes por segundo) é verificado se o preço de pelo menos um dos instrumentos envolvidos na fórmula mudou. Se assim for, ocorrerá o cálculo do preço do instrumento sintético e será gerado um tick. O cálculo é realizado paralelamente em três fluxos para os preços Bid, Ask e Last. Por exemplo, se, na fórmula, for especificado EURUSD*GBPUSD, o cálculo do instrumento sintético será como se segue:

    • Bid - bid(EURUSD)*bid(GBPUSD)
    • Ask - ask(EURUSD)*ask(GBPUSD)
    • Last - last(EURUSD)*last(GBPUSD)

    A presença de alterações é verificada para cada preço separadamente. Por exemplo, como, durante o cálculo, no instrumento-fonte só foi o preço Bid que se alterou, então, para o tick do instrumento sintético foi calculado apenas o preço onde houve mudanças.

    Traçado do histórico de barras de minuto
    Além da coleta de ticks em tempo real, a plataforma cria um histórico de minuto para o instrumento sintético. Assim, o trader pode, da mesma maneira como o faria com instrumentos convencionais, ver seus gráficos, realizar a análise técnica usando os objetos e indicadores.

    Assim que o trader adiciona um instrumento sintético à Observação do mercado, a plataforma verifica se exite algum histórico de minuto reservado para ele. Se não for assim, ele será criado para os últimos 60 dias, o que é cerca de 50 000 barras. Se, nas configurações da plataforma, no parâmetro "Máx. de barras na janela", for definido um valor menor, será usada essa restrição.

    Quando uma parte das barras em este período já está construída, a plataforma criar as que estão em falta. É só quando se tenta consultar o período correspondente no gráfico que se cria um histórico mais em profundidade, caso esse período for rolado para cima ou consultado a partir de programas em linguagem MQL5).

    O histórico de barras de minuto, do instrumento sintético, é calculado com base nas barras de minuto (e não de ticks) dos instrumentos incluídos na fórmula. Por exemplo, para calcular o preço Open da barra de minuto do instrumento sintético, a plataforma toma os preços Open dos instrumentos incluídos na fórmula. Da mesma forma, é realizado o cálculo para os preços High, Low e Close.

    Se qualquer um dos instrumentos da fórmula não tiver a barra de minuto necessária, a plataforma será obrigada a calcular usando o preço Close da barra anterior. Vamos supor que estamos usando três instrumentos: EURUSD, USDJPY e GBPUSD. Se não for encontrada a barra correspondente ao minuto 12:00 durante seu cálculo, serão usados os seguintes preços:

    • Para Open - EURUSD Open 12:00, USDJPY Close 11:59, GBPUSD Open 12:00
    • Para High - EURUSD High 12:00, USDJPY Close 11:59, GBPUSD High 12:00
    • Para Low - EURUSD Low 12:00, USDJPY Close 11:59, GBPUSD Low 12:00
    • Para Close - EURUSD Close 12:00, USDJPY Close 11:59, GBPUSD Close 12:00

    Se nenhum dos instrumentos da fórmula tiver certa barra de minuto, a barra correspondente no instrumento sintético também não não será calculada.

    Traçado de novas barras de minuto
    Todas as barras novas (atuais e ulteriores) do instrumento sintético são construídas com base nos ticks gerados. O preço segundo o qual são construídas as barras depende do parâmetro "Plotagem de gráficos" na especificação:



    Operações a serem usadas na fórmula do instrumento
    Na fórmula, podem-se usar dados de preços, bem como algumas propriedades dos símbolos (fornecidas pela corretora). Para fazer isso, insira:

    • Nome do símbolo - dependendo de qual o preço do instrumento sintético é calculado, na fórmula será usado o preço Bid, Ask ou Last do instrumento especificado. Por exemplo, especificado EURUSD*GBPUSD, o Вid é calculado como bid(EURUSD)*bid(GBPUSD), enquanto o preço Ask - como ask(EURUSD)*ask(GBPUSD).
    • bid(nome do símbolo) - para o cálculo do preço Bid do instrumento sintético será usado - incondicionalmente - o preço Bid do símbolo especificado. Na verdade, esta variação coincide com a anterior (sem especificar o tipo de preço).
    • ask(nome do símbolo) - para o cálculo do preço Bid do instrumento sintético será usado - incondicionalmente - o preço Ask do símbolo especificado. Para o cálculo do preço Ask será usado o preço Bid do instrumento especificado. Para o cálculo do preço Last será usado o preço Last do instrumento especificado. Por exemplo, se você especificar ask(EURUSD)*GBPUSD, o cálculo é o seguinte:
      • Вid = ask(EURUSD)*bid(GBPUSD)
      • Ask = bid(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • last(nome do símbolo) - preço Last do símbolo especificado será usado durante o cálculo de todos os preços do instrumento sintético (Bid, Ask e Last). Por exemplo, se você definir last(EURUSD)*GBPUSD, o cálculo é o seguinte:
      • Вid = last(EURUSD)*bid(GBPUSD)
      • Ask = last(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • volume(nome do símbolo) - na fórmula será usado o volume do tick do instrumento especificado. Verifique que as informações dos volumes são transmitidas para o instrumento especificado.
    • point(nome do símbolo) - na fórmula será colocado em seu lugar o tamanho da alteração mínima do preço do instrumento especificado.
    • digits(nome do símbolo) - na fórmula será colocado em seu lugar o número de casas decimais no preço do instrumento especificado.

    Se o personagem tem um nome complexo (contendo hífens, pontos, etc.), deve estar entre aspas. Por exemplo, "RTS-6.17".
    Na fórmula, pode-se utilizar operações aritméticas tais como a adição (+), a subtração (-), multiplicação (*), divisão (/) e o resto da divisão (%). Por exemplo, EURUSD+GBPUSD indica que o preço é calculado como a soma dos preços EURUSD e GBPUSD. Também na fórmula pode ser usado o menos unário para alterar o sinal, por exemplo: -10*EURUSD.

    É dada prioridade à execução de operações aritméticas:

    • As operações de multiplicação, divisão e resto da divisão são executadas primeiro, logo, a adição e a subtração.
    • Operações são realizadas da esquerda para a direita. Se, na fórmula, forem utilizadas várias operações com a mesma prioridade (por exemplo, multiplicação e divisão), a primeira operação realizada é a do lado esquerdo.
    • Para alterar a prioridade das operações, pode-se usar parênteses (e). As expressões entre parênteses têm a maior prioridade durante o cálculo. Para elas também se aplica o princípio da esquerda para a direita, isto é, primeiro, são avaliadas as expressões entre parênteses, mais à esquerda, na fórmula.

    Além disso, na fórmula, é possível usar as constantes:

    • Numéricas (inteiros e reais com ponto). Por exemplo, EURUSD*2+GBPUSD*0.7.
    • Propriedades do símbolo _Digits e _Point. Eles adicionam à fórmula as propriedades do símbolo personalizado a partir da especificação. _Digits é o número de dígitos após o ponto decimal no preço do instrumento, _Point é o tamanho da variação mínima no preço do instrumento.

    Além disso, na fórmula é possível utilizar todas as funções matemáticas habilitadas para linguagem MQL5, exceto MathSrand, MathRand e MathIsValidNumber: Para todas as funções apenas são usados nomes curtos: fabs(), acos(), asin(), etc.

  2. Adicionado o recurso que permite adicionar cotações para instrumentos personalizados em tempo real. Agora, em MQL5, pode-se programar um expert que adiciona quaisquer cotações de acordo com o instrumento personalizado definido. Para fazer isso, usa-se a nova função CustomTicksAdd.
    int  CustomTicksAdd(
       const string           symbol,       // nome do símbolo
       const MqlTick&         ticks[]       // matriz com dados de ticks que é necessário aplicar ao instrumento personalizado
       );
    A função CustomTicksAdd permite enviar ticks, como se viessem do servidor da corretora. Os dados não são gravados diretamente no banco de ticks, em vez disso, são enviados para a janela "Observação do mercado". Em seguida, a partir dela, o terminal armazena ticks em seu banco de dados. Quando o volume de dados enviados numa única chamada é muito grande, a função muda o seu comportamento para economizar recursos. Ao carregar mais de 256 ticks, os dados são divididos em duas partes. A primeira parte (a maior) é imediatamente gravada no banco de ticks (como o faz CustomTicksReplace). A segunda parte, que consiste nos últimos 128 ticks, é enviada através da janela "Observação do mercado" e, em seguida, é armazenada na base do terminal.

  3. Adicionada a exibição de preços High e Low na Observação do mercado. Por padrão, essas colunas estão desabilitadas. Elas podem ser ativadas através do menu de contexto:




    Para instrumentos cujos gráficos são construídos nos preços Bid (indicado na especificação) são mostrados os preços Bid High e Bid Low. Para instrumentos cujos gráficos são construídos nos preços Last são mostrados os preços Last High e Last Low.
    Juntamente com as colunas High/Low é ativada automaticamente a coluna Last, se, na Observação do mercado, há pelo menos um instrumento cujos gráficos são construídos nos preços Last.

  4. Adicionado recurso para editar o histórico de ticks de instrumentos financeiros personalizados. Clique em "Símbolos" no menu de contexto da Observação do mercado, selecione o instrumento personalizado e solicite o intervalo de dados necessário na guia "Ticks".

    • Para alterar o valor, clique duas vezes sobre ele.
    • Para adicionar ou apagar entradas, use o menu de contexto.
    • Para excluir várias barras/ticks, selecione-os com o mouse, mantenha pressionada a tecla Shift ou Ctrl+Shift.


    Por conveniência, as entradas modificadas são destacadas:

    • fundo verde — entrada alterada
    • fundo cinza — entrada excluída
    • fundo amarelo — entrada adicionada

    Para salvar as alterações, clique em "Aplicar alterações" na parte inferior da janela.

  5. Adicionada a exibição de contas prévias na árvore do Navegador.

    Traders podem enviar a corretoras pedidos para abrir contas reais diretamente a partir de terminais desktop. Para fazer isso, basta preencher um formulário simples com informações de contato, como ao abrir uma conta de demonstração. Após isso, para o trader, é criada uma conta prévia especial. Em seguida, a corretora entre em contato com o trader para formalizar relacionamento com o cliente e transformá-la em conta real.




  6. Adicionada a exibição do tempo em milissegundos na Janela de cotações:




  7. Rastreamento mais rápido de servidores disponíveis na caixa de diálogo da nova conta.
  8. Corrigida a exibição do objeto gráfico "Linha de tendência" com as opções "Raio para esquerda" e "Raio para a direita" ativadas.
  9. Otimizado o trabalho com muitas mensagens no correio interno (centenas de milhares).
  10. Otimizado o funcionamento do terminal com muitos instrumentos financeiros (50 mil ou mais).
  11. Adicionado recurso para otimização do histórico de ticks de instrumentos personalizados realizada após a edição do histórico.

MetaEditor

  1. Projetos com recursos completos estão agora disponíveis no MetaEditor. O processo de desenvolvimento de programas se tornou muito mais conveniente.

    Agora o arquivo de programa principal MQ5 não é apresentado como projeto. O projeto é um arquivo separado "MQPROJ", em que são armazenadas as configurações do programa, os parâmetros de compilação e informações sobre todos os arquivos utilizados. O acesso às principais configurações do projeto é organizado através de uma caixa de diálogo separada, não há mais necessidade de especificá-las no código fonte através de #property.

    Para o trabalhar facilmente com o projeto, existe uma guia separada no Navegador. Ela mostra todos os arquivos usados por categorias: incluídos, de recurso, de cabeçalhos, etc. Além disso, os arquivos são adicionados ao navegador do projeto automaticamente. Por exemplo, se você habilitar um novo arquivo MQH no código, ele será exibido automaticamente na seção "Dependencies" do navegador.
    Ao mesmo tempo, nós tornamos possível trabalhar com novos projetos no repositório online MQL5 Storage. Agora, o desenvolvimento de grandes projetos pode ser realizado conjuntamente com outros participantes da MQL5.community.

    Para trabalhar com projetos em grupo, foi adicionada a nova seção Shared Projects. O projeto criado nesta seção é imediatamente enviado para o repositório: você pode distribuir rapidamente permissões de acesso a ele a outros participantes e começar o desenvolvimento conjunto.




    Quando você compila o projeto no Shared Project, o executável EX5 é automaticamente copiado no catálogo local Experts, Indicators ou Scripts, dependendo do tipo de programa. Você pode imediatamente executar o programa dentro do gráfico, sem ter que copiar os arquivos manualmente de cada vez.


    Alterações no trabalho com o repositório MQL5 Storage

    Para uma experiência completa com projetos em grupo, foi refeito o protocolo de trabalho com o repositório MQL5 Storage. Infelizmente, após a atualização para uma nova versão da plataforma, você terá que re-extrair todos os dados a partir do repositório. Os dados armazenados nele não serão nem afetados nem perdidos.

    Antes de atualizar para uma nova versão da plataforma, recomendamos que você envie todas as alterações locais para o repositório (executar Commit).

    Agora o comando "Extrair dados do repositório" (Checkout from Storage) está indisponível. Para extrair dados, são usados os comandos "Ativar MQL5 Storage" e "Obter arquivo do repositório":

    • Se, na cópia atual do MetaEditor, você ainda não tiver usado o repositório, clique no botão "Ativar MQL5 Storage" no menu contextual da janela "Navegador". Todos os diretórios e arquivos em seu repositório serão transferidos para um computador local.
    • Se você já estiver trabalhando com o repositório, para extrair dados, clique em "Obter arquivos do repositório" no menu contextual do elemento raiz MQL5 na janela "Navegador".

    Novos projetos: exemplo de criação e detalhes de trabalho

    Ao MetaEditor foi adicionado o projeto. Trata-se de um arquivo com extensão mqproj, em que são armazenadas as propriedades gerais do programa, bem como informações sobre todos os arquivo utilizados. Agora é possível gerenciar facilmente as propriedades do programa numa caixa de diálogo separada do MetaEditor, em vez de alterá-las manualmente no código-fonte (diretiva #property).

    Se você já tiver um projeto, a maneira mais fácil de experimentar novos projetos é usar o comando "Novo projeto a partir do arquivo-fonte."




    No diretório em que o arquivo selecionado está localizado, será criado um novo arquivo de projeto com o mesmo nome e a extensão mqproj. As principais propriedades do programa especificadas no código-fonte via #property serão automaticamente adicionadas ao projeto, incluindo o nome, direitos de autor, versão, link para o site e programa de descrição do desenvolvedor.

    Ao conjunto de propriedades do programa no arquivo de projeto é dada uma prioridade mais elevada do que às propriedades especificadas no código do programa. Se propriedades são especificadas tanto no projeto quanto no arquivo de origem, serão usadas as propriedades do projeto.




    Foram adicionadas duas novas opções para compilar programas MQL5:

    • Ativar otimização adicional: aplicativo com otimização desativada são compilados mais rápido, mas trabalham mais devagar.
    • Verificar separadores de ponto flutuante: aplicativos com teste desativado correm ligeiramente mais rápido, porque a divisão por zero não é verificada durante a execução do código.

    Para trabalhar com o projeto, use a guia separada "Projeto" na janela "Navegador". Todos os arquivos usados no projeto são exibidos nesta guia convenientemente. Quando um projeto é gerado a partir de um arquivo de origem, todos os arquivos anexados (especificados usando a diretiva #include no arquivo MQ5 principal e em todos os arquivos incluídos no mesmo) são automaticamente adicionados à seção "Dependencies".

    Quando você adiciona novos arquivos no código fonte, eles também aparecerão no Navegador do projeto. Os arquivos de cabeçalho usados serão adicionados à seção Headers, enquanto as imagens, sons e outros programas MQL5 são adicionados ao projeto como recursos na seção Resources. Na seção Sources, são exibidos os arquivos MQ5 com código-fonte. Na seção Settings and files, pode-se adicionar outros arquivo, por exemplo, configurações de teste e modelos de gráficos.

    Para adicionar arquivos existentes a um projeto ou para excluir os arquivos a partir dele, use os comandos do menu contextual. Tenha cuidado ao excluir, pois você pode estar removendo um arquivo de projeto (remover a ligação) ou completamente excluí-lo do disco rígido:




    Criar um novo projeto é tão facilmente como a criação de um programa MQL5 convencional. Clique em "Novo projeto", selecione o tipo de programa e especifique suas propriedades (nome, manipuladores de eventos, etc.) no Assistente MQL5, no modo normal.

    Para obter um arquivo executável EX5, você pode abrir um projeto e pressionar F7 (o comando de compilação) ou abrir o arquivo MQ5 principal do programa e compilá-lo.


    Projetos em grupo no MQL5 Storage: detalhes de trabalho

    Projetos em grupo são gerenciados a partir da seção Shared Projects. Se você não tiver conectado o repositório ainda, execute o comando Activate MQL5 Storage no menu de contexto desta pasta. MetaEditor verificará se o seu armazenamento contém dados armazenados e se existem quaisquer projetos disponíveis para você. Os dados existente serão recuperados do seu repositório e carregados na seu computador (Checkout). Os projetos em grupo serão exibidos na seção Shared Project, para extrai-los clique em "Extrair arquivos do repositório" no menu contextual.

    Para criar um novo projeto grupal, selecione a pasta Shared Projects e clique em "Novo projeto":




    Em seguida, complete as etapas do Assistente MQL5: defina o tipo, nome e propriedades do futuro programa. Para projetos em grupo, escolha nomes claros e compreensíveis, para que os outros participantes possam encontrá-los facilmente. Nos nomes dos projetos só podem ser usadas letras latinas sem espaços.

    Imediatamente após a criação do projeto, ele é automaticamente adicionado ao repositório MQL5 Storage. Os arquivos usados pela biblioteca padrão no repositório não são adicionados, você pode adicioná-los manualmente, se necessário.

    Para permitir outros participantes trabalharem com o projeto, abra suas propriedades. Você pode, especificando o login da MQL5.community, conceder permissões a usuários, bem como estabelecer os parâmetros gerais do trabalho em grupo:

    • Projeto privado
    • Livre para se juntar ao projeto
    • Participação no projeto a pedido




    A fim de facilitar o trabalho, ao compilar o projeto grupal, o executável final (EX5) é copiado automaticamente na pasta Experts, Indicators ou Scripts, dependendo do tipo de programa. Assim, você pode executar imediatamente o programa no terminal, sem ter que copiá-lo manualmente no diretório desejado.


    Projetos públicos no MQL5 Storage: participação no desenvolvimento

    Como mencionado acima, cada projeto em grupo, na MQL5 Storage, tem configurações de disponibilidade ao público: o projeto pode ser privado ou aberto à participação de outros usuários. Agora, todos os projetos com participação livre são exibidos na guia separada "Projetos públicos".

    Todo mundo pode encontrar um projeto interessante e participar em seu desenvolvimento. Basta pressionar "Ingressar" e, em seguida, receber o projeto a partir do repositório.




    Após ingressar, cada usuário recebe o direito apenas de visualizar o projeto. A fim de obter os direitos para enviar suas próprias alterações ao repositório, entre em contato com o autor do projeto. Para saber seu login, abra as propriedades do projeto no menu de contexto.

  2. Adicionada a capacidade de inserir facilmente diferentes propriedades e recursos no código do programa. Por exemplo, você pode adicionar rapidamente no código um arquivo. Selecione o comando "Inserir - MQH como #incude", e, em seguida, escolha o arquivo a ser incluído na janela que se abre. Após isso, ao código de programa é adicionada a diretiva #include com o caminho apropriado para o arquivo selecionado.




    O mesmo menu do código do programa permite a adição de arquivos como uma matriz binária ou de texto. Por exemplo, você pode transferir modelos de gráficos junto com experts/indicadores: habilite seu modelo no código do programa na forma de uma matriz, em seguida, use a função FileSave para guardá-lo disco. Depois disso, o modelo pode ser aplicado a um gráfico utilizando a função ChartApplyTemplate.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- arquivo de modelo como matriz binária
       unsigned char my_template[]=
         {
          0xFF,0xFE,0x3C, ... ,0x00 // a matriz de dados é reduzida
         };
    //--- armazenamento e implementação do modelo
       if(FileSave("my_template.tpl",my_template))
         {
          Print("Custom template saved in \\MQL5\\Files");
          if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
             Print("Custom template applied to the current chart");
          else
             Print("Failed to apply custom template");
         }
       else
          Print("Failed to save custom template");
      }

  3. Adicionada funcionalidade para conversão de linhas entre formatos ASCII, HEX e Base64. Selecione a linha no código-fonte e clique no comando adequado no menu "Editar - Converter":




  4. Corrigida a pesquisa por arquivos sem diferenciação de maiúsculas e minúsculas.
  5. Corrigido o bug no depurador durante o cálculo dos valores da expressão do tipo x.y[0][1].z.
  6. Corrigida a navegação pelo código usando os botões "Anterior" e "Avançar".

MQL5

  1. Adicionado o novo serviço online para proteção secundária de programas MQL5, o MQL5 Cloud Protector. Esta proteção é semelhante com a utilizada na mais grande loja de aplicativos de negociação, o Mercado MetaTrader, onde arquivos de produtos (EX5) enviados por vendedores são ainda compilados em código nativo.

    Agora, este tipo de proteção está disponível para todos os usuários da plataforma. Basta executar o comando Serviço - MQL5 Cloud Protector no MetaEditor. Esta proteção difere da do Mercado em que o arquivo não está ligado ao computador do usuário. Arquivos protegidos pela MQL5 Cloud Protector podem ser executados em qualquer computador como arquivos EX5 convencionais.
    O serviço MQL5 Cloud Protector é seguro. Proteção adicional é aplicada apenas no arquivo já compilado. O código-fonte não é enviado para nenhum lugar. Primeiro, o programa é compilado num arquivo EX5, no computador do usuário, em seguida, o arquivo compilado é enviado através de uma conexão criptografada ao serviço, onde é protegido e devolvido ao utilizador.



  2. Adicionadas funções para trabalhar com instrumentos financeiros personalizados.

    Função Ação
    CustomSymbolCreate Cria um símbolo personalizado com o nome especificado no grupo definido
    CustomSymbolDelete Remove o símbolo personalizado com o nome especificado
    CustomSymbolSetInteger Define o valor do tipo inteiro para o símbolo personalizado
    CustomSymbolSetDouble Define o valor do tipo real para o símbolo personalizado
    CustomSymbolSetString Define o valor do tipo cadeia de caracteres para o símbolo personalizado
    CustomSymbolSetMarginRate Define o coeficiente de cobrança da margem - dependendo do tipo e direção da ordem - para o símbolo personalizado
    CustomSymbolSetSessionQuote Define a hora de início e fim da sessão de cotação especificada para o símbolo especificado e dia da semana
    CustomSymbolSetSessionTrade Define a hora de início e fim da sessão de negociação especificada para o símbolo especificado e dia da semana
    CustomRatesDelete Exclui todas as barras no histórico de preço do instrumento personalizado, no intervalo de tempo selecionado
    CustomRatesReplace Substitui todo o histórico de preços do instrumento personalizado pelos dados na matriz do tipo MqlRates, no intervalo de tempo definido
    CustomRatesUpdate Adiciona ao histórico do instrumento personalizado as barras que faltam e substitui os dados existentes na matriz do tipo MqlRates
    CustomTicksAdd Adiciona dados de uma matriz do tipo MqlTick ao histórico de preços de um símbolo personalizado. O símbolo personalizado deve ser selecionado na janela Market Watch (Observação do mercado).
    CustomTicksDelete Exclui todos os ticks no histórico de preço do instrumento personalizado, no intervalo de tempo selecionado
    CustomTicksReplace Substitui todo o histórico de preço do instrumento personalizado pelos dados na matriz do tipo MqlTick, no intervalo de tempo definido

  3. Adicionadas Coleções de dados genéricas à biblioteca padrão, elas contêm classes e interfaces para definição de coleções com base em modelos. As novas coleções fortemente tipadas proporcionam uma maior comodidade e desempenho durante manipulação de dados do que as coleções tipadas convencionais.

    A biblioteca está localizada no diretório de trabalho do terminal na pasta Include\Generic.

  4. adicionado o suporte a modelos para dados do tipo union.
  5. Adicionada a propriedade do instrumento de negociação SYMBOL_VISIBLE. Chamada de SymbolInfoInteger(symbol, SYMBOL_VISIBLE) retorna false, se o símbolo especificado não é visível na Observação do mercado.
  6. Adicionado o evento CHARTEVENT_MOUSE_WHEEL. Este evento é chamado ao rolar o pressionar a roda do mouse no gráfico (se para ele é definida propriedade CHART_EVENT_MOUSE_WHEEL=true).
  7. Adicionadas novas propriedades do gráfico:

    • CHART_EVENT_MOUSE_WHEEL - ativar/desativar a geração do evento de rolagem e pressionado de roda do mouse no gráfico CHARTEVENT_MOUSE_WHEEL. Valores possíveis: 0 e 1.
    • CHART_CROSSHAIR_TOOL - habilitar/desabilitar o recurso de alternância de mouse no modo "fio de retículo" pressionando o botão do meio do mouse. Valores possíveis: 0 e 1.
    • CHART_CONTEXT_MENU - habilitar/desabilitar a exibição do menu de contexto pressionando o botão direito do mouse no gráfico. Valores possíveis: 0 e 1.

  8. Agora ao calcular a escala da janela do indicador não são levados em conta os buffers de desenho com o estilo DRAW_NONE.
  9. Adicionada a geração do evento CHARTEVENT_CHART_CHANGE ao definir a propriedade CHART_SCALEFIX (escala fixa) para o gráfico.
  10. Adicionada a função ArraySwap, ela permite compartilhar rapidamente conteúdo de matrizes dinâmicas.
    bool  ArraySwap(
       void&  array1[],      // primeira matriz
       void&  array2[]       // segunda matriz
       );
    A função implementa matrizes dinâmicas do mesmo tipo e as mesmas dimensões. Para matrizes multidimensionais, o número de elementos em todas as dimensões, excepto o primeiro, tem de ser o mesmo.

  11. Adicionada a nova propriedade TERMINAL_RETRANSMISSION - porcentagem de pacotes de rede re-enviados (re-transmits) no protocolo TCP/IP para todos os aplicativos e serviços executados no computador. A perda de pacotes ocorre mesmo em redes rápidas e configuradas corretamente. Quando ela ocorre, não há confirmação do fornecimento de pacotes entre o receptor e o remetente. Por conseguinte, pacotes perdidos são reenviados.

    O terminal não calcula esse valor; ele é solicitado uma vez por minuto a partir do sistema operacional. Além disso, não é uma indicação da qualidade da conexão entre um terminal particular e um servidor de negociação, uma vez que a porcentagem é calculada para toda a atividade da rede, incluindo de sistema e de atividade de fundo.
    Propriedade TERMINAL_RETRANSMISSION adicionada à enumeração ENUM_TERMINAL_INFO_DOUBLE, para acessá-la, usa-se a função TerminalInfoDouble.
  12. Aprimorado o trabalho com o histórico de negociação.

Signals

  1. Corrigida a colocação do tipo de execução de ordem com base no resíduo (filling) durante o fechamento forçado de posições abertas com o sinal. Nas configurações de cópia dos sinais existe a opção "Stop, se a conta for inferior a US$ XXX": se o nível de fundos na conta cair abaixo do indicado, a cópia dos sinais de negociação é automaticamente interrompida, todas as posições são forçosamente fechadas. Anteriormente, após o fechamento forçado de posições, em alguns casos, para ordens de fechamento, o tipo de preenchimento era indicado de maneira incorreta. Agora, o terminal verifica os tipos de preenchimento permitidos nas configurações do símbolo e especifica a opção válida nas ordens.

Tester

  1. O comportamento da função HistoryOrderSelect no testador de estratégias é alinhado com o terminal do cliente.
  2. O coportamento das funções CopyTicks e CopyTicksRange no testador de estratégias é alinhado com o terminal do cliente.
  3. Otimizada a exibição de objetos gráficos para os testes no modo visual.
  4. Corrigida a exibição de resultados de teste de instrumentos bolsistas (com modelo bolsista de gestão de risco). Agora, o gráfico mostra apenas o capital (equity), o saldo e a carga sobre o depósito não são mostrados. As condições de negociação dessas contas são estimadas com base no nível dos fundos. O saldo mostra apenas o dinheiro na conta e não leva em conta os ativos e passivos do trader. Carga no depósito (margin/equity) não é mostrada, uma vez que a margem é o custo atual do ativo/passivo levando em conta o desconto, e ela varia com o capital.


21 julho 2017
MetaTrader 5 build 1640: criação e teste de instrumentos financeiros personalizados

Terminal

  1. Adicionada a possibilidade de criar instrumentos financeiros personalizados. Agora você pode criar qualquer instrumento, definir para ele tipos de configurações, importar para ele dados de preços, e conferir seus gráficos.

    Criando um símbolo personalizado
    Abra a janela de gerenciamento de símbolos através do menu de contexto "Observação do mercado" e clique em "Criar símbolo":


    Há muitas opções disponíveis para configuração. Sua lista e descrição pode ser encontrada na documentação. Você pode configurar rapidamente um instrumento personalizado, basta copiar os parâmetros de qualquer instrumento similar, e, em seguida, mudar o que você precisa. Para fazer isso, selecione um instrumento existente no campo "Copiar de".
    O nome do símbolo personalizado não deve interferir com os nomes dos símbolos transmitidos pelas corretoras. Se você se conetar ao servidor e nele houver um símbolo que coincide com o personalizado, o símbolo personalizado será excluído.
    Aqui você também pode encontrar os comandos importação e exportação de configurações. Você pode facilmente compartilhar símbolos personalizados ou transferir símbolos entre seus terminais. As configurações são exportadas para arquivos de texto JSON.

    Gerenciando símbolos personalizados
    Todos os símbolos são exibidos num grupo separado - Custom. Para alterar ou apagar um símbolo, use o menu de contexto na lista:



    Importando o histórico de preço
    Você pode importar dados de preços para seu próprio símbolo a partir de qualquer arquivo de texto. Escolha um símbolo, e, em seguida, clique na guia "Barras".


    Na caixa de diálogo de importação, especifique o caminho para o arquivo com os dados e defina as configurações:

    • Separador — separador de elementos num arquivo de texto.
    • Omissão de colunas e linhas — número de colunas (da esquerda para a direita) e linhas (de cima para baixo) que deve ser ignorado durante a importação.
    • Deslocamento — mudança de horário em horas. Esta opção é usada ao importar os dados armazenados noutro fuso horário.
    • Apenas selecionados — esta opção permite importar apenas as linhas selecionadas na janela de visualização de linhas. As linhas podem ser selecionadas usando o mouse mantendo pressionada a tecla "Ctrl" ou "Shift".

    O arquivo com barras de minuto deve estar no formato: Data Hora Open High Low Close VolumeDeTicks Volume Spread. Por exemplo:
    2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    Para seu o símbolo personalizado, você pode usar os dados de qualquer instrumento existente. Exporte-os (essa funcionalidade foi adicionada na versão anterior da plataforma), modifique-os, se necessário, e, em seguida, importe de volta.
    No MetaTrader 5, o histórico é armazenado na forma de barras de minuto. Todos os outros timeframes são baseados nelas. Ao importar, você pode usar os dados dos timeframes maiores, mas deve ter em conta que os gráficos dos timeframes menores, por enquanto, terão lacunas. Por exemplo, quando você importa dados horários, no gráfico de minuto, você verá uma barra por cada hora.
    Os dados de preço dos símbolos personalizados são armazenados separadamente no diretório Custom (fora dos diretórios de dados de servidores de negociação específicos):
    C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    Usando símbolos personalizados
    O uso de símbolos personalizados não difere do dos fornecidos pela corretora. Eles também são exibidos na janela "Observação do mercado", e podem abrir gráficos em que podem ser colocados indicador e objetos analíticos. Além disso, porém, não se pode negociar em símbolos personalizados.

    Testando estratégias em símbolos personalizados
    Os símbolos personalizados criados podem ser utilizados para testar os robôs de negociação e indicadores no testador de estratégias. Isso permite a otimização de estratégias, mesmo para os instrumentos financeiros que não estão disponíveis atualmente na corretora. Basta corretamente importar o histórico e definir as propriedades do símbolo personalizado.


    Ao calcular a margem e o lucro, o testador de estratégias utiliza automaticamente as cotações de Forex disponíveis. Suponha que estamos criando o símbolo personalizado AUDCAD.custom com Forex, como tipo de cálculo de margem, e USD como moeda de nossa conta. Neste caso, com nase no nome do instrumento Forex o testador procura os símbolos necessários na seguinte ordem:
    1.     primeiro são procurados os símbolos AUDUSD.custom (para o cálculo da margem) e USDCAD.custom (para o cálculo do lucro em transações)
    2.     em seguida, se um destes instrumentos não estiver presente, será procurado o primeiro símbolo que corresponde - pelo nome - aos pares de moedas necessários, isto é, AUDUSD e USDCAD respectivamente. Por exemplo, encontrados AUDUSD.b e NZDUSD.b, as cotações destes símbolos serão utilizados ao calcular a margem e o lucro.

    Instrumentos com outros tipos de cálculo de margem (Futures, Stock Exchange) requerem um par de moeda a fim de converter a moeda do instrumento para a moeda do depósito. Imagine que criamos um símbolo personalizado com moedas de lucro e de margem expressas em libras esterlinas (GBP), enquanto a moeda de depósito é o franco suíço (CHF). Neste caso, a busca de instrumentos para teste é realizada na seguinte ordem:
    1. Verifica-se a presença do instrumento financeiro que corresponde ao par de moedas GBPCHF (GBP vs CHF).
    2. Se não ele não existir, será procurado o primeiro instrumento de negociação que corresponde - pelo nome - ao par de moedas GBPCHF, por exemplo, GBPCHF.b ou GBPCHF.def.

    Ao testar usando instrumentos personalizados, certifique-se de que na conta de negociação estão disponíveis todos os pares de moedas necessários para os cálculos. Caso contrário, o cálculo de resultados financeiros e requisitos de garantia não será possível para o teste.

    Mais funcionalidades nas futuras versões da plataforma
    O desenvolvimento de instrumentos personalizados ainda não foi concluído, e mais funções serão adicionadas nas próximas compilações da plataforma. Você poderá importar o histórico para os símbolos personalizadas diretamente a partir dos EAs, bem como transmitir dados (adicionar cotações) de esses símbolos em tempo real.

  2. Adicionada a filtragem do canal de transações de acordo com o volume.

    No canal, é possível ocultar transações com um volume inferior ao especificado. Assim, no canal ficam apenas as transações grandes que têm maior impacto no mercado.

    Dê um duplo clique na primeira linha do canal de transações, especifique o volume mínimo em lotes e, em seguida, clique em qualquer outra área do livro de ofertas. Transações serão filtradas, enquanto o valor atual do filtro aparecerá no título da coluna de volume.


    Também é possível definir o volume mínimo através do menu de contexto do canal de transações.

  3. Adicionada a possibilidade de ligar o livro de ofertas ao gráfico em execução. Toda vez que você alterne para ver o gráfico de um instrumento financeiro, no livro de ofertas, será ligado exatamente o mesmo instrumento. Você não terá que abrir um livro de ofertas separados para cada novo símbolo.



  4. Adicionada a atualização da barra de ferramentas após minimizar e maximizar a janela do terminal.
  5. Corrigida a geração do histórico de negociação no cruzamento dos bilhetes das transações e das posições.

MQL5

  1. Adicionada a possibilidade de criar perfis de programas MQL5 sobre o histórico de preço. Isto permite verificar rapidamente o desempenho dos programas sem esperar por novos ticks.

    Durante a criação de perfis sobre dados reais, o programa é executado num gráfico habitual, no terminal. Muitos programas, especialmente indicadores, realizam cálculos apenas após a chegada de um novo tick (OnTick, OnCalculate). Assim, para avaliar o desempenho, é necessário aguardar o aparecimento de novos ticks em tempo real. Ao testar em dados históricos, você pode dar a carga correta para o programa. A criação de perfis é executada no testador de estratégias num modo visual, de modo que você possa receber eventos de novos ticks de vez.


  2. Adicionado o suporte União (union). Trata-se de um tipo de dados especial que consiste de uma série de variáveis ​​que compartilham o mesmo espaço de memória. Consequentemente, a união permite interpretar a mesma sequência de bits de duas (ou mais) formas diferentes. A união começa com a palavras-chave "union".
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    Em contraste com a estrutura, os diferentes membros da união pertencem ao mesmo local de memória. Neste exemplo, é declarada a união LongDouble, em que o valor do tipo long e o valor do tipo double dividem a mesma área de memória. É importante entender que é impossível fazer com que esta união armazene simultaneamente um valor inteiro long e um real double (como seria na estrutura), porque as variáveis ​​double_value e long_value se sobrepõem (na memória). Por outro lado, o programa MQL5 é capaz de processar os dados da união como um número inteiro (long) ou um real (double) a qualquer momento. Consequentemente, a união permite a obtenção de dois (ou mais) variantes de representação da mesma sequência de dados.

    Ao declarar a união, o compilador automaticamente aloca uma área de memória suficiente para armazenar - na união - as variáveis ​​de maior de tipo segundo o volume. A mesma sintaxe é usada para acessar o elemento de união como para as estruturas, ou seja, o operador "ponto".
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- obtemos e exibimos o número inválido -nan(ind)
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- maior número normalizado (DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- menor positivo normalizado (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*  Resultado de execução
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. Adicionada a geração automática de um operador de cópia implícito para objetos de estruturas e classes. Agora, o compilador cria automaticamente operadores de cópia que permitem escrever entradas simples para objetos, como b=a:
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- construtor por padrão
                         Foo(void){value=-1;};
       //--- construtor com parâmetros   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  estrutura contendo o objeto do tipo Foo                          |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Resultado de execução;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    No operador implícito, é realizada a cópia de objetos recebidos.

    • Se o membro é um objeto, é chamado o operador de cópia correspondente para este objeto.
    • Se o membro é uma matriz de objetos, a matriz de recebimento é aumentada ou reduzida ao tamanho de requisição usando ArrayResize antes de chamar o operador de cópia apropriado para cada elemento.
    • Se o membro é uma matriz de tipos de simples, para copiar, usada a função arraycopy.
    • Se o membro é um ponteiro para um objeto, é copiado o ponteiro, mas não o objeto para o qual ele aponta.

    Se necessário, você pode substituir o comportamento e, em vez do operador implícito de cópia, criar sua própria versão usando sobrecarga.

  4. Otimizado o uso de memória ao acessar o histórico de preço a partir dos EAs usando o Copy* funções. Ao trabalhar com grandes quantidades de dados, o consumo de memória será reduzido repetidamente.

  5. Agora a função TimeToStruct retorna um valor booleano, permitindo verificar o sucesso da conversão de datetime para MqlDateTime.
  6. Adicionada a restrição do uso de funções FileWriteStruct e FileReadStruct para estruturas que contêm cadeias de caracteres, matrizes dinâmicas, objetos e ponteiros.
  7. Adicionados códigos de resposta:

    • TRADE_RETCODE_REJECT_CANCEL — solicitação - para ativação de ordem pendente - rejeitada, enquanto a ordem é rejeitada
    • TRADE_RETCODE_LONG_ONLY — solicitação rejeitada, uma vez que a regra "Somente posições longas são permitidas" é definida para o símbolo
    • TRADE_RETCODE_SHORT_ONLY — solicitação rejeitada, uma vez que a regra "Somente posições curtas são permitidas" é definida para o símbolo"
    • TRADE_RETCODE_CLOSE_ONLY — solicitação rejeitada, uma vez que a regra "Somente o fechamento de posições existentes é permitido" é definida para o símbolo

  8. Adicionado um novo valor retornado pela função SymbolInfoInteger com parâmetro SYMBOL_ORDER_MODE. SYMBOL_ORDER_CLOSEBY — sinalizador de possibilidade de colocar ordens de fechamento de posição usando a oposta (Close By).
  9. À enumeração ENUM_SYMBOL_INFO_INTEGER adicionada a propriedade booleana SYMBOL_CUSTOM. Ele permite que você saiba se o símbolo é personalizado. Para obter a propriedade, use a função SymbolInfoInteger.
  10. Adicionada a possibilidade de obter razões para criar ordens, transações e posições.

    Novas propriedades


    Razões para criar ordens, transações e posições
    Para obter razões a fim de criar operações de negociação, adicionadas três enumerações:

    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON Descrição de razões
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT Transação realizada como resultado da ativação de uma ordem colocada a partir de um terminal desktop
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE Transação realizada como resultado da ativação de uma ordem colocada a partir de um aplicativo móvel
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB Transação realizada como resultado da ativação de uma ordem colocada a partir da plataforma web
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT Transação realizada como resultado da ativação de uma ordem colocada a partir de um programa MQL5, Expert Advisor ou script
    - DEAL_REASON_SL ORDER_REASON_SL Transação realizada como resultado da ativação de uma ordem Stop Loss
    - DEAL_REASON_TP ORDER_REASON_TP Transação realizada como resultado da ativação de uma ordem Stop Loss
    - DEAL_REASON_SO ORDER_REASON_SO Transação realizada como resultado do evento Stop Out
    - DEAL_REASON_ROLLOVER - Transação realizada devido à transferência da posição
    - DEAL_REASON_VMARGIN - Transação realizada após creditada/debitada a margem de variação
    - DEAL_REASON_SPLIT - Transação realizada após o fracionamento (redução do preço) do ativo que tinha a posição aberta durante a declaração do fracionamento

  11. Otimizada a sincronização e acesso ao histórico de ticks.
  12. Corrigido o erro de retorno de ticks para a matriz estática na função CopyTicksRange. Anteriormente, neste caso, sempre eram retornos 0 ticks.
  13. Várias correcções foram feitas na biblioteca de lógica difusa Fuzzy.

Signals

  1. Corrigida a abertura de um sinal do site quando não há conexão da conta de negociação.

Tester

  1. Otimizado e acelerado o trabalho com o histórico de ordens e transações. A velocidade de operação será aumentada ao trabalhar com grandes quantidades de dados (dezenas de milhares de entradas no histórico).
  2. Corrigido o cálculo fixo do tempo de espera da posição no relatório de teste.

MetaEditor

  1. No depurador, corrigida a exibição de classes estáticas de matrizes de membros.
  2. Adicionada uma lista de pontos de interrupção no programa que está sendo depurado. A lista pode ser aberta usando o menu de contexto da guia "Depuração":


    Para navegar até um ponto de interrupção, clique duas vezes nele.
Documentação atualizada.
26 abril 2017
MetaTrader 5 build 1596: acesso ao histórico de preço

Terminal

  1. Adicionado o acesso ao histórico de barra e de ticks. Agora é possível baixar todo o histórico de ticks de minuto a partir do servidor, más só através da MQL5, com ajuda da interface da plataforma. O acesso a dados de preço se expande no que diz respeito à preparação para o lançamento da função fonte de dados personalizada. Em breve a plataforma poderá plotar gráficos com base em seus próprios dados de preço, criar símbolos sintéticos e usar gráficos off-line.

    Para baixar dados, abra o gestor de símbolos no menu de contexto da "Observação do mercado".


    Agora, nele, estão disponíveis duas guias novas, isto é: "Barras" e "Ticks". Selecione o símbolo, período e clique em "Pedido". A plataforma pedirá todos os dados disponíveis a partir do servidor ou serão exibidos imediatamente se eles já estiverem carregados. Os dados de preço armazenados podem ser exportados para arquivos CSV.

  2. Adicionada a exibição de tempo com precisão de milissegundos para posições, transações e ordens.



  3. Na caixa de diálogo de negociação corrigida a notificação sobre a recusa na execução do pedido para fechamento da posição usando a posição oposta.

MQL5

  1. Corrigido o trabalho da função PositionSelect. Em alguns casos, não era selecionada a posição com o menor bilhete.
  2. Corrigido o trabalho das funções CopyTicks e CopyTicksRange ao solicitar o histórico de ticks a uma grande profundidade.

Signals

  1. Corrigido o erro de cópia de sinais ao aumentar o tamanho de uma posição já existente. O erro ocorria, em alguns casos, em contas de compensação.

Tester

  1. Corrigido o processamento de ordens limit para instrumentos bolsistas. As ordens, colocadas melhor do que o mercado (preço de compra abaixo do de mercado, ou preço de venda acima do de mercado), são executadas sem derrapagem. As ordens, colocadas pior do que o mercado, são executadas imediatamente após a colocação segundo o preço de mercado nesse mesmo momento.

Documentação atualizada.

24 março 2017
MetaTrader 5 build 1570: melhoria do mostruário do Mercado e expansão de funções de modelo em MQL5

Terminal

  1. Atualizado o mostruário da loja de aplicativos MetaTrader Market. A escolha de robôs de negociação e indicadores técnicos tornou-se mais fácil. Nós não só atualizamos o design, mas também acrescentamos a seleção de produtos:

    • Na página principal agora são mostrados os mais populares Experts, indicadores, produtos recentes do Mercado, bem como os melhores aplicativos gratuitos.
    • Nas seções de Experts, indicadores e utilitários apareceram subcategorias: robôs de cobertura e de grade, indicadores de tendência e multimoeda, e muito mais.




  2. Corrigida tanto a atualização do terminal de cliente quanto a mecânica das compras embutidas no Mercado, Sinais e Hospedagem Virtual, ao utilizar a conta de usuário de Windows com privilégios restritos.
  3. Corrigido o erro que, em alguns casos, levava à classificação incorreta do histórico de posições.
  4. otimizada e corrigida a exibição da aba "Ativos".

MQL5

  1. Adicionado o suporte para a sobrecarga de funções de modelo de parâmetros. Por exemplo, se existir uma função de modelo que registra no primeiro parâmetro o valor do segundo parâmetro usando uma conversão explícita de tipos. Em linguagem MQL5 é proibida a conversão do tipo string para o tipo bool, mas podemos fazer isto nós mesmos. Criamos uma sobrecarga de função de modelo:
    //+------------------------------------------------------------------+
    //| Função de modelo                                                 |
    //+------------------------------------------------------------------+
    template<typename T1,typename T2>
    string Assign(T1 &var1,T2 var2)
      {
       var1=(T1)var2;
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Sobrecarga especial para o caso bool+string                      |
    //+------------------------------------------------------------------+
    string Assign(bool &var1,string var2)
      {
       var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int i;
       bool b;
       Print(Assign(i,"test"));
       Print(Assign(b,"test"));
      }
    Como resultado da execução deste código, podemos ver que para o par int+string foi utilizada a função de modelo Assign(), enquanto, na segunda chamada, para o par bool+string já foi utilizada a versão sobrecarregada.
    string Assign<int,string>(int&,string)
    string Assign(bool&,string)

  2. adicionada a possibilidade de especialização explícita de funções de modelo. Para fazer isto, antes da lista de parâmetros de chamada, é preciso especificar os parâmetros de digitação:
    template<typename T>
    T Func() { return (T)0; }
      
      
    void OnInit()
      {
       Func<double>();   // especialização explícita da função de modelo
      }
    Assim, a especialização não se realiza através do parâmetro de chamada, mas sim especificando os tipos.

  3. Otimizada a exibição de indicadores de usuário com o tipo de desenho DRAW_ZIGZAG.
  4. Na enumeração de tipos de transações ENUM_DEAL_TYPE adicionados novos valores:

    • DEAL_DIVIDEND — operação de dividendo.
    • DEAL_DIVIDEND_FRANKED — operação de dividendo franqueado (não tributável, a empresa paga pelo cliente).
    • DEAL_TAX — dedução de imposto.

  5. Corrigida a exibição de indicadores com o tipo de desenho DRAW_FILLING. Caso coincidam as coordenadas das linhas superior e inferior, agora é desenhada uma linha fina.
  6. Corrigido o cálculo de coordenadas do objeto "Etiqueta bitmap" (Bitmap Label) ao definir o parâmetro CHART_SHOW na condição false. Este parâmetro é definido pela função ChartSetInteger e permite ocultar todos os elementos do gráfico de preço a fim de criar uma interface própria de programa.
  7. Corrigido o erro de transcodificação de imagens de 24 bits ao serem colocadas nos recursos do aplicativo MQL5.
  8. Corrigido o erro de impressão de estruturas das funções ArrayPrint.
  9. Atualizadas as bibliotecas-padrão MQL5.

MetaEditor

  1. Adicionada a tradução da interface de usuário para malaio.

Signals

  1. Corrigida a abertura da pagina de sinal no terminal, durante a transição a partir do site da MQL5.community, caso a conta de negociação não esteja conectada.

Tester

  1. Corrigido o erro da função CopyTicks em execução, no testador de estratégias.
  2. Corrigida a classificação de transações do tipo "Retirada" (Withdrawal) ao gerar um relatório de teste.
  3. Corrigida a modificação de ordens pendentes.

Hosting

  1. Corrigida a exibição do assistente da hospedagem virtual em telas de altíssima resolução (4K).

Documentação atualizada.

17 fevereiro 2017
MetaTrader 5 build 1545: rápida alternância entre janelas e alteração dos preços usando o mouse

Terminal

  1. Foi adicionada a alternância rápida entre as janelas "Caixa de Ferramentas" e "Testador de Estratégias."



  2. foi adicionada a possibilidade de alterar os preços e volumes das ordens usando a roda do mouse:




  3. Agora, ao alternar para baixar os terminais móveis, é armazenada a lista de seus servidores de negociação. Após instalar o MetaTrader 5, para iPhone ou Android, no dispositivo móvel, aparecerá imediatamente uma lista pronta com os servidores. Assim, você poderá conectar rapidamente as contas de negociação existentes. O servidor da conta conectada atualmente será exibido primeiro no terminal móvel.




  4. Foi reduzida significativamente a carga - sobre o terminal - criada pelos gráficos e objetos recolhidos, ou seja, em segundo plano.
  5. Foi corrigido o erro que, em alguns casos, levava à ativação incorreta dos Trailing-Stops.
  6. Foi corrigido o erro de filtragem de símbolo, no histórico de negociação da conta.
  7. Foi corrigido o erro de exibição do campo "Type", no histórico de posições.
  8. Foi corrigido o erro de formação e apresentação do histórico de negociação sob a forma de posições.

MQL5

  1. Foi corrigida a exibição de indicadores personalizados com o tipo de plotagem DRAW_COLOR_LINE, DRAW_COLOR_ZIGZAG e DRAW_COLOR_SECTION ao utilizar a cor CLR_NONE.
  2. Foi corrigido o erro nos modelos ao digitar o ponteiro constante.
  3. Foi corrigido o controle do acesso aos membros de classe private e protected.

‌Tester

  1. Foi corrigida a ativação de ordens limit - nos instrumentos financeiros - quando o valor da ordem a ser colocada é pior em relação ao mercado (quer o preço de compra é superior quer o preço de venda é inferior ao proposto pelo mercado).
  2. Foi removida a restrição no teste de indicadores personalizáveis com mais de 64 parâmetros de entrada.
  3. Foi adicionada a tradução da interface de usuário para hindi.

Documentação atualizada.

27 janeiro 2017
MetaTrader 5 build 1525: Apresentação do histórico na forma de posições e melhorias no testador

Terminal

  1. Foi adicionada a apresentação do histórico na forma de posições. O terminal de recolhe dados sobre transações relacionadas com a posição (abertura, aumento, fechamento parcial e total) e agrupa este dados numa única conta, onde é possível ver imediatamente:

    • Momento - de abertura e fechamento de posição - a ser determinado pela primeira e a última transação, respectivamente
    • Volume da posição; se a posição é fechada parcialmente, são exibidos o volume fechado e o volume original
    • Preço de abertura médio ponderado e preço de fechamento de posição
    • Resultado financeiro total das transações relacionadas com a posição




    Para contas de cobertura, esse tipo de apresentação de posições, na verdade, é semelhante ao histórico da conta na plataforma MetaTrader 4.




  2.  Foi adicionado um comando para processar o histórico de transações no gráfico de um determinado símbolo.

    • Para exibir todas as transações somente no símbolo da posição/transação selecionada, clique em "Adicionar transação por [nome do símbolo]." Transações serão adicionadas a todos os gráficos abertos atualmente de acordo com este símbolo. Se não houver gráficos abertos, será aberto um novo.
    • Para exibir as transações para todos os símbolos a partir do histórico da conta, clique em "Adicionar todas as transações." Em todos os gráficos abertos, serão adicionadas todas as operações de acordo com o símbolo correspondente.




  3. Foram adicionadas tanto a exibição do nome internacional do instrumento de negociação nas especificações do contrato, como a possibilidade de procurar segundo ele na caixa de diálogo de controle de instrumentos.




  4. Foi adicionada a possibilidade de definir rapidamente a resolução para a janela do terminal. A função será útil para aqueles que fazem vídeos. No menu, estão disponíveis as mais populares resoluções para a publicação em serviços de vídeo, como YouTube.



  5. Escalas e perfis de gráficos migrados a partir de [diretório de dados do terminal\Profiles] para [diretório de dados do terminal\MQL5\Profiles]. Agora é possível adicionar facilmente escalas no repositório MQL5 Storage e utilizá-las com qualquer um dos seus computadores.

  1. Foi adicionado o suporte para variáveis de recurso. Sua utilização pode facilitar muito a escrita de alguns programas. Por exemplo, você pode escrever um código em OpenCL num arquivo CL separado e, em seguida, incluir esse arquivo - como uma cadeia de caracteres - nos recursos de seu programa MQL5. Anteriormente, em vez disso, era necessário descrever esse código como uma variável de cadeia grande.

    Declaração da variável de recurso
    #resource caminho_para_o_arquivo_do_recurso as tipo_de_variável_de_recurso nome_de_variável_de_recurso

    Características
    • Para arquivos de sequência de caracteres, a codificação de BOM (cabeçalho) é detectada automaticamente. Se não houver nenhum BOM, a codificação será determinada pelo conteúdo. São suportadas codificações ANSI, UTF-8 e UTF-16. Todas as cadeias de caracteres são convertidas para Unicode.
    • Os dados deste recurso podem ser tratados por intermédio de uma variável. O endereçamento automático via "::<resource name>" não funciona.
    • O tipo especial de variável de recurso bitmap informa ao compilador que o recurso é uma representação gráfica. A variável de recurso, neste caso, obtém o tipo uint.
    • Ao usar uma imagem de 24 bits, para todos seu pixels de componente de canal-alfa, define-se como 255.
    • Ao usar uma imagem de 32 bits, sem canal-alfa, para todos seu pixels de componente de canal-alfa, também é definido como 255.
    • Após carregar uma imagem de 32 bits com canal-alfa não acontece nenhuma manipulação de pixels.
    • A matriz-variável de recurso de tipo bitmap pode ter duas dimensões. Neste caso, o tamanho da matriz será definido como [altura_de_imagem][largura_de_imagem].
    • No caso de uma matriz unidimensional, o número de elementos será definido como altura_de_imagem*largura_de_imagem.
    • Se o tamanho do arquivo de recurso não é um múltiplo do tamanho do elemento da matriz, em seguida, o resto dos dados é cortado. Por exemplo, quando o tamanho do arquivo é 14 bytes, para a matriz int o número de elementos será 3, e os restantes 2 bytes (14 - sizeof(int)*3) serão descartados.

    Exemplos de utilização
    #resource "data.bin" as int ExtData[]             // declaração de matriz de tipo numérico, que contém dados a partir do arquivo data.bin
    #resource "data.bin" as MqlRates ExtData[]        // declaração de matriz de estrutura simples, que contém dados a partir do arquivo data.bin
    
    #resource "data.txt" as string ExtCode            // declaração de cadeias de caracteres, que contém dados a partir do arquivo data.txt
    #resource "data.txt" as string ExtCode[]          // declaração de matriz de sequência de caracteres, que contém dados a partir do arquivo data.txt
    
    #resource "image.bmp" as bitmap ExtBitmap[]       // declaração de matriz unidimensional, que contém em si a varredura a partir do arquivo BMP, tamanho da matriz = height * width
    #resource "image.bmp" as bitmap ExtBitmap2[][]    // declaração de matriz bidimensional, que contém em si a varredura a partir do arquivo BMP, tamanho da matriz [height][width]

  2. Foi adicionada a propriedade CHART_SHOW para desativa a exibição do gráfico. Para obter e instalar a propriedade, são utilizadas as funções ChartGetInteger e ChartSetInteger.

    Se for definido como false, será desativada a plotagem de todos os atributos do gráfico de colunas de preços e serão removidas todos os recuos nas bordas do gráfico de colunas: escala do tempo e preço, barra de navegação rápida, marcas de eventos de calendário, ícones de transação, dicas de indicadores e barras, painéis indicadores, histogramas de volume, etc.

    A desativação da plotagem é uma solução ideal para criar sua própria interface de programa usando recursos gráficos.

    Os objetos gráficos sempre são plotados independentemente do valor da propriedade CHART_SHOW.

  3. Foi adicionada a propriedade CHART_KEYBOARD_CONTROL para ativar/desativar o controle de gráficos usando os teclas ("Home", "End", "PageUp", "+", "-", "Seta para cima", etc.). Ao definir CHART_KEYBOARD_CONTROL=false, é possível desativar a rolagem e dimensionamento do gráfico, no entanto, ao fazer isto, mantem-se a possibilidade de obter eventos - usando essa teclas - em OnChartEvent.

    Para obter e definir propriedades, são utilizadas as funções ChartGetInteger e ChartSetInteger.

  4. Foram adicionadas novas funçóes e propriedade para trabalhar com OpenCL.

    Novas propriedades para trabalhar com a memória
    Usando CLGetInfoIntegrer agora é possível quatro novas propriedades:
    • CL_DEVICE_MAX_WORK_GROUP_SIZE — número total de grupos locais de trabalho para o dispositivo OpenCL.
    • CL_KERNEL_WORK_GROUP_SIZE — número total de grupos locais de trabalho para o programa OpenCL.
    • CL_KERNEL_LOCAL_MEM_SIZE — tamanho da memória local em bytes, que é usada pelo programa OpenCL para todas as tarefas simultâneas no grupo. Utilize CL_DEVICE_LOCAL_MEM_SIZE para obter o máximo disponível.
    • CL_KERNEL_PRIVATE_MEM_SIZE — tamanho mínimo de memória privada em bytes a ser usado por cada tarefa na kernel do programa OpenCL.

    bool CLExecutionStatus(int kernel)
    Retornar o estado de execução do programa OpenCL. Como parâmero é enviado o identificador para a kernel do programa OpenCL.

    bool CLSetKernelArgMemLocal(int kernel_handle,int arg_index,ulong local_mem_size)
    Ele define o buffer local como argumento da função kernel. Como parâmero são enviados: o identificador para a kernel do programa OpenCL, o número do argumento de função OpenCL e tamanho de buffer.

  5. Foi adicionado o código de resposta TRADE_RETCODE_LIMIT_POSITIONS. O número de posições abertas que você pode ter em sua conta pode ser restrito pelas configurações do servidor. Após atingir o limite, em resposta à colocação de uma ordem, o servidor retorna o erro TRADE_RETCODE_LIMIT_POSITIONS. A restrição opera de forma diferente dependendo do tipo de registro de posições na conta:

    • Sistema de compensação — leva em conta o número de posições abertas. Ao atingir o limite, a plataforma não permite colocar ordens novas, cuja execução poderia levar a aumentar o número de posições abertas. Na verdade, a plataforma colocará ordens apenas nos símbolos, nos quais já existem posições abertas. No sistema de compensação, ao verificar o limite, não são tidas em conta as ordens pendentes atuais, uma vez que sua execução pode levar a uma alteração nas posições atuais, em vez de um aumento de seu número.
    • No sistema de cobertura, além das posições abertas, são tidas em conta as ordens pendentes colocadas, uma vez que sua execução sempre leva a abertura de uma nova posição. Ao atingir o limite, a plataforma não permite colocar ordens de mercado nem ordens pendentes para abrir posições.

  6. Foi corrigido o erro que em alguns casos causava que ticks fossem ignorados no histórico de negociação.
  7. Foram corrigidos os erros de digitação indireta de escalas.
  8. Foi atualizada a biblioteca para trabalhar com estatísticas matemáticas.

Market

  1. Foi corrigida a abertura da página do produto ao baixar a versão demo.

Tester

  1. Após completar a otimização, os resultados são classificados automaticamente na coluna "Resultados."
  2. No menu de contexto da guia de resultados de otimização e diário, foi adicionada uma opção a fim de alternar automaticamente para resultados, após concluir a otimização.
  3. O testador de estratégias agora permanece no modo de otimização, após iniciar um único teste. Anteriormente, ao iniciar um teste único, a partir da guia de resultados de optimização, o testador de estratégias mudava automaticamente para o modo de teste único. Para realizar a re-otimização, foi necessário incluí-lo novamente nas configurações.
  4. Agora os conjuntos de parâmetros de entrada podem ser armazenados não só sob a forma de arquivos set, mas também como configurações do testador local de estratégias, com fácil acesso a eles através do menu de contexto.




  5. Foi adicionada tradução da interface para o mongol, húngaro, romeno e urdu.

MetaEditor

  1. Foi adicionada a possibilidade de alterar a ordem das expressões a serem observadas na janela de depuração. Basta arrastar a expressão para a posição desejada com o mouse.




  2. Foi corrigido o erro na determinação da codificação nos arquivos de origem.
  3. Foi corrigida a busca por arquivos em UTF-8.
  4. Foi corrigido o erro na seleção de texto com o mouse ao haver nele caracteres de tabulação.
  5. Foi adicionada tradução da interface para húngaro e romeno.

Documentação atualizada.

9 dezembro 2016
MetaTrader 5 build 1495: Melhoras na MQL5 para trabalhar com gráficos personalizados

MQL5

  1. Foi adicionada a função CopyTicksRange.
  2. Na classe CCanvas foram adicionadas funções de suavização melhoradas:
  3. A documentação MQL5 foi adicionada a descrição da biblioteca gráfica, com a qual é possível construir rapidamente gráficos de barras, distribuições e gráficos lineares diretamente sobre os gráficos de preços.
  4. As constantes Status do terminal de cliente foram adicionados identificadores de estado de teclas de atalho. A chamada de TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) retorna o mesmo código de status de teclas como a função GetKeyState() a partir de MSDN.
  5. Não suporta conversão do tipo string para o tipo bool. Para verificar as cadeias de caracteres será preciso especificar explicitamente a condição. Por exemplo, para o código a seguir, na nova versão, será emitido um erro de compilação:
    string str;
    ...
    if(str)                        // aparecerá o erro de compilação "Cannot convert type 'string' to 'bool'" (nas compilações anteriores não acontecia o erro)
       Print("str is true");
    É necessário escrever uma condição explícita:
    string str;
    ...
    
    //--- verifica se a cadeia de caracteres é inicializada
    if(str!=NULL)
       Print("str is true");
    
    ou
    
    //--- verifica se o valor da cadeia de caracteres é "true"
    if(StringCompare(str,"true",false))
       Print("str is true");
    
    ou
    
    //--- verifica se a cadeia de caracteres é um número e não é igual a zero
    if((int)str!=0)
       Print("str is true");

Correções de crash-logs.

2 dezembro 2016
Plataforma web MetaTrader 5: autenticação de dois fatores e alteração de senha
  • Para reforçar a segurança das contas de negociação foi adicionada uma autenticação de dois fatores usando senhas de uso único. Para ativar a autenticação de dois fatores, use o aplicativo móvel MetaTrader 5. Faça login e, na janela "Opções", abra o gerador One-time password (OTP). Associe a ele todas suas contas de negociação, assim cada uma irá gerar automaticamente uma senha única de seis dígitos descartável. Insira-a ao iniciar sessão na plataforma web.


  • Foi adicionada a possibilidade de alterar as senhas habitual e de investidores. Aproveite esta oportunidade para criar um identificador pessoal de fácil uso com o qual não esquecerá sua senha.
  • À plataforma web também foi adicionada a geração automática de contas de demostração. Agora você pode fazer login na MetaTrader 5 Web a partir de qualquer navegador e começar imediatamente a negociar no mercado Forex, de ações ou futuros.
24 novembro 2016
MetaTrader 5 build 1485: modos de teste adicionais e gráficos na biblioteca padrão

Terminal

  1. Foi alterada a ordem de exibição das entradas no registro do terminal e MetaEditor. Anteriormente, no início, no registro eram exibidas as entradas mais recentes, agora, as mais antigas. Inverter a ordem de classificação fará a leitura do registro mais fácil e familiar.




    Além disso, através do menu de contexto do registro agora é possível ocultar as colunas "Tempo" e "Fonte".

  2. No histórico de negociação, as ordens e transações de fechamento de posição - no modo de cobertura - agora mostram o bilhete de posição fechada. Isso facilita a busca de operações pares de abertura e fechamento.




  3. Foi corrigido o erro que levava à cópia dos níveis SL/TP a partir das posições atuais para a posição nova do mesmo instrumento. O erro acontecia ao utilizar a função Negociação em um clique (por exemplo, painel no gráfico, janela Observação do mercado) no modo de cobertura.
  4. Foi corrigida a exibição de objetos de seta em telas de alta resolução (4K).

MQL5

  1. Foi adicionada a função ArrayPrint para saída no registro de matrizes de tipos e estruturas simples.
    void  ArrayPrint(
       const void&   array[],             // matriz de saída
       uint          digits=_Digits,      // número de casas decimais
       const string  separator=NULL,      // delimitador entre os valores dos campos de estrutura
       ulong         start=0,             // índice do primeiro elemento de saída
       ulong         count=WHOLE_ARRAY,   // número de elementos de saída
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    ArrayPrint não exibe, no registro, todos os campos da matriz de estruturas, uma vez que os campos tanto de matriz como de ponteiros de objetos são omitidos. Para exibição de todos os campos dessa estrutura, será necessário escrever a função de saída em massa com a formatação desejada.
    //--- exibe os valores das 10 últimas barras
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Verificação\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates failed, error code=%d",GetLastError());
    //--- exemplo de saída
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Verificação
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */

  2. Foi corrigido o erro ao adicionar cadeias de caracteres do tipo S1=S2+S1
  3. Foi alterado o comportamento da função ArrayResize. Ao enviar - como parâmetros reserve_size - o valor -1, a função liberta a memória não utilizada (memória reservada), desde que o aumento no tamanho da matriz não aconteça. Alteração do tamanho da matriz para 0 com valor reserve_size=-1 equivalente à chamada ArrayFree. O novo comportamento permite otimizar o uso de memória em programas MQL5.
    void OnStart()
      {
       int arr[];
    //--- quanta memória é usada inicialmente 
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- quanta memória é usado para uma matriz de tamanho 1, mas com uma reserva de
       ArrayResize(arr,1,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- após aumentar a matriz, o tamanho da memória utilizada não é alterado pela reserva
       ArrayResize(arr,1024*512,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- após reduzir a matriz, o tamanho da memória utilizada também não é alterado
       ArrayResize(arr,1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- a memória sem uso é liberada pela remoção da reserva
       ArrayResize(arr,1,-1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }

  4. A biblioteca padrão foram adicionadas funções para plotagem de gráficos. Para usar, habilite o arquivo MQL5\Include\Graphics\Graphic.mqh em seu projeto.

    Plotagem de gráfico de 3 séries de dados usando GraphPlot:
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    Resultado:


    Plotagem de gráfico com base na matriz de dados usando GraphPlot:<br2>
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    Resultado:



  5. Foram atualizadas as funções de trabalho com estatística matemática na biblioteca padrão. Foi realizada uma verificação grande quanto à qualidade e precisão de todas as funções na versão MQL5, bem como na linguagem de origem R. Para controlar a precisão e a velocidade do trabalho, juntamente com biblioteca estática são distribuídos testes de unidade. Eles estão localizados no diretório \MQL5\Scripts\UnitTests\Stat.

    • TestStat.mq5 — script de teste base para verificar os resultados dos cálculos
    • TestPrecision.mq5 — teste de precisão de cálculos
    • TestBenchmark.mq5 — teste com medida do desempenho de cálculos

Tester

  1. Foram estendidas as configurações de espera na execução de pedidos de negociação durante o teste. Agora é possível verificar o robô de negociação em uma variedade de condições financeiras mais amplas: desde o caso ideal sem demora a qualquer atraso definido pelo usuário.



    Anteriormente estava disponível apenas o modo de atraso aleatório.

  2. Foi corregido erro de formação de volume de tick de barras ao testar em modo OHLC em М1.
  3. Foi corrigida a colocação de tempo de abertura de ordens e posições em milissegundos ao negociar no modo de cobertura.
  4. Foi corregido o erro "old tick" (tick obsoleto) durante o teste multi-moeda ou multi-timeframe no modo de ticks reias.
  5. Foram aceleradas as funções CopyTicks quando os ticks solicitados eram lidos a partir do banco de dados no disco.

MetaEditor

  1. Foram adicionados os comados de trabalho com o repositório versionado de códigos-fonte MQL5 Storage ao menu de contexto do arquivo no Navegador e na barra de ferramentas.




  2. Foi corrigido o erro que levava à violação da integridade do banco de dados local MQL5 Storage quando se trabalhava com mais de 1024 arquivos no repositório.
  3. Foram corrigidos bugs de exibição da árvore em arquivos da MQL5 Storage.
  4. Foi corrigido a exibição de arquivo após a substituição de texto em massa.

Documentação atualizada.

14 outubro 2016
MetaTrader 5 build 1455: Biblioteca de funções matemáticas MQL5

Terminal

  1. Foram adicionados dicas pop-up para os botões Buy, Sell e Close nos diálogos da negociação. As dicas explicam exatamente quais ativos são comprados e vendidos durante a execução de uma operação, ajudando traders iniciantes a entender o processo de negociação.




  2. Foram adicionados novos ícones de ordens, transações e posições nas guias "Negociação" e "Histórico".




  3. Foram otimizados e acelerados consideravelmente (até 4-5 vezes) a exibição e atualização do livro de ofertas, gráfico de ticks do livro de ofertas e canal de negociações.
  4. Foi corrigido o erro de sincronização do histórico de ticks em tempo de não-negociação. Em alguns casos, o erro levava ao consumo excessivo de tráfego de rede.

MQL5

  1. Na biblioteca padrão, foi incluía a versão MQL5 da biblioteca de análise numérica ALGLIB.

    Possibilidades da biblioteca

    • Álgebra linear
    • Solução de sistemas de equações lineares e não lineares
    • Interpolação
    • Otimização
    • Transformada rápida de Fourier
    • Integração numérica
    • Aproximação de mínimos quadrados lineares e no-lineares
    • Solução de equações diferenciais ordinárias
    • Cálculo de funções especiais
    • Estatística descritiva e testes de hipóteses
    • Análise de dados: classificação, regressão
    • Implementação de algoritmos de álgebra linear, interpolação, etc. na aritmética de alta precisão (usando MPFR)

    Como usar

    Os arquivos da biblioteca ALGLIB estão localizados no diretório \MQL5\Include\Math\Alglib. Para usar as funções, adicione o arquivo principal da biblioteca ao seu programa:

    #include <Math\Alglib\alglib.mqh>

  2. A biblioteca padrão foram adicionadas funções de trabalho com estatística matemática. Agora, em MQL5, estão disponíveis as possibilidades da linguagem R, ela é um dos melhores instrumentos de processamento estatístico e análise de dados.<br1>

    Possibilidades da biblioteca

    A biblioteca estatística contém funções para cálculo de características estatísticas de dados, bem como funções para trabalhar com distribuições estatísticas:

    • Funções para calcular as características estatísticas de elementos de matriz
    • Funções para trabalhar com distribuições estatísticas: distribuição normal, distribuição log-normal, distribuição beta, etc.

    Como usar

    Os arquivos da biblioteca ALGLIB estão localizados no diretório \MQL5\Include\Math\Stat. Para usar as funções, adicione o arquivo com as funções desejadas ao seu programa, por exemplo:

    #include <Math\Stat\Binomal.mqh>
    #include <Math\Stat\Cauchy.mqh>
    

    Leia descrições detalhadas das funções da biblioteca no artigo Distribuições estatísticas em MQL5: pegamos as melhores a partir de R.


  3. Na biblioteca padrão, foi incluía a versão MQL5 da biblioteca Fuzzy, ela implementa sistemas de inferência de lógica difusa Mastop e Sugeno.

    Possibilidades da biblioteca

    • 13 funções de associação
    • Forma flexível de criação de regras para sistemas fuzzy
    • Sistema de inferência de lógica difusa Mastop
    • Sistema de inferência de lógica difusa Sugeno
    • 5 métodos de exclusão da difusão para sistemas do tipo Mamdani
    • Número ilimitado de variáveis de entrada e saída

    Como usar

    Os arquivos da biblioteca Fuzzy estão localizados no diretório \MQL5\Include\Math\Fuzzy. Para usar as funções, adicione o arquivo com as funções desejadas ao seu programa, por exemplo:

    #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
    #include <Math\Fuzzy\sugenofuzzysystem.mqh>
    

    Uma descrição detalhada da biblioteca pode ser encontrada ni Code Base: Fuzzy, biblioteca para trabalhar com lógica difusa


  4. Foi adicionada a propriedade CHART_QUICK_NAVIGATION para habilitar/desabilitar a barra de navegação rápida no gráfico. Para alterar e obter o estado das propriedades, utilize as funções ChartSetInteger e ChartGetInteger.




    A barra é chamada pressionado a tecla Enter ou Space. Ao usá-la, é possível passar rapidamente para a data especificada no gráfico, alternar o símbolo e período. Se seu programa MQL5 manipula as teclas Enter ou Space, desative a propriedade CHART_QUICK_NAVIGATION para o terminal não capturar esses eventos. Além disso, a barra de navegação rápida pode ser chamada mediante duplo clique.

  5. Foram adicionadas as funções FileLoad e FileSave para facilitar a leitura e armazenamento de matizes nos arquivos. Ao contrário de FileRead* e FileWrite*, essas funções não precisam o manipulador de arquivo. FileLoad e FileSave trabalham com matrizes de tipos numéricos, bem como com estruturas simples sem cadeias de caracteres, matrizes dinâmicas ou objetos de uma classe.
    long  FileLoad(
       const string filename,      // [in] nome do arquivo
       void         &buffer[],     // [out] matriz na qual é tomado em consideração o arquivo
       uint         common_flag=0  // [in] 0 - busca do arquivo na pasta Files do terminal, FILE_COMMON - na pasta comum dos terminais
       );
    
    bool  FileSave(
       const string filename,      // [in] nome do arquivo
       const void   &buffer[],     // [in] matriz armazenada no arquivo
       uint         common_flag=0  // [in] 0 - criação do arquivo na pasta Files do terminal, FILE_COMMON - na pasta comum dos terminais
       );
    Exemplo de como armazenar, numa pasta, uma matriz de ticks e, em seguida, lê-la.
    //--- parâmetros de entrada
    input int      ticks_to_save=1000; // número de ticks
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       string  filename=_Symbol+"_ticks.bin";
       MqlTick ticks[];
    //---
       int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
       if(copied!=-1)
         {
          PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
          //--- se o histórico de ticks estiver sincronizado, o código de erro será igual a zero
          if(!GetLastError()==0)
             PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
          //---  armazenamos os ticks no arquivo
          if(!FileSave(filename,ticks,FILE_COMMON))
             PrintFormat("FileSave() failed, error=%d",GetLastError());
         }
       else
          PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
    //--- agora lemos de volta estes ticks a partir do arquivo
       ArrayFree(ticks);
       long count=FileLoad(filename,ticks,FILE_COMMON);
       if(count!=-1)
         {
          Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
          for(int i=0;i<count;i++)
            {
             PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
             TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
             ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
            }
         }
      }

  6. Foi modificada a exibição do indicador personalizado com modo de desenho DRAW_CANDLES. Agora é possível definir de uma a três cores. A exibição de velas depende de quantas cores são definidas.

    Se for indicada uma cor, todas as velas no gráfico serão completamente pintadas com essa cor.
    //--- velas pintadas na mesma cor
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- foi indicado apenas uma cor, por isso todas as velas terão apenas uma cor
    #property indicator_color1  clrGreen  
    Se forem indicadas duas cores, os contornos das velas serão desenhadas usando a primeira cor, enquanto o corpo usando a segunda.
    //--- a cor das velas difere da cor das sombras
    #property indicator_label1  "Two color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- sombras e contorno de velas de cor verde, corpo de cor branca
    #property indicator_color1  clrGreen,clrWhite 
    Se forem indicadas duas cores, os contornos das velas serão desenhadas usando a primeira cor, enquanto o as velas de alta e baixa serão definidas usando uma segunda e terceira.
    //--- o cor das velas é diferente da cor das sombras
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- as sombras e contornos de cor verde; o corpo da vela de alta de cor branca; corpo da vela de baixa de cor vermelha
    #property indicator_color1  clrGreen,clrWhite,clrRed
    Assim, usando o estilo DRAW_CANDLES, é possível criar suas próprias opções personalizadas para colorir velas. Também é possível alterar dinamicamente todas as cores -no processo de trabalho do indicador- mediante a função PlotIndexSetInteger(índice_de_construção_DRAW_CANDLES, PLOT_LINE_COLOR, número_de_modificador, cor), aqui o número_de_modificador pode ter os seguintes valores:
    • 0 – cor do contorno e as sombras
    • 1 – cor do corpo da vela de alta
    • 2 – cor do corpo da vela de baixa
    //--- definimos a cor do contorno e das sombras
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
    //--- definimos a cor do corpo para a vela de alta
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
    //--- definimos a cor do corpo para a vela de baixa
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
  7. Foram corrigidos vários bugs e foi acelerado o trabalhar com o histórico de ticks usando as funções CopyTicks.
  8. Permitido usar operadores nas interfaces.

Market

  1. Foi corrigido o erro que, em alguns casos, levava a um pedido repetido de autorização na MQL5.community ao comprar no Mercado.

Tester

  1. Foi adicionada a tradução da interface do usuário para grego, malaio e hebraico.

Documentação atualizada.

29 setembro 2016
Plataforma web MetaTrader 5: otimização do código e novas possibilidades da interface
  • Foi adicionada a possibilidade de alterar a dimensão dos blocos do aplicativo web, incluindo a "Observação do mercado" e as janelas com gráficos de cotações.
  • Agora está disponível a classificação por colunas nas guias "Negociação" e "Histórico", na janela "Caixa de ferramentas". Além disso, a largura das colunas pode ser alterada.
  • Foram adicionados um instrumento de seleção rápida de símbolo é a guia "Detalhes."
  • Foi melhorado o código para acelerar o funcionamento geral do terminal web: a inicialização da conta, a seleção de símbolos e a negociação em si agora funcionam com uma maior velocidade.

16 setembro 2016
MetaTrader 5 build 1430: guia Exposure atualizada

Terminal


  1. Foi desenvolvido um novo algoritmo que ajuda a geração da guia "Ativos" para o mercado de ações. Agora o terminal adapta a apresentação de ativos dependendo do sistema de gerenciamento de riscos utilizado para a conta de negociação: Retail Forex, Futures ou Modelo de bolsa.

    A seção "Ativos" ajudará aqueles que negociam com moedas ou futuros a entender seu estado atual no mercado. As mesmas moedas podem se encontrar em uma variedade de instrumentos, sendo membros de um par de moedas, sendo a moeda básica, etc. Por exemplo, você pode ter posições opostas nos pares GBPUSD, USDJPY e GBPJY. Neste tipo de situação, será muito problemático compreender, por um lado, qual é a quantidade de moeda que você tem e, por outro, quanto você deve. No entanto, a situação é ainda mais complicada quando o número dessas posições é superior a 3. Nesta situação, é fácil proceder à verificação do estado final da conta na seção "Ativos".
    Examinemos um exemplo, no caso de ter três posições:

    Buy GBPJPY 1 lot at 134.027 — obtivemos 100 000 GBP, 134 027 000 JPY
    Sell USDJPY 1 lot at 102.320 — entregamos 100 000 USD, obtivemos 102 320 000 JPY
    Sell GBPUSD 1 lot at 1.30923 — entregamos 100 000 GBP, obtivemos 103 920 USD

    Nós compramos e vendemos simultaneamente 100 000 GPB. Em GBP temos 0, e a guia "Ativos" não exibe esta moeda. Em USD, em um caso, entregamos moeda, em outro, obtemos. Como a nossa moeda de depósito é também USD, a guia Ativos calcula o total e totaliza-o com o saldo atual. A moeda JPY participou em duas negociações, a guia também exibe o valor total.




    A seção ajudará aqueles que negociam segundo o modelo de bolsa a entender como usar o dinheiro. Ao contrário do modelo anterior, uma vez finalizada a negociação, o dinheiro é diretamente debitado/creditado do/ao saldo. Por exemplo, ao comprar EURRUB, você recebe imediatamente euros, e a partir do saldo debita-se o valor correspondente em rublos. Durante a negociação, mesmo o saldo da conta pode se tornar negativo, isto é: quando você está negociando com dinheiro emprestado, os ativos adquiridos agirão como fundos de manutenção. Nesta situação, a guia "Ativos" permitirá que você entenda facilmente o estado de negociação da conta.

    Adicionalmente, neste caso, exibe-se o valor de liquidação, isto é, a soma entre a quantidade de fundos na conta e o valor (resultado) de fechamento das posições atuais, de acordo com o preço de mercado.





  2. Foi corrigido o erro de exibição do tipo de negociação no histórico de operações de negociação.
  3. Foi corrigida a exibição da janela de notificação sobre riscos durante a reconexão da conta de negociação.
  4. Foi melhorado e corrigido o trabalho com o diálogo de seleção de instrumentos de negociação ao ter um número grande de símbolos (alguns milhares e mais).
  5. Foi corrigida a exibição de níveis nos indicadores embutidos, calculados com base na média móvel (Bollinger Bands, Adaptive Moving Average, etc.). O problema surgia ao construir os indicadores em uma janela separada.
  6. Foi corrigido o erro que, em alguns casos, não permitia colocar a ordem em um contrato futuro. O problema surgia se o preço na ordem coincidia com o limite superior ou inferior do preço do contrato.

MQL5

  1. Foi otimizada e acelerada a compilação de programas MQL5.
  2. Foi adicionado o suporte dos modificadores final e override para classes, estruturas e funções.

    Modificador final para classes e estruturas
    A presença do modificador final, ao declarar a estrutura ou classe, restringe a futura herança a partir dele. Se a classe (estrutura) não precisar de alterações futuras ou se essas alterações não estiverem disponíveis por razões de segurança, será bom que a declare com o modificador final. Quando você fizer isso, todos os métodos da classe também serão implicitamente considerados como final.
    class CFoo final
      {
      //--- corpo da classe
      };
     
    class CBar : public CFoo
      {
      //--- тело класса
      };
    Ao tentar herdar a partir da classe com o modificador final, como foi mostrado no exemplo acima, o compilador exibirá o erro:
    cannot inherit from 'CFoo' as it has been declared as 'final'
    see declaration of 'CFoo'

    Modificador override para a função
    O modificador override indica que a função declarada deve substituir o método da classe pai. Durante a substituição, o uso deste modificador permite evitar erros como, por exemplo, a alteração aleatória de assinatura. Outro exemplo mais detalhado seria, na classe básica, está definido o método func, ele aceita como argumento a variável do tipo int:
    class CFoo
      {
       void virtual func(int x) const { }
      };
    Além disso, o método é substituído na classe herdada:
    class CBar : public CFoo
      {
       void func(short x) { }
      };
    No entanto, de acordo com o erro, o tipo de argumento é alterado de int para short. De fato, neste caso, não acontece uma substituição, senão uma sobrecarga do método. Após agir segundo o algoritmo para determinar a função sobrecarregada, em determinadas situações, o compilador pode selecionar o método definido na classe base, em vez do método substituído.

    Para evitar esses erro, é preciso adicionar explicitamente o modificador override ao método override.
    class CBar : public CFoo
      {
       void func(short x) override { }
      };
    Se, durante a substituição, for alterada a assinatura do método, o compilador não poderá encontrar, na classe pai, o método com exatamente a mesma assinatura e exibirá o erro de compilação:
    'CBar::func' method is declared with 'override' specifier but does not override any base class method

    Modificador final para a função

    Ao contrário, o modificador final restringe a substituição de método nas classes-herdeiras. Se a realização do método for auto-suficiente é estiver totalmente concluída, declare-o com o modificador final, para que ele não seja modificado posteriormente.
    class CFoo
      {
       void virtual func(int x) final { }
      };
     
    class CBar : public CFoo
      {
       void func(int) { }
      };
     
    Ao tentar substituir o método com o modificador final, como foi mostrado no exemplo acima, o compilador exibirá o erro:
    'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
    see declaration of 'CFoo::func'
  3. Foi corrigido o erro de compilação de funções modelo com parâmetros padrão.

Market

  1. Foi corrigida a série de erros na classificação de produtos do Mercado-

Tester

  1. Foi corrigida a atualização das ordens de mercado atuais, nas posições abertas e posições no modo de teste visual.
  2. Foi removida a derrapagem (slippage) de execução de ordens Buy Limit e Sell Limit ao testar em instrumentos financeiros.
  3. Foi corrigido o erro que levava à geração de preços incorretos no modo de teste "Segundo os preços de abertura".
  4. Foi corrigida a formação de eventos OnTradeTransaction durante o teste.
  5. Ao testar com base em ticks reais, no diário do testador, são exibidas informações sobre a discrepância de preços dos ticks (bid ou last, dependendo do preço é baseada a barra) para os valores low ou high disponíveis na barra minuto.

MetaEditor

  1. Foram corrigidos os erros de exibição de dados nos arquivos do código fonte.

Documentação atualizada.

19 agosto 2016
MetaTrader 5 build 1395: aceleração de operações de negociação e melhorias no teste visual

Terminal

  1. Foi otimizado e consideravelmente acelerado o envio de comandos de negociação para o terminal de cliente.
  2. Foi corrigido um bug que não permitia executar programas MQL5 nos terminais, ao trabalhar em versões de 32 bits do Windows 10 build 1607.
  3. Foi adicionado ao navegador a exibição do modo de trabalho da conta de negociação, isto é, a cobertura e compensação (Hedging e Netting).
  4. Foi adicionado ao navegador um comando de menu de contexto para conetar a conta desejada ao terminal web.
  5. Foi redesenhada a seção do menu "Ajuda", foram anexados links para assistir a vídeos de treinamento.
  6. Foram corrigidos vários erros de interface, ao trabalhar em telas de alta resolução (4K).
  7. Foram corrigidos os erros na tradução da interface do usuário para persa.

MQL5

  1. Foram adicionados os ponteiros 'void *', o que permitirá criar coleções abstratas de objetos. Neste tipo de variável, você pode armazenar um ponteiro para um objeto de qualquer classe.
    Para a conversão inversa, recomenda-se usar o operador dynamic_cast<nome da classe *>(ponteiro void *). Se a conversão não for possível, o resultado será NULL.
    class CFoo { };
    class CBar { };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       void *vptr[2];
       vptr[0]=new CFoo();
       vptr[1]=new CBar();
    //---
       for(int i=0;i<ArraySize(vptr);i++)
         {
          if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
             Print("CFoo * object at index ",i);
          if(dynamic_cast<CBar *>(vptr[i])!=NULL)
             Print("CBar * object at index ",i);
         }
       CFoo *fptr=vptr[1];  // emitirá o erro de apresentação de ponteiros, vptr[1] não é um objeto CFoo
      }
    //+------------------------------------------------------------------+
  2. Foi adicionado o suporte do operador [] para a cadeia de caracteres, isso irá permitir obter um símbolo a partir da cadeia de caracteres no índice. Se o índice especificado sair dos limites da cadeia de carateres, o resultado será 0.
    string text="Hello";
    ushort symb=text[0];  // retorna o código do símbolo 'H'
    
  3. Foi adicionada a segunda opção do processador de eventos TesterInit com rótulo int OnTesterInit(void), ele pode retornar o código INIT_SUCCEEDED (0) ou INIT_FAILED (o qualquer valor diferente de zero). Se OnTesterInit retornar um valor diferente de zero, não começará a otimização.
  4. Foi corrigido o erro pelo cual diferentes sobrecargas da função ChartGetString dava um resultado diferente.

Tester

  1. Foram adicionados comandos e atalhos adicionais para o teste visual. Agora, os gráficos, tanto no testador visual como no terminal, podem ser configurados: alterar cores, controlar a exibição de vários elementos, aplicar modelos, etc.




  2.  Foi corrigido o trabalho da função Sleep em modo de teste "segundo os preços de abertura" ("Price Open").
  3.  Foi corrigido o erro que causava a formação de um estado incorreto das barras, ao trabalhar em períodos W1 e MN1.

MetaEditor

  1. MetaEditor: Foi adicionada a tradução da interface do usuário para chines tradicional.

Documentação atualizada.

15 julho 2016
MetaTrader 5 build 1375: canal de negociações e acesso a ticks durante os testes

Terminal

  1. Foi adicionado um canal de negociações no livro de ofertas.




    O que é um canal de negociações
    No canal de negociações, é exibida em tempo real uma lista de todas as operações realizadas na bolsa de valores. Para cada transação são mostrados o momento da sua execução, a direção (comprar ou vender), o preço e o volume. Para facilitar a análise visual, cada direção de transação é exibida com uma cor diferente: azul - comprar, rosa - venda, verde - direção não definida. O volume das transações é, adicionalmente, apresentado como um histograma.

    Como o canal de negociações ajuda a entender o mercado
    O canal de negociações vai permitir analisar os mercados mais detalhadamente. No canal, a direção da operação indica ao trader quem foi o iniciador da sua execução: o comprador ou vendedor. O volume de negociações executadas irá permitir compreender o comportamento dos participantes no mercado, isto é, a sua atividade e competitividade. Enquanto, a velocidade de negociação e o seu volume em determinados níveis de preços permitirá tirar conclusões sobre a importância destes níveis.

    Como usar os dados
    Além da análise visual da tabela, você também pode fazer o upload dos dados das transações para um arquivo CSV. Eles podem ser estudados imediatamente em qualquer outro aplicativo, por exemplo, no MS Excel. No arquivo, todos os dados são separados por um ponto e vírgula:
    Time,Bid,Ask,Last,Volume,Type
    2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
    2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
    2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
    Para salvar dados num arquivo, abra o menu de atalho:



    Para determinar com precisão a direção das operações, a plataforma de negociação da corretora deve ser atualizada para a versão 1375.
  2. Foi significativamente reduzido o tempo entre a chegada de um novo tick/alteração do livro de ofertas e a chamada do ponto de entrada OnTick e OnCalculate. Também foi reduzido entre a chegada do evento de alteração do estado de negociação e a chamada do ponte de entrada OnTrade e OnTradeTransaction. Assim, os programas MQL5 agora reagirão mais rapidamente aos eventos do mercado.
  3. As solicitações de negociação agora são enviadas mais rápido, ao usar a autenticação estendida com certificados SSL.
  4. Foi atualizada a tradução da interface do usuário em persa.
  5. Foi corrigida a exibição do comando de configuração SL/TP no menu de contexto do gráfico ao trabalhar no modo de cobertura.

Tester

  1. Foi adicionada a solicitação do histórico de ticks, durante o teste, usando a função CopyTicks. Anteriormente, essa função não estava funcionando no testador de estratégias.

    • No modo "Cada tick", a função retorna o histórico de ticks gerados. Você pode solicitar não mais de 128 000 dos últimos ticks.
    • No modo "Cada tick na base de ticks reais", a função devolve o histórico de ticks reais. A profundidade dos dados solicitados está restrita apenas pela disponibilidade desses dados. No entanto, tenha em mente que os últimos 128 000 ticks são armazenados na cache do testador de estratégias, adicionalmente, a solicitação destes dados será realizada com suficiente rapidez. Além disso, é possível solicitar um histórico mais profundo a partir do disco rígido, porém, a execução desse pedido levará muito mais tempo.
    • Nos modos "Apenas preços de abertura" e "OHLC em M1", a função ainda não vai funcionar, pois o histórico de ticks não se cria na realidade.

  2. Foi adicionado o suporte para tempo com exatidão de um milissegundo. Anteriormente, no testador de estratégias, um quantum era igual a um segundo.

    • Agora as funções EventSetMillisecondTimer e Sleep trabalham com mais precisão no testador de estratégias.
    • Além disso, melhorou a precisão de emissão de ticks durante o teste dos conselheiros multi-moedas. Anteriormente, ao pôr vários ticks num segundo (volume de ticks da barra minutos maior que 60), todos eles ficavam com o mesmo tempo. Ao testar os conselheiros mono-moeda, isto realmente não importa, porque os ticks são apenas transmitidos seqüencialmente para o conselheiro. No entanto, quando testamos em vários pares, é importante saber a partir de qual par o tick veio primeiro. Em versões anteriores, os ticks de cada símbolo eram passados para o conselheiro seqüencialmente: primeiro, todos os ticks por segundo para um símbolo e, em seguida, todos os ticks, de forma diferente. Agora, eles são enviados em milissegundos.

      Ao usar ticks reais para o teste, os milissegundos são tomados a partir dos dados fonte do tick. Quando os ticks são gerados, os milissegundos são definidos em conformidade com o volume de tics. Por exemplo, se 3 ticks cabem num segundo, o seu tempo em milissegundos será igual a 000, 333 e 666

  3. Nos modos "Abrir apenas preços" e "OHCL em 1M", a execução de ordens pendentes e de ordens SL/TP agora é realizada segundo os preços indicados nas ordens, e não pelo preço atual no momento da execução. O algoritmo de execução, segundo os preços de mercado, usado nos modos de precisão (cada tick e ticks reais), não é adequado para modos menos precisos. Em alguns modos, os ticks intermediários não são gerados, portanto, a diferença entre a ordem solicitada e o preço atual de mercado (Aberto ou OHLC) pode ser significativa. A execução de ordens, ao preço solicitado no modo, "Abrir apenas preços" e "OHLC em M1", fornece resultados de testes mais precisos.

  4. Foi adicionado o suporte para o teste em tempo real (avançado) no modo visual. Agora, para o bektest e o teste avançado, serão abertas duas janelas separadas para visualização do teste, o que permitirá que você compare comodamente os resultados do trabalho dos conselheiros em períodos diferentes.




    A janela de teste avançado só é aberta após a conclusão dos testes no período principal.

  5. Tester: No gráfico de teste, agora em vez do nível de margem, é exibida a carga do depósito, ela é calculada como a razão margem/capital (margin/equity).


  6. Foi corrigido o cálculo da comissão em porcentagens anuais.Ъ

  7. Foi corrigido o recálculo e a exibição do saldo no gráfico formado durante o teste.

MQL5

  1. Foi alterado o comportamento da função OrderSend, durante a colocação da ordem, modificação e cancelamento das ordens. As alterações apenas afetam as ordens enviadas para sistemas de negociação externos. Anteriormente, o controle da função OrderSend era devolvido após a colocação (processamento) bem sucedida da ordem no servidor da corretora. Agora o controle é retornado apenas depois que o servidor da corretora recebe uma notificação de um sistema de negociação externo dizendo que a ordem foi colocada com sucesso nesse sistema.

    Abaixo encontra-se uma representação esquemática do (seta vermelha) comportamento anterior e atual da função:




  2. Foi adicionado o campo retcode_external -código de erro no sistema de negociação exterior- para a estrutura do resultado de negociação MqlTradeResult. O uso e os tipos desses erros dependem da corretora e do sistema de negociação externo para o qual as operações são enviadas. Por exemplo, os valores de retcode_external preenchidos pela bosa de Moscou diferem dos retornado pela DGCX.

  3. Foram adicionadas as propriedades CHART_EXPERT_NAME e CHART_SCRIPT_NAME para a enumeração ENUM_CHART_PROPERTY_STRING. Agora, usando a função ChartGetString, é possível calcular os nomes do conselheiro e/ou script, anexados ao gráfico, definidos pelo parâmetro chart_id.

Signals

  1. Foi corrigido o erro, devido ao qual podia falhar a cópia da posição oposta (close by).
  2. Foi melhorada a comparação automática dos pares de moedas contendo RUB e RUR.

Mercado

  1. : Foi corrigida a classificação por categoria do produto.

MetaEditor

  1. Foi corrigida a configuração do foco, no campo do texto de substituição, ao abrir a caixa de diálogo de substituição.
  2. Foi corrigida substituição de texto em massa, ao pesquisar para cima, a partir da posição atual.


Documentação atualizada.


5 julho 2016
Plataforma web MetaTrader 5: lançamento oficial

Após 2 meses de testes públicos, anunciamos o lançamento oficial da versão web da plataforma multimercado MetaTrader 5. Ela permite negociar nos mercados financeiros através de qualquer navegador em qualquer sistema operacional. E, para isso, não é necessário instalar nenhum programa no computador, de fato, basta ter acesso à internet ou qualquer navegador web.

O aplicativo combina as vantagens chave da plataforma desktop (velocidade, faceta multimercado e características de negociação melhoradas) com a comodidade e o caráter multi-plataforma. A principal novidade da versão atualizada é o livro de ofertas para avaliar a profundidade do mercado, bem como a colocação num clique de ordens de mercado e pendentes.

A plataforma web permite realizar análise técnica e executar negociações da mesma forma como na versão desktop. No aplicativo, você tem à sua disposição:

  • sistemas de compensação e de cobertura de registro de posições,
  • 31 indicadores técnicos,
  • 24 objetos analíticos,
  • negociação em um clique e um conjunto completo de ordens de negociação,
  • uma interface em 41 idiomas.
13 maio 2016
MetaTrader 5 build 1340: transferência cômoda de certificados para terminais móveis e melhorias no testador

Terminal

  1. Agora os certificados, para se conectar no modo de alta segurança, podem ser comodamente transferidos a partir da versão desktop para os terminais móveis.

    A plataforma de negociação suporta uma autorização estendida, isto é, além de uma senha, a conta estará protegida por um certificado SSL especial. O certificado consta de um arquivo gerado para a conta no servidor de negociação. Este arquivo é único e na sua ausência é impossível ter acesso à conta.

    Anteriormente, quando você tinha de usar uma conta na MetaTrader 5 para iPhone/iPad ou Android, era solicitado e gerado, usando o terminal para PC, um certificado cujo arquivo era necessário transferir e instalar manualmente no seu dispositivo. Agora o certificado pode ser transferido comodamente.

    Como ele é transferido

    A transferência do certificado é realizada através do servidor de negociação:

    • Primeiro, o certificado é criptografado no terminal para PC, quer dizer, o titular da conta indica a senha com a qual o certificado será criptografado através do confiável algoritmo AES-256. Essa senha é conhecida apenas pelo usuário e não é enviada para o servidor.
    • Em seguida, o certificado criptografado é enviado para o servidor onde será armazenado, mas não por mais de uma hora, até ser recebido via terminal móvel.
    • Para obter um certificado, o usuário deve conectar-se à conta através de um terminal móvel. Depois de se conectar, é solicitada a importação do certificado. Para fazer isso, você deve especificar a senha com a qual foi criptografado no terminal desktop.

    O certificado é transferido de forma segura, mais concretamente, o servidor de negociação é usado apenas como um ponto de armazenamento intermediário, a criptografia ocorre no lado do cliente, a senha do certificado não é transmitida ou armazenada no servidor de negociação.

    Como transferir certificados
    Conecte-se à conta no terminal desktop e selecione "Transferir certificado" no seu menu de contexto:



    Indique a senha mestra para confirmar que ele pertence a você. Em seguida, defina uma senha com a qual o certificado será protegido antes de o enviar para o servidor. A senha deve ter não menos de 8 dígitos.

    Após o certificado ser enviado com sucesso para o servidor, abra o terminal móvel e conecte-se à conta. Ser-lhe-á solicitado que importe o certificado. Concorde e digite a senha indicada no terminal desktop.



    Você pode ver o certificado importado na seção "Sobre o programa — Certificados".
    Em breve serão lançados terminais móveis MetaTrader 5 atualizados para iPhone/iPad e Android com suporte para transferência de certificados.

Tester

  1. Foi alterado o algoritmo de funcionamento e execução das ordens pendentes e ordens SL/TP para testar de modo correto. Possibilidades estendidas para testar visualmente.

    O que mudou para os instrumentos financeiros
    No mercado real, no que se refere a instrumentos financeiros, tanto a construção de gráficos como o a ativação de ordens stop são realizadas segundo o último preço de transação (Last). A ativação de ordens limit é realizada segundo os preços Bid/Ask. Além disso, a execução de todos os tipos de ordens sempre é realizada segundo os preços atuais de mercado Bid/Ask. O testador de estratégias foi alterado para que esteja mais perto das condições reais:
      Foi Tornou-se
    Ativação Todos os tipos de ordens pendentes e ordens SL/TP segundo o Bid/Ask Ordens limit segundo o Bid/Ask
    Ordens stop-limit e SL/TP segundo o Last
    Execução Todos os tipos de ordens pendentes e ordens SL/TP segundo o preço na ordem anunciada Todos os tipos de ordens pendentes e ordens SL/TP segundo o Bid/Ask no momento de ativação

    Examinemos um exemplo no instrumento Si-6.16. Tendo os atuais preços Bid=72570, Ask=72572, Last=72552 colocamos a ordem Buy Stop com preço de ativação 72580. No fluxo de preços, obtemos uns novos preços:

    • Bid=72588
    • Ask=72590
    • Last=72580

    Nos instrumentos financeiros, o peço Last é o gatilho para a ativação de ordens stop. Por isso, a obtenção, no fluxo de preços, dum Last = 72 580 resultou na ativação das ordens Buy Stop. Anteriormente, o preço 72.580 era utilizado precisamente para a execução dessa ordem. Este comportamento era impróprio porque o preço Ask=72580, para a execução de operações de compra no mercado, não existia.


    No testador atualizado, usa-se o preço de compra atual Ask=72590, e a ordem Buy Stop executa-se exatamente por ele. Assim, no testador, um novo algoritmo de execução de transações reflete mais precisamente o mercado real. Ao usar o algoritmo antigo, a operação de negociação era realizada segundo um preço que não era de mercado, o que fazia com que os resultados do teste fossem imprecisos.

    O que mudou para instrumentos de mercado de balcão (OTC)
    Para os instrumentos OTC, o algoritmo de ativação continua a ser o mesmo: para todos os tipos de ordens pendentes e ordens SL/TP são utilizados os preços Bid e Ask. Foi alterado o modo de execução: anteriormente, realizava-se segundo o preço indicado na ordem, e agora usam-se os preços atuais do mercado Bid e Ask, no momento da ativação.

    O novo em testes visuais
    Agora, ao realizar o teste visual, são exibidas as linhas do preço máximo Ask e do preço mínimo Bid para cada barra. Neste gráfico é mais fácil testar conselheiros em instrumentos financeiros, adicionalmente, nele tanto a construção de barras como a ativação de ordens são realizadas segundo os preços Last, e a execução de ordens de mercado é feita segundo Bid e Ask.



    New option on the visual testing chart: navigation to a specified date. Double-click on the chart and enter the desired date and time. It is also possible to navigate to any order or trade: double-click on the appropriate trading operation on the Trade, History or Operations tab.
  2. Foi expandido o registro no diário do loading do histórico de preços e de ticks antes de iniciar o teste. Agora, no diário, ao finalizar o loading do histórico, será exibida uma janela com o volume de dados carregados e o tempo gasto durante o loading:
    2016.05.10 12:47:53    Core 1    5.10 Mb of history processed in 0:00.842
    2016.05.10 12:47:53    Core 1    GBPUSD: history synchronization completed [5225 Kb]

MQL5

  1. Foi corrigido o erro pelo qual, às vezes, a função CopyTicks retornava menos ticks do que era solicitado.
  2. Foi corrigido o erro ao gerar funções-modelo.
  3. Documentação atualizada.
  4. Correções de crash-logs.

A atualização estará disponível através do sistema LiveUpdate.

12 maio 2016
Plataforma web MetaTrader 5: a versão beta já está disponível para testes

Em resposta aos numerosos pedidos dos traders foi desenvolvida uma versão web da plataforma MetaTrader 5. O novo produto combina a comodidade e o caráter multi-plataforma com as vantagens da quinta versão para PC, isto é: velocidade, faceta multimercado e características de negociação melhoradas.

A plataforma web MetaTrader 5 agora está disponível no site da MQL5.community. Ela permite negociar nos mercados financeiros através de qualquer navegador em qualquer sistema operativo (Windows, Mac, Linux). E, para isso, não precisa de instalar nenhum programa adicional, de fato, basta ter acesso à internet.

Na versão beta, os traders têm imediatamente à sua disposição:

  • um sistema de cobertura de registro de posições
  • 30 indicadores técnicos,
  • 24 objetos analíticos,
  • um conjunto completo de ordens de negociação MetaTrader 5,
  • uma interface em 41 idiomas.
O lançamento da versão beta é destinado para fornecer testes públicos avançados e permitir os traders avaliarem os novos recursos.
22 abril 2016
MetaTrader 5 build 1325: negociação com cobertura e teste de ticks reais

Terminal

  1. Para ampliar as possibilidades dos retail traders que negociam no mercado Forex, à plataforma foi adicionada a cobertura, isto é, um segundo sistema de registro. Agora, segundo um instrumento, você pode ter várias posições, incluindo posições opostas. Isto permite implementar estratégias de negociação com o assim chamado “bloqueio”, dito de outro modo, se o preço estiver contra o trader, ele terá a possibilidade de abrir uma posição na direção oposta.

    O novo sistema de registro é análogo ao utilizado na MetaTrader 4, o que faz com que seja familiar para os traders. Além disso, eles poderão utilizar todas as vantagens da quinta versão da plataforma: execução de ordens usando várias transações (incluindo a parcial), o testador multi-moeda e multi-fio (multithread) com o apoio da rede de computação em nuvem MQL5 Cloud Network e muitas outras.

    Agora, você pode em uma conta negociar na bolsa, onde se utiliza a compensação, e pode ter apenas um instrumento segundo uma posição. Além disso, na mesma plataforma, mas em outra conta, você pode negociar no mercado Forex e utilizar a cobertura.

    Como abrir uma conta com cobertura e onde procurar o tipo registro de posições
    O tipo de registro de posições é definido no nível da conta, ele é exibido no cabeçalho da janela do terminal e, também, no diário:



    Para abrir uma conta demo com cobertura, habilite a opção correspondente:




    Sistema de compensação
    Este sistema de registro implica que num dado momento, possa haver apenas uma posição aberta, segundo um mesmo símbolo, na conta:

    • Se existir uma posição segundo um instrumento, ao realizar uma transação na mesma direção ocorrerá o aumento do volume dessa posição.
    • Ao realizar uma transação na direção oposta, ocorrerá a diminuição do volume da posição existente, quer o seu fechamento (ao realizar uma transação de volume idêntico ao da posição atual), quer a reversão (se o volume da transação oposta for superior ao da posição atual).

    Neste caso, não importa a ação pela qual é realizada a transação na direção oposta, por outras palavras, é indiferente se foi resultado da execução de uma ordem de mercado ou devido à ativação de uma ordem pendente.

    Abaixo mostramos um exemplo da execução de duas transações de compra de EURUSD com um volume de 0,5 lotes cada:


    Como resultado da execução destas transações, temos uma posição geral com um volume de 1 lote.

    Sistema de cobertura
    Este sistema de registro permite que você tenha múltiplas posições do mesmo instrumento, incluindo em direções opostas.

    Se, segundo um instrumento de negociação, existir uma posição aberta e o trader executar uma nova transação (ou se estiver ativa uma ordem pendente), ocorrerá a abertura de uma nova posição. A posição atual não será alterada.

    Abaixo mostramos um exemplo da execução de duas transações de compra de EURUSD com um volume de 0,5 lotes cada:


    Como resultado da execução destas transações, temos a abertura de duas posições distintas.

    Novo tipo de operação de negociação Close By
    Para contas com cobertura de registro de posições foi adicionado um novo tipo de operação de negociação, isto é, o fechamento de uma posição usando uma oposta. Esta operação permite fechar simultaneamente duas posições opostas de um mesmo instrumento. Se as posições opostas tiverem diferentes números de lotes, então, permanecerá aberta apenas uma das duas ordens. O seu volume será igual à diferença dos lotes de duas posições fechadas, e a direção da posição e o preço de abertura serão iguais à maior (em volume) das posições fechadas.

    Em comparação com o fechamento individual de duas posições, o fechamento da oposta permite ao trader poupar um spread:

    • Com o fechamento individual, o trader paga duas vezes pelo spread: fecha a compra ao menor preço (Bid), e a venda, ao maior (Ask).
    • Ao fechar a primeira posição utilizando uma oposta, usa-se o preço de abertura da segunda posição, e para fechar a segunda posição é utilizado o preço de abertura da primeira.


    Ao fechar uma posição usando uma oposta, você estará colocando uma ordem do tipo "close by". Nos comentários estão indicados os bilhetes das posições fechadas. Ao executar duas transações do tipo "out by", estará sendo fechado um par de posições opostas. O tamanho do lucro/perda brutos, resultante do fechamento de duas posições, é indicado apenas numa única transação.


  2. Para complementar a cobertura, na plataforma foi acrescentada a possibilidade de transferir contas a partir da MetaTrader 4. Agora as corretoras podem, no modo automático, migrar as contas para a MetaTrader 5, juntamente com todas as operações, nomeadamente, ordens abertas e pendentes, bem como todo o histórico de negociação.

    Ao conectar pela primeira vez a conta, transferida a partir da MetaTrader 4, aparecerá uma janela de boas-vindas. A transferência é realizada de forma segura. Para começar a trabalhar, indique a senha da conta usada anteriormente na MetaTrader 4 e, em seguida, defina uma nova senha.



    Uma vez conectado, você poderá trabalhar normalmente como se a conta tivesse sido originalmente aberta na MetaTrader 5, além disso, todo o histórico das transações da MetaTrader 4 será salvo automaticamente na nova conta.

    Quando fizer a importação, os bilhetes de ordens e posições (incluindo as ordens do histórico) não serão salvos, uma vez que uma entrada no histórico de negociação MetaTrader 4 pode corresponder até a 4 entradas no histórico da MetaTrader 5. São colocados novos bilhetes para todas as entradas de negociação.

    Os números das contas podem ser salvos ou substituídos por novos, dependendo de como a corretora faça a importação.

  3. Foi adicionado um bate-papo. Agora, diretamente na plataforma, você pode conversar com amigos e colegas na MQL5.community. No bate-papo são exibidas todas as mensagens pessoais da conta MQL5. Para começar a conversar, acesse a sua conta diretamente da caixa de bate-papo ou a partir das configurações da plataforma: Ferramentas -> Opções -> Comunidade.




  4. Foi simplificada a janela de abertura da conta demo e adicionada a possibilidade de abrir contas com cobertura. 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, alavancagem e possibilidade de cobertura.



  5. Para começar a trabalhar rapidamente com a plataforma, foi adicionada a seleção automática da conta demo. Se, na plataforma, ainda não houver uma conta, então, ao iniciar o trabalho, será selecionada a conta demo. Após abrir a conta com sucesso, ela será imediatamente conectada.

  6. Agora todas as posições têm o seu próprio bilhete ou número único. Geralmente, ele corresponde ao bilhete da ordem, segundo o qual a posição foi aberta, exceto nos casos em que as operações de serviço no servidor tenham alterado o bilhete da ordem. Por exemplo, quando os swaps se acumulam com a reabertura de uma posição. O bilhete será atribuído automaticamente a todas as posições anteriormente abertas, após a atualização para uma nova versão do terminal.



  7. Foi corrigida a colocação de posições Stop Loss e Take Profit, ao estabelecer uma ordem de mercado que provoque a alteração da direção da posição. Os anteriores níveis correspondentes não foram colocados na nova posição.
  8. Foi corrigida a exibição dos preços com quatro ou mais dígitos após o ponto decimal nos controles do painel de negociação em um clique.
  9. Foi corrigido o erro de exibição de notícias na janela de visualização de impressão.
  10. Foram corrigidos os bugs de exibição do gráfico de ticks.
  11. Foi corrigida a abertura do livro de ofertas após um desligamento de emergência do terminal.
  12. Foi adicionada a possibilidade de verificar as ordens de mercado, ao exibir os elementos de gerenciamento do painel de negociação em um clique.
  13. Foi otimizado o cálculo de lucro e margem, quando existe um grande número de ordens e posições abertas.
  14. Foi adicionada a tradução da interface do usuário para malaio.
  15. Foi completamente atualizado o guia de usuário. Novo design, capturas de tela interativas e vídeos embutidos, tudo para fazer com que a aprendizagem, utilizando o MetaTrader 5, seja simples e cômoda.



  16. Foi corrigida a exibição de objetos gráficos no modo "Gráfico acima".

Tester

  1. Foi adicionada a possibilidade de testar robôs de negociação e indicadores técnicos de acordo com o histórico de ticks reais.

    O teste e a otimização de acordo com ticks reais são os que mais se aproximam das condições reais. Em vez de ticks gerados com base em dados de minutos, são usados ticks reais (segundo instrumentos financeiros) acumulados pela corretora. Esses são ticks provindos da bolsa e dos provedores de liquidez.

    Para começar a testar ou a otimizar, segundo ticks reais, selecione o respectivo modo de teste de estratégias:



    Os dados de ticks são significativamente maiores do que os dados de minutos. Ao executar pela primerira vez o teste, o seu download pode levar muito tempo. Os downloads dos dados de ticks são armazenados por meses em arquivos TKC no catálogo \bases\[nome do servidor de negociação]\ticks\[nome do símbolo]\.

    Particularidades ao testar ticks reais
    Ao testar com ticks reais, o spread nos limites da barra de minutos pode ser alterado, enquanto ao gerar ticks dentro nessa barra, é utilizado o spread fixado na barra correspondente.

    Se, segundo um instrumento, for transmitido o livro de ofertas, as barras serão construídas a partir dos preços de execução da última transação Last. Caso contrário, o testador tentará construir barras a partir dos preços Last. Caso esses preços não existam, então, serão feitas a partir dos preços Bid. O OnTick ativa-se em todos os ticks, independentemente de neles existir, ou não, preço Last.

    Por favor, note que as transações são sempre executadas segundo os preços Bid e Ask, mesmo se o gráfico for construído a partir dos preços Last. Por exemplo, se, para a negociação, o expert usar apenas o preço de abertura da barra (particularmente, o Moving Average embutido), então, você receberá um sinal de acordo com um preço (Last), mas a transação será executada de acordo com outro preço (Bid ou Ask, dependendo da direção). Ao usar o modo de geração "Todos os ticks", as barras serão construídas de acordo com os preços Bid, mas as transações serão executadas segundo os preços Bid e Ask. Com isso, o Ask é calculado como o Bid + o spread fixo correspondente à barra de minutos.

    Se no histórico do símbolo existir uma barra de minutos, mas, se, nesse minuto, não houver dados de ticks, o testador irá gerar ticks no modo "Todos os ticks". Isso permite que você teste o expert de acordo com o período previsto, no caso de os dados de ticks estarem incompletos na corretora. Se, no histórico do símbolo, não existir uma barra de minutos, mas, se, nesse minuto, houver dados de ticks, então, esses ticks serão ignorados. Os dados de minutos são considerados mais confiáveis.

    Teste usando ticks reais na rede de cálculo em nuvem MQL5 Cloud Network
    O teste, a partir dos ticks reais, está disponível não só em agentes locais e remotos, mas também na MQL5 Cloud Network. A otimização de estratégias, que poderia levar meses, é agora feita em poucas horas graças ao poder de processamento de milhares de computadores.

    Para testar usando a rede ative o uso de agentes de nuvem:



    O teste com ticks reais usando a MQL5 Cloud Network pode consumir uma grande quantidade de tráfego de Internet. Isto pode afectar significativamente o custo final pago pelo serviço de rede em nuvem. 
  2. Foi corrigido o erro onde a comissão não era calculada para alguns tipos de instrumentos de negociação.
  3. Foi corrigido o preenchimento do campo Expert nas ordens de negociação que apareciam como resultado da SL/TP, em conformidade com o valor do campo Expert na posição respectiva. Anteriormente não era preenchido.
  4. Foi corrigida a alternância para a guia de resultados da optimização normal e em tempo real.
  5. Foi corrigido o cálculo e exibição do indicador "Envelopes".
  6. Foi otimizada a execução do teste visual.
  7. Foi otimizado o cálculo de lucro e de margem quando haver um grande número de ordens e posições abertas.
  8. Foi otimizada a execução de operações ao negociar em alta-frequência.
  9. Agora a sincronização do histórico não ocorre devido às configurações de um símbolo fora de funcionamento e não requerido pelas cotações atuais. Por exemplo,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE и т.п. Anteriormente, a configuração de um símbolo fora de funcionamento fazia com que o histórico deste símbolo se começasse a sincronizar.
  10. Foi corrigido o cálculo fixo em porcentagens anuais.

MQL5

  1. MQL5: Foi alterado o formato dos arquivos executáveis EX5, devido à adição de novos recursos na linguagem MQL5 e ao surgimento da cobertura na plataforma MetaTrader 5. Todos os antigos programas EX5, compilados no MetaEditor de builds anteriores, irão funcionar corretamente após a atualização, de modo que a compatibilidade de baixo para cima é totalmente mantida.

    Ao mesmo tempo, os programas EX5 compilados nos builds 1325 e superiores não irão funcionar nos terminais de builds antigos, devido à ausência de compatibilidade.

  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 tornou-se abstrata e não pode ser criada
      };
    //--- descendente 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
     };
    
    //--- examples of wrong use
    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 uso correto
    new CCat;  // não há erro - a classe CCat não é abstrata
    CCat cat;  // não há erro - 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, chamá-la:
    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;           // error: neg is not of  int (int,int) type
    Print(func_ptr(10));    // error: there should be two parameters
    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 estrutura da solicitação de negociação MqlTradeRequest foram adicionados dois novos tipos de campos:

    • position — bilhete de posição. Deve ser preenchido, ao negociar com cobertura ao alterar e fechar a posição para a sua identificação inequívoca. Ao negociar com sistema de cobertura de registro, o preenchimento deste campo não tem efeito, porque a identificação de posições ocorre segundo o nome do instrumento de negociação.
    • position_by — bilhete da posição oposta. Utiliza-se ao fechar uma posição usando outra oposta, se estiver aberta no mesmo instrumento, mas na direção oposta. É utilizado apenas na cobertura do registro de posições.

  5. Na enumeração dos tipos de operações ENUM_TRADE_REQUEST_ACTIONS foi adicionado o valor TRADE_ACTION_CLOSE_BY — fechamento da posição oposta. É utilizado apenas na cobertura do registro de posições.

  6. Na enumeração das propriedades das ordens, transações e posições, foram adicionados os bilhetes correspondentes às operações de negociação:

    • No ENUM_ORDER_PROPERTY_INTEGER foi adicionada a propriedade ORDER_TICKET — bilhete da ordem. Um número exclusivo atribuído a cada ordem.
    • No ENUM_DEAL_PROPERTY_INTEGER foi adicionada a propriedade DEAL_TICKET — bilhete da transação. Um número exclusivo atribuído a cada transação.
    • No ENUM_POSITION_PROPERTY_INTEGER foi adicionada a propriedade POSITION_TICKET — bilhete da posição. Um número exclusivo atribuído a cada posição. Geralmente, ele corresponde ao bilhete da ordem, segundo o qual a posição foi aberta, exceto nos casos em que as operações de serviço no servidor tenham alterado o bilhete da ordem. Por exemplo, quando os swaps se acumulam com a reabertura de uma posição. Para localizar a ordem, segundo a qual foi aberta a posição, você deve utilizar a propriedade POSITION_IDENTIFIER. Valor POSITION_TICKET corresponde a MqlTradeRequest::position.

  7. Na enumeração dos tipos de ordens ENUM_ORDER_TYPE foi adicionado o valor ORDER_TYPE_CLOSE_BY — ordem para fechamento da posição oposta.
  8. Na enumeração das propriedades das ordens ENUM_ORDER_PROPERTY_INTEGER foi adicionado o valor ORDER_POSITION_BY_ID — identificador da posição oposta para ordens do tipo ORDER_TYPE_CLOSE_BY.
  9. Na enumeração das direções da transação ENUM_DEAL_ENTRY foi adicionado o valor DEAL_ENTRY_OUT_BY — a transação foi efetuada como resultado do fechamento da posição oposta .
  10. À estrutura da transação financeira MqlTradeTransaction foram adicionados dois campos análogos:

    • position — bilhete da posição que foi afetado pela transação. Preenche-se para transações relacionadas com o processamentos das ordens de mercado (TRADE_TRANSACTION_ORDER_* exceto TRADE_TRANSACTION_ORDER_ADD, onde o bilhete da posição ainda não foi atribuído) e o histórico de ordens (TRADE_TRANSACTION_HISTORY_*).
    • position_by — bilhete da posição oposta. Utiliza-se ao fechar uma posição usando outra oposta, se estiver aberta no mesmo instrumento, mas na direção oposta. Preenche-se apenas para ordens de fechamento da posição oposta (close by) e transações de fechamento da oposta (out by).

  11. Adicionada a função PositionGetTicket — retorna o bilhete da posição segundo o índice na lista de posições abertas e seleciona automaticamente essa posição para trabalhar no futuro com ela usando a função PositionGetDouble, PositionGetInteger, PositionGetString.
    ulong  PositionGetTicket(
       int  index      // número na lista de posições
       );

  12. Adicionada a função PositionSelectByTicket — seleciona uma posição aberta para trabalhar no futuro com ela segundo o bilhete indicado.
    bool  PositionSelectByTicket(
       ulong   ticket     // bilhete da posição
       );

  13. Na numeração das propriedades de instrumentos financeiros ENUM_SYMBOL_INFO_DOUBLE foi adicionado o valor SYMBOL_MARGIN_HEDGED — tamanho do contrato ou margem para um lote de posições sobrepostas (posições com várias direções segundo um mesmo símbolo).

    • Se, para o instrumento, tiver sido estabelecida uma margem inicial (SYMBOL_MARGIN_INITIAL), então, a margem de cobertura é indicada como valor absoluto (em dinheiro).
    • Se não se tiver estabelecido uma margem inicial (igual a 0), então, no campo SYMBOL_MARGIN_HEDGED indica-se o tamanho do contrato que será usado no cálculo da margem segundo a fórmula correspondente ao tipo de instrumento de negociação (SYMBOL_TRADE_CALC_MODE).

    As particularidades do cálculo de margem no sistema de cobertura de registro de posições está descrito no guia do usuário da plataforma de negociação MetaTrader 5.

  14. Na enumeração das propriedades da conta ENUM_ACCOUNT_INFO_INTEGER foi adicionado o valor ACCOUNT_MARGIN_MODE — modo de cálculo de margem para a conta de negociação atual:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — Usa-se para o mercado de balcão ao registrar as posições no modo "compensação" (segundo um símbolo pode existir apenas uma posição). O cálculo da margem é realizado com base no tipo de instrumento (SYMBOL_TRADE_CALC_MODE).
    • ACCOUNT_MARGIN_MODE_EXCHANGE — usa-se para o mercado de bolsa. O cálculo da margem é realizado com base nos descontos indicados nas configurações dos instrumentos. Os descontos são determinados pelo corretor, no entanto, não podem ser inferiores aos valores definidos pela bolsa de valores.
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — usa-se para o mercado de balcão ao ser realizado o registro independente de posições ("cobertura", segundo um símbolo, podem existir várias posições). O cálculo da margem realiza-se com base no tipo de instrumento (SYMBOL_TRADE_CALC_MODE) e tendo em conta o tamanho da margem de cobertura (SYMBOL_MARGIN_HEDGED).

  15. 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.

  16. 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.

  17. Corrigido o retorno do resultado da chamada da função SendFTP. Anteriormente, após o envio bem-sucedido, retornava o valor FALSE em vez de TRUE.
  18. Corrigido o erro na função StringConcatenate, que, em alguns casos, causava o erro de execução "Access violation".
  19. Corrigidos vários bugs ao trabalhar com funções-modelos.
  20. Agora as funções Print, Alert e Comment podem exibir seqüências maiores que 4.000 caracteres.
  21. Corrigido o erro na função ArrayCompare que aparecia quando a matriz era comparada consigo mesma.
  22. À biblioteca padrão foi adicionado o suporte de negociação com cobertura:

    CPosition
    Foram adicionados os métodos:

    • SelectByMagic — seleciona a posição segundo um número mágico e um símbolo para trabalhos futuros.
    • SelectByTicket —seleciona a posição segundo um bilhete para trabalhos futuros.

    CTrade
    Foram adicionados os métodos:

    • RequestPosition — obtém os bilhetes de posição.
    • RequestPositionBy — obtém os bilhetes da posição oposta.
    • PositionCloseBy — fecha a posição com o bilhete indicado da posição com direção oposta.
    • SetMarginMode — define o modo de cálculo da margem de acordo com as configurações da conta atual.

    Foi adicionada a sobrecarga de métodos:

    • PositionClose — fecha a posição segundo o bilhete.
    • PositionModify — modifica a posição segundo o bilhete.

    CAccountInfo
    Foram alterados os métodos:

    • MarginMode — agora obtém o modo para o cálculo da margem. Anteriormente, trabalhava analogamente ao novo método StopoutMode.
    • MarginDescription — agora obtém o modo de cálculo para a margem como para a linha. Anteriormente, trabalhava analogamente ao novo método StopoutModeDescription.

    Foram adicionados os métodos:

    • StopoutMode — obtém o modo para definir o nível mínimo de garantia.
    • StopoutModeDescription — obtém o modo para definir o nível mínimo de garantia como para a linha.

    CExpert
    Foram adicionados os métodos:

    • SelectPosition — seleciona uma posição para o subseqüente trabalho com ela.

  23. Foram adicionadas várias correções à biblioteca padrão.
  24. Foi corrigido o erro de download das bibliotecas DLL.
  25. Foi adicionado o suporte para construtores de escalas de classes.

Sinais

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

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.
Documentação atualizada.
1 abril 2016
MetaTrader 5 Platform Build 1295

Terminal

  1. Para ampliar as possibilidades dos retail traders que negociam no mercado Forex, à plataforma foi adicionada a cobertura (um segundo sistema de registro). Agora, segundo um instrumento, você pode ter várias posições, incluindo posições opostas. Isto permite implementar estratégias de negociação com o assim chamado “bloqueio”, dito de outro modo, se o preço estiver contra o trader, ele terá a possibilidade de abrir uma posição na direção oposta.

    O novo sistema de registro é análogo ao utilizado na MetaTrader 4, o que faz com que seja familiar para os traders. Além disso, eles poderão utilizar todas as vantagens da quinta versão da plataforma: execução de ordens usando várias transações (incluindo a parcial), o testador multi-moeda e multi-fio (multithread) com o apoio da rede de computação em nuvem MQL5 Cloud Network e muitas outras.

    Agora, você pode em uma conta negociar na bolsa de valores, onde se utiliza a compensação, e pode ter apenas um instrumento segundo uma posição. Além disso, na mesma plataforma, mas em outra conta, você pode negociar no Forex e utilizar a cobertura.

    Como abrir uma conta com cobertura e onde procurar o tipo registro de posições
    O tipo de registro de posições é definido no nível da conta, ele é exibido no cabeçalho da janela do terminal e, também, no diário:



    Para abrir uma conta demo com cobertura, habilite a opção correspondente:




    Sistema de compensação
    Este sistema de registro implica que num dado momento, possa haver apenas uma posição aberta, segundo um mesmo símbolo, na conta:

    • Se existir uma posição segundo um instrumento, ao realizar uma transação na mesma direção ocorrerá o aumento do volume dessa posição.
    • Ao realizar uma transação na direção oposta, ocorrerá a diminuição do volume da posição existente, quer o seu fechamento (ao realizar uma transação de volume idêntico ao da posição atual), quer a reversão (se o volume da transação oposta for superior ao da posição atual).


    Neste caso, não importa a ação pela qual é realizada a transação na direção oposta, por outras palavras, é indiferente se foi resultado da execução de uma ordem de mercado ou devido à ativação de uma ordem pendente.

    Abaixo mostramos um exemplo da execução de duas transações de compra de EURUSD com um volume de 0,5 lotes cada:


    Como resultado da execução destas transações, temos uma posição geral com um volume de 1 lote.

    Sistema de cobertura
    Este sistema de registro permite que você tenha múltiplas posições do mesmo instrumento, incluindo em direções opostas.

    Se, segundo um instrumento de negociação, existir uma posição aberta e o trader executar uma nova transação (ou se estiver ativa uma ordem pendente), ocorrerá a abertura de uma nova posição. A posição atual não será alterada.

    Abaixo mostramos um exemplo da execução de duas transações de compra de EURUSD com um volume de 0,5 lotes cada:


    Como resultado da execução destas transações, temos a abertura de duas posições distintas.

    Novo tipo de operação de negociação Close By
    Para contas com cobertura de registro de posições foi adicionado um novo tipo de operação de negociação, isto é, o fechamento de uma posição usando uma oposta. Esta operação permite fechar simultaneamente duas posições opostas de um mesmo instrumento. Se as posições opostas tiverem diferentes números de lotes, então, permanecerá aberta apenas uma das duas. O seu volume será igual à diferença dos lotes de duas posições fechadas, e a direção da posição e o preço de abertura serão iguais à maior (em volume) das posições fechadas.

    Em comparação com o fechamento individual de duas posições, o fechamento da oposta permite ao trader poupar um spread:

    • Com o fechamento individual, o trader paga duas vezes pelo spread: fecha a compra ao menor preço (Bid), e a venda, ao maior (Ask).
    • Com o fechamento oposto, para fechar a primeira posição, usa-se o preço de abertura da segunda posição, e para fechar a segunda posição é utilizado o preço de abertura da primeira.


    Ao fechar a posição usando outra oposta, estabelece-se uma ordem do tipo "close by". No seu comentário são indicados os bilhetes das posições fechadas. O fechamento de duas posições opostas ocorre usando duas transações do tipo "out by". O tamanho do lucro/perda total, obtido como resultado do fechamento de ambas as posições, é indicado apenas em uma transação.



  2. Foi adicionado o teste de robôs de negociação e indicadores técnicos segundo o histórico de ticks real.

    O teste e a otimização de acordo com ticks reais são os que mais se aproximam das condições reais. Em vez de ticks gerados com base em dados de minutos, são usados ticks reais (segundo instrumentos financeiros) acumulados pela corretora. Esses são ticks provindos da bolsa e dos provedores de liquidez.

    Para começar a testar ou a otimizar, segundo ticks reais, selecione o respectivo modo de teste de estratégias:



    Os dados de ticks são significativamente maiores do que os dados de minutos. Ao executar pela primeira vez o teste, o seu download pode levar muito tempo. Os downloads dos dados de ticks são armazenados por meses em arquivos TKC no catálogo \bases\[nome do servidor de negociação]\ticks\[nome do símbolo]\.

    Particularidades ao testar ticks reais
    Ao testar com ticks reais, o spread nos limites da barra de minutos pode ser alterado, enquanto ao gerar ticks dentro nessa barra, é utilizado o spread fixado na barra correspondente.

    Se, segundo um instrumento, for transmitido o livro de ofertas, as barras serão construídas a partir dos preços de execução da última transação Last. Caso contrário, o testador tentará construir barras a partir dos preços Last. Caso esses preços não existam, então, serão feitas a partir dos preços Bid. O OnTick ativa-se em todos os ticks, independentemente de neles existir, ou não, preço Last.

    Por favor, note que as transações são sempre executadas segundo os preços Bid e Ask, mesmo se o gráfico for construído a partir dos preços Last. Por exemplo, se, para a negociação, o expert usar apenas o preço de abertura da barra (particularmente, o Moving Average embutido), então, você receberá um sinal de acordo com um preço (Last), mas a transação será executada de acordo com outro preço (Bid ou Ask, dependendo da direção). Ao usar o modo de geração "Todos os ticks", as barras serão construídas de acordo com os preços Bid, mas as transações serão executadas segundo os preços Bid e Ask. Com isso, o Ask é calculado como o Bid + o spread fixo correspondente à barra de minutos.

    Se no histórico do símbolo existir uma barra de minutos, mas, se, nesse minuto, não houver dados de ticks, o testador irá gerar ticks no modo "Todos os ticks". Isso permite que você teste o expert de acordo com o período previsto, no caso de os dados de ticks estarem incompletos na corretora. Se, no histórico do símbolo, não existir uma barra de minutos, mas, se, nesse minuto, houver dados de ticks, então, esses ticks serão ignorados. Os dados de minutos são considerados mais confiáveis. 
    No momento, o teste e a otimização, a partir dos ticks reais, são possíveis apenas em agentes locais e remotos. O suporte para a rede em nuvem MQL5 Cloud Network será adicionado em breve.

  3. Foi adicionado um bate-papo. Agora, diretamente na plataforma, você pode conversar com amigos e colegas na MQL5.community. No bate-papo são exibidas todas as mensagens pessoais da conta MQL5. Para começar a conversar, acesse a sua conta diretamente da caixa de bate-papo ou a partir das configurações da plataforma: Ferramentas -> Opções -> Comunidade.




  4. Foi simplificada a janela de abertura da conta demo, adicionada a possibilidade de abrir contas com cobertura. 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, alavancagem e possibilidade de cobertura.



  5. Para começar a trabalhar rapidamente com a plataforma, foi adicionada a seleção automática da conta demo. Se, na plataforma, ainda não houver uma conta, então, ao iniciar o trabalho, será selecionada a conta demo. Após abrir a conta com sucesso, ela será imediatamente conectada.

  6. Agora todas as posições têm o seu próprio bilhete ou número único. Geralmente, ele corresponde ao bilhete da ordem, segundo o qual a posição foi aberta, exceto nos casos em que as operações de serviço no servidor tenham alterado o bilhete da ordem. Por exemplo, quando os swaps se acumulam com a reabertura de uma posição. O bilhete será atribuído automaticamente a todas as posições anteriormente abertas, após a atualização para uma nova versão do terminal.




  7. Foi corrigida a colocação de posições Stop Loss e Take Profit, ao estabelecer uma ordem de mercado que provoque a alteração da direção da posição. Os anteriores níveis correspondentes não foram colocados na nova posição.
  8. Foi corrigida a exibição dos preços com quatro ou mais dígitos após o ponto decimal nos controles do painel de negociação em um clique.
  9. Foi corrigido o erro de exibição de notícias na janela de visualização de impressão.
  10. Foram corrigidos os bugs de exibição do gráfico de ticks.
  11. Foi corrigida a abertura do livro de preços após um desligamento de emergência do terminal.
  12. Foi adicionada a verificação das ordens de mercado, ao exibir os elementos de gerenciamento do painel de negociação em um clique.
  13. Foi otimizado o cálculo de lucro e margem, quando existe um grande número de ordens e posições abertas.
  14. Foi adicionada a tradução da interface do usuário para malaio.
  15. Foi atualizado completamente o guia de usuário. Novo design, capturas de tela interativas e vídeos embutidos, tudo para fazer com que a aprendizagem, utilizando o MetaTrader 5, seja simples e cômoda.




MQL5

  1. 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 tornou-se abstrata e não pode ser criada
      };
    //--- descendente 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 uso correto
    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 uso correto
    new CCat;  // não há erro - a classe CCat não é abstrata
    CCat cat;  // não há erro - 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.

  2. 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, chamá-la:
    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.

  3. Na estrutura da solicitação de negociação MqlTradeRequest foram adicionados dois novos tipos de campos:

    • position — bilhete de posição. Deve ser preenchido, ao negociar com cobertura ao alterar e fechar a posição para a sua identificação inequívoca. Ao negociar com sistema de cobertura de registro, o preenchimento deste campo não tem efeito, porque a identificação de posições ocorre segundo o nome do instrumento de negociação.
    • position_by — bilhete da posição oposta. Utiliza-se ao fechar uma posição usando outra oposta, se estiver aberta no mesmo instrumento, mas na direção oposta. É utilizado apenas na cobertura do registro de posições.

  4. Na enumeração dos tipos de operações ENUM_TRADE_REQUEST_ACTIONS foi adicionado o valor TRADE_ACTION_CLOSE_BY — fechamento da posição oposta. É utilizado apenas na cobertura do registro de posições.

  5. Na enumeração das propriedades das ordens, transações e posições, foram adicionados os bilhetes correspondentes às operações de negociação:

    • No ENUM_ORDER_PROPERTY_INTEGER foi adicionada a propriedade ORDER_TICKET — bilhete da ordem. Um número exclusivo atribuído a cada ordem.
    • No ENUM_DEAL_PROPERTY_INTEGER foi adicionada a propriedade DEAL_TICKET — bilhete da transação. Um número exclusivo atribuído a cada transação.
    • No ENUM_POSITION_PROPERTY_INTEGER foi adicionada a propriedade POSITION_TICKET — bilhete da posição. Um número exclusivo atribuído a cada posição. Geralmente, ele corresponde ao bilhete da ordem, segundo o qual a posição foi aberta, exceto nos casos em que as operações de serviço no servidor tenham alterado o bilhete da ordem. Por exemplo, quando os swaps se acumulam com a reabertura de uma posição. Para localizar a ordem, segundo a qual foi aberta a posição, você deve utilizar a propriedade POSITION_IDENTIFIER. Valor POSITION_TICKET corresponde a MqlTradeRequest::position.

  6. Na enumeração dos tipos de ordens ENUM_ORDER_TYPE foi adicionado o valor ORDER_TYPE_CLOSE_BY — ordem para fechamento da posição oposta.
  7. Na enumeração das propriedades das ordens ENUM_ORDER_PROPERTY_INTEGER foi adicionado o valor ORDER_POSITION_BY_ID — identificador da posição oposta para ordens do tipo ORDER_TYPE_CLOSE_BY.
  8. Na enumeração das direções da transação ENUM_DEAL_ENTRY foi adicionado o valor DEAL_ENTRY_OUT_BY — a transação foi efetuada como resultado do fechamento da posição oposta .
  9. À estrutura da transação financeira MqlTradeTransaction foram adicionados dois campos análogos:

    • position — bilhete da posição que foi afetado pela transação. Preenche-se para transações relacionadas com o processamentos das ordens de mercado (TRADE_TRANSACTION_ORDER_* exceto TRADE_TRANSACTION_ORDER_ADD, onde o bilhete da posição ainda não foi atribuído) e o histórico de ordens (TRADE_TRANSACTION_HISTORY_*).
    • position_by — bilhete da posição oposta. Utiliza-se ao fechar uma posição usando outra oposta, se estiver aberta no mesmo instrumento, mas na direção oposta. Preenche-se apenas para ordens de fechamento da posição oposta (close by) e transações de fechamento da oposta (out by).

  10. Foi adicionada a função PositionGetTicket — retorna o bilhete da posição segundo o índice na lista de posições abertas e seleciona automaticamente essa posição para trabalhar no futuro com ela usando a função PositionGetDouble, PositionGetInteger, PositionGetString.
    ulong  PositionGetTicket(
       int  index      // número na lista de posições
       );

  11. Foi adicionada a função PositionSelectByTicket — seleciona uma posição aberta para trabalhar no futuro com ela segundo o bilherte indicado.
    bool  PositionSelectByTicket(
       ulong   ticket     // bilhete da posição
       );

  12. Na numeração das propriedades de instrumentos financeiros ENUM_SYMBOL_INFO_DOUBLE foi adicionado o valor SYMBOL_MARGIN_HEDGED — tamanho do contrato ou margem para um lote de posições sobrepostas (posições com várias direções segundo um mesmo símbolo).

    • Se, para o instrumento, tiver sido estabelecida uma margem inicial (SYMBOL_MARGIN_INITIAL), então, a margem de cobertura é indicada como valor absoluto (em dinheiro).
    • Se não se tiver estabelecido uma margem inicial (igual a 0), então, no campo SYMBOL_MARGIN_HEDGED indica-se o tamanho do contrato que será usado no cálculo da margem segundo a fórmula correspondente ao tipo de instrumento de negociação (SYMBOL_TRADE_CALC_MODE).
    As particularidades do cálculo de margem no sistema de cobertura de registro de posições está descrito no guia do usuário da plataforma de negociação MetaTrader 5.

  13. Na enumeração das propriedades da conta ENUM_ACCOUNT_INFO_INTEGER foi adicionado o valor ACCOUNT_MARGIN_MODE — modo de cálculo de margem para a conta de negociação atual:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — Usa-se para o mercado de balcão ao registrar as posições no modo "compensação" (segundo um símbolo pode existir apenas uma posição). O cálculo da margem é realizado com base no tipo de instrumento (SYMBOL_TRADE_CALC_MODE).
    • ACCOUNT_MARGIN_MODE_EXCHANGE — usa-se para o mercado de bolsa. O cálculo da margem é realizado com base nos descontos indicados nas configuraçãoes dos instrumentos. Os descontos são estabelecidos pela corretora, no entanto não podem ser inferiores aos valores determinados pela bolsa.
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — usa-se para o mercado de balcão ao ser realizado o registro independente de posições ("cobertura", segundo um símbolo, podem existir várias posições). O cálculo da margem realiza-se com base no tipo de instrumento (SYMBOL_TRADE_CALC_MODE) e tendo em conta o tamanho da margem de cobertura (SYMBOL_MARGIN_HEDGED).

  14. 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.

  15. 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.

  16. Foi corrigido o retorno do resultado da chamada da função SendFTP. Anteriormente, após o envio bem-sucedido, retornava o valor FALSE em vez de TRUE.
  17. Foi corrigido o erro na função StringConcatenate, que, em alguns casos, causava o erro de execução "Access violation".
  18. Foram corrigidos vários bugs ao trabalhar com funções-modelos.
  19. Agora as funções Print, Alert e Comment podem exibir seqüências maiores que 4.000 caracteres.
  20. Foi corrigido o erro na função ArrayCompare que aparecia quando a matriz era comparada consigo mesma.
  21. À biblioteca padrão foi adicionado o suporte de negociação com cobertura:

    CPosition
    Foram adicionados os métodos:

    • SelectByMagic — seleciona a posição segundo um número mágico e um símbolo para trabalhos futuros.
    • SelectByTicket —seleciona a posição segundo um bilhete para trabalhos futuros.

    CTrade
    Foram adicionados os métodos:

    • RequestPosition — obtém os bilhetes de posição.
    • RequestPositionBy — obtém os bilhetes da posição oposta.
    • PositionCloseBy — fecha a posição com o bilhete indicado da posição com direção oposta.
    • SetMarginMode — define o modo de cálculo da margem de acordo com as configurações da conta atual.

    Foi adicionada a sobrecarga de métodos:

    • PositionClose — fecha a posição segundo o bilhete.
    • PositionModify — modifica a posição segundo o bilhete.

    CAccountInfo
    Foram alterados os métodos:

    • MarginMode — agora obtém o modo para o cálculo da margem. Anteriormente, trabalhava analogamente ao novo método StopoutMode.
    • MarginDescription — agora obtém o modo de cálculo para a margem como para a linha. Anteriormente, trabalhava analogamente ao novo método StopoutModeDescription.

    Foram adicionados os métodos:

    • StopoutMode — obtém o modo para definir o nível mínimo de garantia.
    • StopoutModeDescription — obtém o modo para definir o nível mínimo de garantia como para a linha.

    CExpert
    Foram adicionados os métodos:

    • SelectPosition — seleciona posições para o subseqüente trabalho com ela.

  22. Foram adicionadas várias correções à biblioteca padrão.

Sinais

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

Tester

  1. Foi corrigido o erro onde a comissão não era calculada para alguns tipos de instrumentos de negociação.
  2. Foi corrigido o preenchimento do campo Expert nas ordens de negociação que apareciam como resultado da SL/TP, em conformidade com o valor do campo Expert na posição correta. Anteriormente não era preenchido.
  3. Foi corrigida a alternação para a guia de resultados da optimização normal e em tempo real.
  4. Foi corrigido o cálculo e exibição de indicadores "Envelopes".
  5. Foi otimizada a execução do teste visual.
  6. Foi otimizado o cálculo de lucro e margem, quando existe um grande número de ordens e posições abertas.
  7. Foi otimizada a execução de operações de negociação de alta freqüência.
  8. Agora a sincronização do histórico não é realizada ao consultar as propriedades de um símbolo sem fundamento e que não exige as cotações atuais. Por exemplo,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE и т.п. Anteriormente, a configuração de um símbolo fora de funcionamento fazia com que o histórico deste símbolo se começasse a sincronizar.

MetaEditor

  1. Foi corrigida a pesquisa por arquivos no modo "Apenas a palavra inteira".
  2. Foi adicionada a transição para o arquivo clicando duas vezes na linha de resultados da compilação do arquivo correspondente.
  3. Foi corrigida a exibição de alguns elementos de gerenciamento no Windows XP.


Documentação atualizada
17 dezembro 2015
MetaTrader 5 build 1240: aceleramento do trabalho e vídeos incorporados

Hosting

  1. Uma ligação que conduz ao vídeo tutorial "Como arrendar uma plataforma virtual" foi adicionada à caixa de diálogo do servidor virtual. Assista a este vídeo de dois minutos e descubra como é simples pôr o robô comercial a funcionar ou a copiar sinais 24 horas por dia, 7 dias por semana.


    Este e muitos outros vídeos estão disponíveis no canal oficial do YouTube da MetaQuotes Software Corp..
  2. Foi corrigido o erro de migração para o hosting, quando é chamado um indicador personalizado, ou quando a biblioteca EX5 dentro de um indicator personalizado é chamada desde o Expert Advisor.

Terminal

  1. Atualização acelerada da lista de ordens e posições abertas ao realizar operações comerciais de alta frequência (50 operações por segundo ou mais).
  2. A sincronização inicial do terminal com o servidor comercial foi otimizada e significativamente acelerada em presença de uma grande quantidade de instrumentos financeiros (dezenas de milhares). Agora, depois de se conectar, pode começar a trabalhar mais rápido.
  3. O consumo da memória usada pelo terminal foi otimizado e significativamente reduzido.
  4. A configuração da profundidade de mercado "DOM" foi adicionada ao fechamento/abertura do terminal.
  5. Os erros, na forma de artefatos, que ocorriam no Windows 10 ao arrastar as janelas do terminal, foram corrigidos.
  6. O trabalho do menu de contexto para ajuda foi corrigido. Para ativar a ajuda de um elemento do menu de contexto, coloque o cursor em cima dele e clique F1.
  7. Os trabalhos para a adaptação da interface em ecrãs de alta resolução (4K) encontram-se em desenvolvimento.

MQL5

  1. Para a obtenção de informação sobre as ordens e negociações OrderGetString, HistoryOrderGetString e HistoryDealGetString foram adicionadas novas propriedades:

    • ORDER_EXTERNAL_ID - a ID de ordem no sistema externo de comércio (na bolsa).
    • DEAL_EXTERNAL_ID - a ID de negociação no sistema externo de comércio.

  2. O erro da função ZeroMemory ao trabalhar com estruturas e classes foi corrigido. Em alguns casos, a limpeza da memória não foi realizada.
  3. Foram adicionados códigos de erro ao trabalhar com a função SendFTP. A função envia o ficheiro para o endereço indicado na janela de configuração "FTP".

    • ERR_FTP_NOSERVER - o servidor FTP não está especificado nos atributos de configuração
    • ERR_FTP_NOLOGIN - o login FTP não está especificado nos atributos de configuração
    • ERR_FTP_FILE_ERROR - o ficheiro não existe
    • ERR_FTP_CONNECT_FAILED - a ligação ao servidor FTP falhou
    • ERR_FTP_CHANGEDIR - não foi encontrado o diretório no servidor FTP para o upload do ficheiro
    • ERR_FTP_CLOSED - a ligação ao servidor FTP foi fechada

  4. Foi corrigida a verificação do acesso para colocar objetos segundo hierarquia de descendentes a antepassados.
  5. Foi corrigida uma série de erros nas classes de escalas.
  6. Foi corrigido o erro ao pedido da função CopyTicks. Ao especificar o parâmetro COPY_TICKS_TRADE (copiar apenas trade ticks) para ticks de negociação consecutivos e idênticos (de igual volume e last price), só o primeiro tick passou.
  7. Foi corrigido o erro ao usar ZLib na função CryptDecode que levava a um ciclo infinito de descompressão.
  8. Foi corrigido o erro de sincronização para um instrumento comercial diferente do instrumento básico de teste, no historial de preços.

Tester

  1. Foi corrigido o erro de sincronização para um instrumento comercial diferente do instrumento básico de teste, no historial de preços.
  2. Foi corrigida a duplicação da transação comercial TRADE_TRANSACTION_DEAL_ADD (a adição da negociação ao historial) no criador de eventos OnTradeTransaction.
  3. Foi alterado o comportamento dos forward testes durante a otimização genética. Agora, todos os resultados obtidos depois da otimização genética participam nas forward passes. Anteriormente, só 1/4 dos resultados eram usados.

MetaEditor

  1. Foi adicionado o link do vídeo tutorial video "Como criar um robô comercial no Master MQL5". Assista a este vídeo de três minutos e crie um robô comercial, sem escrever uma única linha de código.


    Este e muitos outros vídeos estão disponíveis no canal oficial da MetaQuotes Software Corp. no YouTube.
  2. Foi corrigido o comando para organizar janelas abertas, no caso de uma delas estar completamente expandida. Através do menu "Janela" é possível empilhar os ficheiros em forma de mosaico, na vertical, na horizontal e em cascata.
  3. Os trabalhos para a adaptação da interface em ecrãs de alta resolução (4K) encontram-se em desenvolvimento.
Updated documentation.
1234567891011121314