Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

RegularExpressions na MQL5 para trabalhar com expressões regulares - biblioteca para MetaTrader 5

Publicado por:
MetaQuotes
Visualizações:
2006
Avaliação:
(40)
Publicado:
2016.05.20 14:01
Atualizado:
2022.11.15 09:55
\MQL5\Experts\RegExpressions Demo\ \MQL5\Include\Internal\ \MQL5\Include\Internal\Generic\ \MQL5\Include\Internal\TimeSpan\ \MQL5\Include\RegularExpressions\
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Verdadeiro autor:

Microsoft Corporation. Os códigos fonte foram tirados do .Net Framework 4.6.1

Nota: A biblioteca funciona apenas na MetaTrader 5 build 1285 e superior.

Para começar a trabalhar você precisa de descompactar o arquivo para a pasta catálogo_de_dados_do_terminal.
Os códigos da biblioteca ficam localizados na pasta: <catálogo_de_dados_do_terminal>\MQL5\Include\RegularExpressions\
Exemplos de scripts de teste podem ser encontrados na pasta: <catálogo_de_dados_do_terminal>\MQL5\Scripts\RegularExpressionsExamples\

Aqui você dispõe de uma tradução do RegularExpressions com .Net Framework 4.6.1.

Para usar a biblioteca, você deve conectar ao seu código o arquivo Regex.mqh do diretório \MQL5\Include\RegularExpressions\.

Além disso, juntamente com a biblioteca existem várias demonstrações que ao mesmo tempo cumprem o papel de casos exemplares. Todos os exemplos são tirados do site oficial Microsoft Corporation, eles mostram claramente as principais diferenças de expressões regulares no C# e as peculiaridades do seu uso na MQL5.

Leia mais sobre os pacotes da biblioteca migrada (portada) RegularExpressions MQL5:

Pacotes
Descrição
CharUnicodeInfo.mqh
txt arquivado para determinar as categorias Unicode para todos os caracteres (incluindo caracteres não latinos).
RegexCapture.mqh
Apresenta os resultados de um registro bem-sucedido por parte da expressão.
RegexCaptureCollection.mqh
Apresenta um conjunto de registros feitos por um grupo do registro.
RegexGroup.mqh
Apresenta os resultados de um grupo separado do registro.
RegexGroupCollections.mqhRetorna um conjunto de grupos registrados na mesma justaposição.
RegexMatch.mqhApresenta os resultados de uma correspondência separada de uma expressão regular.
RegexMatchCollection.mqhApresenta o conjunto de correspondências bem-sucedidas encontradas aplicando iterativamente um padrão de expressão regular para a seqüência de caracteres de entrada.
Regex.mqhApresenta uma expressão regular imutável.
RegexOptions.mqh Fornece valores enumerados para serem usados ao definir os parâmetros de expressões regulares.

Parâmetros de expressões regulares a partir do arquivo RegexOptions.mqh:

Parâmetros
Descrição
None
Parâmetros não estabelecidos.
IgnoreCase
O registro não é levado em conta, ao pesquisar correspondências.
MultilineIndica o modo multi-linha.
ExplicitCaptureNão abrir grupos sem nome. As únicas seleções válidas pressupõem grupos claramente nomeados ou enumerados no formato (?<nome> parte da expressão).
SinglelineIndica o modo de linha única.
IgnorePatternWhitespaceRemove do padrão os separadores e habilita os comentários marcados com o símbolo "#".
RightToLeftIndica que a pesquisa será realizada da direita para a esquerda, em vez de esquerda para a direita.
DebugIndica que o programa funciona sob o depurador.
ECMAScriptHabilita o comportamento compatível ECMAScript para a expressão. Este valor pode ser utilizado apenas em conjunto com os valores IgnoreCase e Multiline.


Características do trabalho com RegularExpressions para MQL5:

  1. Como na versão .Net, nesta biblioteca foi empregue um repositório (memória cache invariável) de expressões regulares. Todas as expressões regulares criadas implicitamente (modelos da classe Regex) são inseridas neste repositório. Esta abordagem acelera o trabalho dos scripts, pois desaparece a necessidade de construir de novo expressões regulares, já que o seu padrão corresponde a um dos já existentes. O tamanho do repositório é por defeito 15. O método Regex::CacheSize() retorna ou define o número máximo de entradas na atual memória cache invariável das expressões regulares compiladas.
  2. A segunda característica, quando se trabalha com expressões regulares na MQL5, resulta diretamente a partir da primeira. E trata-se do fato de que o repositório acima mencionado deve ser limpo. Para fazer isso, é preciso chamar a função invariável Regex::ClearCache(). É recomendável chamar essa função somente após terminar de trabalhar com expressões regulares, caso contrário, é muito provável que se esteja removendo indicadores necessários.
  3. Ao contrario do .Net, na MQL5 não está empregue o ciclo foreach e, conseqüentemente, o trabalho com enumerações é diferente. Exemplo:
    //--- Código em C #
    Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.IgnoreCase);   
    string text = "The the quick brown fox  fox jumped over the lazy dog dog.";
    MatchCollection matches = rx.Matches(text);
    foreach (Match match in matches) 
      {
       //--- processamento
      }
    
    //--- Código para MQL5
    Regex *rx = new Regex("\\b(?<word>\\w+)\\s+(\\k<word>)\\b", RegexOptions::IgnoreCase);        
    string text = "The the quick brown fox  fox jumped over the lazy dog dog.";
    MatchCollection *matches = rx.Matches(text);
    IEnumerator<Match*> *en = matches.GetEnumerator();
    while(en.MoveNext()) 
      {
       Match *match = en.Current();
       //--- processamento
      }
    delete rx;
    delete matches;
    delete en;
    Regex::ClearCache();
    
  4. Como você pode ver no exemplo acima, a sintaxe da linguagem C# permite colocar diante das linhas o caractere '@' para ignorar todas as marcas de formatação nele. Na MQL5, tal abordagem ainda não tem sido coberta, de modo que todos os caracteres de controle, num padrão de expressão regular, devem ser descritos claramente.


