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

O que há de novo na MetaTrader 5?

21 julho 2017

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 (CFD, 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.