ライブラリ: MQL5での正規表現の動作の為のRegularExpressions

 

MQL5での正規表現の動作の為のRegularExpressions:

正規表現は、迅速かつ柔軟なテキストの処理の為の正式言語です。各正規表現は、正規表現エンジンが入力テキスト内で一致するものを検索するテンプレート(マスク)です。パターンは、一個以上の文字リテラルや演算子、構成体で構成されています。

また、ライブラリと一緒に一度にテストケースの役割を実行するいくつかのデモンストレーション例が含まれています。全ての例はMicrosoft Corporationの公式サイトより転載されており、これらの例はC#正規表現とMQL5での使用の特徴との、主要な違いを明確に示しています。

ライブラリの使用には、\MQL5\Include\RegularExpressions\ディレクトリのRegex.mqhファイルをあなたのコードに接続する必要があります。

MQL5の為のRegularExpressionsを使った作業例:

正規表現を使った例として、ターミナルからhtmlファイル形式でダウンロードされた取引履歴の解析を見てみましょう。ザを作成します。

このドキュメントは二つの主要テーブル(『注文』と『取引』)を含んでいます。 

ファイル解析の為の正規表現を作成します。

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

この正規表現を見ていきましょう。

(>)
'>'文字の検索
(^[<>]*)
'>'と'<'以外の0または1回以上繰り返す任意の文字
(<)
'<'文字の検索

次に、行ごとにファイルを読み込み、この正規表現に当てはまる全ての一致を取得します。

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()メソッドを使いこれらの一致の値を取得します。そして、'>'と'<'のシンボルに対応する最初と最後のシンボルを一致したものから切り離します。フォーマットされた一致をそれぞれ、以前に宣言されている配列inに入れます。次に、『注文』テーブルの一つのレコードを表示する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)メソッドを使用して『注文』や『取引』テーブルに簡単なフィルタを適用することができます。

私たちのエキスパートアドバイザに、これらの機能をデモンストレーションする為の簡単なグラフィックインターフェースを作成しましょう。



作者: MetaQuotes Software Corp.

 

Tests.mq5でバグを発見:

2016.05.20 16:08:58.128 Tests (GAZR-6.16,D1) 'RegexFCD.mqh' (87,20) の無効なポインタ アクセス

ログを添付します。再現するには、EAを添付し、"RegexOptions "の "Run "をクリックし、"RegexReplace "をクリックする。

ファイル:
 
ソースコードのリンクが壊れている
 
クールだ。基本的にはMQL6だ!異なる 拡張構文と新機能。
 
Vasiliy Sokolov:
クールだ。基本的にはMQL6だ!異なる 拡張構文と新機能。

ヴァシリー、それのどこがクールなんだ?
君によれば、MQL5は.NETに堕落するらしいね:

本当の著者:

マイクロソフト株式会社。ソースコードは.Net Framework 4.6.1 から引用しています。

そして、それはmql6になりますか?
取引についてはどうですか?そして、なぜ同じMQLでMQLで作られたレポートを解析するのですか?

 
Event:

バシリー、何がクールなんだ?

こんにちは。質問は特別スレッド「初心者の質問」でどうぞ。ありがとう。
 

コンパイルエラー:

#include <Internal\Generic\List.mqh>
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
{
   List<int> list(10);
}
'IComparer' - declaration without type  List.mqh        407     28

List.mqhにインクルードを追加する必要があります:

#include <Internal\Generic\IComparer.mqh>
 
Event:


取引は?また、なぜMQLで作成されたレポートを同じMQLで解析するのでしょうか?

まず第一に、この例ではターミナルがコンテキストメニューから生成する取引レポートを解析している。

第二に、正規表現はあらゆる種類のレポートを解析する幅広いタスクを解決するのに役立ちます。特定のフォーマットに対して正規表現を書くことは、本格的なテキスト解析プログラムを書くよりもはるかに簡単だ。

 
Rashid Umarov:

まず、この例では、端末がコンテキストメニューから生成するトレードレポートについて説明します。

第二に、正規表現はあらゆる種類のレポートを解析するための幅広いタスクを解決するのに役立ちます。特定のフォーマットのために正規表現を書くことは、本格的なテキスト解析プログラムを書くよりもはるかに簡単です。

例を挙げればすべて明らかだ。
私の投稿は、Vasiliy Sokolovの クールさについての歓喜に関するものだった。
どうやら彼は先日正規表現に出会ったらしい。

 
Vasiliy Sokolov:
こんにちは。質問は特別スレッド「初心者の質問」でどうぞ。ありがとうございます。
こんばんは。どこで質問すればいいのか教えてくれませんか?お願いします。
 

すべてのmt5ファイルをありがとう