Exemplo de trabalho com RegularExpressions para MQL5:

Como um exemplo de expressões regulares, consideremos a sua aplicação para analisar o histórico de negociação, baixado a partir do terminal na forma de um arquivo HTML.

Para fazer isso, criamos um expert com um parâmetro de entrada do tipo string, que será o nome do nosso arquivo na área local:


Este documento contém duas tabelas fundamentais: "Ordens" e "Transações". 

Criamos uma expressão regular para analisar o arquivo:

Regex *rgx=new Regex("(>)([^<>]*)(<)");

Analisamos esta expressão regular:

(>)
Pesquisa do caractere '>'
(^[<>]*)
Qualquer caractere, exceto '>' e '<', que se repita zero ou mais vezes
(<)
Pesquisa do caractere '<'

Em seguida, lemos o arquivo e obtemos todas as correspondências ligadas a esta expressão regular:

string str=FileReadString(m_handel);
MatchCollection *matches=rgx.Matches(str);

Nas linhas de um arquivo HTML que são registros (seqüências) para as tabelas "Ordens" e "Transações", tais correspondências serão de 23 e 27 respectivamente. Portanto, só podemos obter todas as informações que precisamos destas linhas.

Para a tabela "Ordens":

if(matches.Count()==23)
  {
   string in[11];
   for(int i=0,j=1; i<11; i++,j+=2)
     {
      in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2);
     }
   m_list1.Add(new OrderRecord(in));
  }

Temos a certeza de que o número de correspondências é de 23, e, portanto, estamos a lidar com um registro da tabela de "Ordens". Criamos uma matriz de linhas como apresentação inicial do nosso registro. Organizamos uma passagem por todas as correspondências ímpares, obtemos os valores destas correspondências usando o método matches[j][.Value(), e delas cortamos o primeiro e o último caractere correspondente aos caracteres '>' e '<'. Inserimos cada correspondência formatada na matriz declarada anteriormente in. Em seguida, criamos um novo modelo da classe OrderRecord(in), que representa um registro da tabela "Ordens", e adicionamo-o à lista m_list1. Esta lista interpretará a tabela "Ordens".

A tabela "Transações" será processada do mesmo modo:

if(matches.Count()==27)
  {
   string in[13];
   for(int i=0,j=1; i<13; i++,j+=2)
     {
      in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2);
     }
   m_list2.Add(new DealRecord(in));
  }

Aqui m_list2 corresponde à lista de indicadores para a classe DealRecord e, por sua vez, apresenta a tabela "Transações".

Ambas as listas são membros da classe TradeHistory. Esta classe é uma representação do nosso arquivo HTML original. Além disso, ele permite aplicar filtros simples na tabela "Ordens" e "Transações" com a ajuda dos métodos: FindAllOrders(const int columnIndex,const T value) e FindAllDeals(const int columnIndex,const T value).

Criamos no nosso expert uma interface gráfica simples para mostrar estas possibilidades:


Ao trabalhar com esta forma, nós escolhemos a tabela do nosso interesse, selecionamos a coluna e o valor nela, de acordo com o qual a tabela será filtrada. Clicamos no botão Find e a tabela filtrada será mostrada abaixo, juntamente com algumas estatísticas sobre ela. O botão Save salva a tabela, que está sendo exibida atualmente, num arquivo csv. O arquivo salvo será também colocado na área local com o nome Result.csv.

Para saber mais sobre a biblioteca RegularExpressions para MQL5 foi criado o conselheiro Tests.mqh. Ele contem exemplos para utilizar expressões regulares que atingem toda a funcionalidade básica da biblioteca.

Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/15242

METRO_XRSX_HTF_Signal METRO_XRSX_HTF_Signal

METRO_XRSX_HTF_Signal mostra uma direção de tendência ou um sinal para a realização de um negócio gerado pelo indicador METRO_XRSX_Sign na barra escolhida como um objeto gráfico com uma indicação de tendência colorida ou direção da transação e envia alertas ou sinais de áudio no caso de um momento de entrada no mercado.

DEMA_3HTF DEMA_3HTF

Três indicadores de Média Móvel Exponencial Dupla com três períodos diferentes exibidos no mesmo gráfico.

Exp_SuperTrend Exp_SuperTrend

Sistema de negociação baseado nos sinais do indicador Supertrend.

Exp_WPRSIsignal Exp_WPRSIsignal

Sistema de negociação baseado nos sinais do indicador WPRSIsignal.