下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2016.05.27 08:31
程序库

用来处理正则表达式的MQL5 RegularExpressions - MetaTrader 5程序库

| Chinese English Русский Español Deutsch 日本語 Português

发布者:
MetaQuotes Software Corp.
显示:
770
等级:
投票: 31
\MQL5\Experts\RegExpressions Demo\
Tests.mq5 (139.65 KB)预览
\MQL5\Include\Internal\
Array.mqh (22.3 KB)预览
Wrappers.mqh (16.7 KB)预览
\MQL5\Include\Internal\Generic\
IList.mqh (5.69 KB)预览
List.mqh (38.6 KB)预览
\MQL5\Include\Internal\TimeSpan\
TimeSpan.mqh (31.68 KB)预览
\MQL5\Include\RegularExpressions\
Regex.mqh (57.02 KB)预览
RegexCode.mqh (22.23 KB)预览
RegexFCD.mqh (31.21 KB)预览
RegexNode.mqh (32.44 KB)预览

真正的作者:

Microsoft Corporation. 源代码来自.Net Framework 4.6.1。 

注意:程序库适用于MetaTrader 5 build 1285 及更高版本。

解压文档到terminal_data_folder
程序库代码位于:<terminal_data_folder>\MQL5\Include\RegularExpressions\
抽样测试脚本可以发现 在 <terminal_data_folder>\MQL5\Scripts\RegularExpressionsExamples\

这是.Net Framework 4.6.1的RegularExpressions的翻译。

若要使用程序库,要包括来自您代码库"\MQL5\Include\RegularExpressions\"目录的Regex.mqh文件。

同时作为测试用例服务的程序库还提供几个说明性的示例。所有样例都来自 Microsoft Corporation官方网站,它们生动地展示了C#正则表达式和在MQL5使用特点之间的主要区别。

以下是有关MQL5 RegularExpressions移植库包的更多详细信息:

程序包
描述
CharUnicodeInfo.mqh
存档 txt 文件以确定所有符号的Unicode类别(包括非拉丁字符)。
RegexCapture.mqh
表示一个成功子表达式获得的结果。
RegexCaptureCollection.mqh
表示由一个要匹配的组完成的采集设置。
RegexGroup.mqh
表示来自一个要匹配的组的结果。
RegexGroupCollections.mqh表示组对象的集合。
RegexMatch.mqh表示来自一个正则表达式匹配的结果。
RegexMatchCollection.mqh表示通过迭代应用正则表达式模式到输入字符串所发现的成功匹配集合。
Regex.mqh表示一个不可变的正则表达式
RegexOptions.mqh 提供用于设置正则表达式选项的枚举值。

来自RegexOptions.mqh文件的正则表达式参数:

参数
描述
None
指定没有 选项设置。
IgnoreCase
说明不区分大小写匹配。
Multiline指定多行模式。
ExplicitCapture不收集未命名的组。 指定唯一有效采集是(?<name> subexpression)表格的明确命名或编号的组。
Singleline指定单行模式。
IgnorePatternWhitespace消除模式费转义的空白区,启用#标记的评论。
RightToLeft指定从右向左搜索,而不是从左向右。
Debug指定 程序 工作 在调试模式
ECMAScript为表达式启用ECMAScript-compliant 行为。该值只能用于结合IgnoreCaseMultiline 值。


使用MQL5 RegularExpressions:

  1. 如同.Net 版本一样,该程序库实现了正则表达式的(静态缓存) 存储。所有隐式创建的正则表达式(Regex 类的实例)都写在那个存储。这个方法加快的脚本的操作速度,因为如果其模式与任何现有的匹配,那么它会消除重建正则表达式的需要。默认的存储大小是15。Regex::CacheSize() 类函数返回或设置最大的条目数在已编译正则表达式的当前静态缓存中。
  2. 使用MQL5 正则表达式的第二个特点紧随第一种。在于必须清除上述存储的事实。为此,请调用 Regex::ClearCache() 静态函数。建议只有在已经完成正则表达式以后才可调用该函数,否则有可能删除必要的指针。
  3. 与 .Net 不同的是,MQL5 没有实施 foreach 循环,因此处理的枚举也将不同。例如:
    //--- 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) 
      {
       //--- 处理中
      }
    
    //---  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();
       //--- 处理中
      }
    delete rx;
    delete matches;
    delete en;
    Regex::ClearCache();
    
    
  4. 从上述事例可以看到,C# 语法允许将 '@' 符号放在字符串前面 以忽略所有格式标记。在MQL5,不提供这个方法,所以正则表达式模式中所有控制字符都应该明确定义。


使用MQL5 RegularExpressions的示例:

正则表达式示例,考虑其应用程序解析从程序端下载的html格式文件的交易历史记录。

为此,创建一个 'string' 类型的单输入参数的专家,它将是 沙箱文件的名称:


该文档包含两个主要表格:"订单" 和 "交易"。 

创建解析文件的正则表达式:

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

考虑该正则表达式:

(>)
寻找 '>' 字符
(^[<>]*)
'>' 和 '<' 以外的任何符号,重复零次或更多次
(<)
寻找 '<' 符号

其次,逐行阅读文件,获得对应该正则表达式的所有匹配:

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

html 文件字符串,是"订单" 和 "交易" 表格的条目(元组),将拥有大部分这种匹配,即23和27分别匹配。因此,剩下唯一要做的就是从这些字符串提取所有必要的信息。

对于"订单"表格:

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));
  }

已经证实,匹配数为23,因此,从 "订单" 表格处理条目。创建一个字符串数组作为我们条目的初始表示。对所有零散匹配创建迭代,使用 matches[j][.Value() 类函数获得这些匹配的值,消减符合字符 '>' 和'<' 的每个匹配的第一和最后一个字符。每个格式化的匹配都被写入之前声明的 数组。在那之后,创建OrderRecord(in)类的实例,表示"订单"表格的一个条目,并将其添加到 m_list1 列表。这个列表将说明"订单" 表格。

"交易" 表格也将以类似的方式处理:

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));
  }

这里 m_list2 DealRecord 类的指针列表。它表示 "交易" 表格。

这两个列表是TradeHistory 类的成员。该类是整个原始html文件的表示。另外,它还允许使用类函数简单的筛选"订单" 和 "交易" 表格: FindAllOrders(const int columnIndex,const T value)FindAllDeals(const int columnIndex,const T value)

在EA 中创建简单的图形界面来展示这些功能:


使用该格式时,选择所需的表格,选择筛选表格的列和值。按下查找 按键,筛选的表格将显示在下方,并包括一些统计数据。 保存 按键存储当前显示的表格到csv 文件。已保存的文件也将位于沙箱,命名为 Result.csv

要了解有关 MQL5 RegularExpressions 和其功能的更多信息,请使用提供的 Tests.mqh 专家。它实施了大量的正则表达式的使用示例,涵盖了程序库所有的主要功能。

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/15242

WPR_Chart WPR_Chart

在图表主窗口中与移动平均指标相关联的 WPR 震荡指标。

MACD 信号 MACD 信号

MetaTrader 5 版本的 MACD 信号指标。

PChannel_HTF PChannel_HTF

指标 PChannel 在输入参数中有时间帧选项。

PChannel3_HTF PChannel3_HTF

指标 PChannel3 在输入参数中有时间帧选项。