無料でロボットをダウンロードする方法を見る
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

MQL5での正規表現の動作の為のRegularExpressions - MetaTrader 5のためのライブラリ

発行者:
MetaQuotes
ビュー:
1844
評価:
投票: 39
パブリッシュ済み:
2016.05.20 14:10
アップデート済み:
2022.11.15 09:55
\MQL5\Experts\RegExpressions Demo\
Tests.mq5 (139.55 KB) ビュー
\MQL5\Include\Internal\
Array.mqh (22.32 KB) ビュー
Wrappers.mqh (16.99 KB) ビュー
\MQL5\Include\Internal\Generic\
IList.mqh (5.7 KB) ビュー
List.mqh (38.62 KB) ビュー
\MQL5\Include\Internal\TimeSpan\ \MQL5\Include\RegularExpressions\
Regex.mqh (58.05 KB) ビュー
RegexFCD.mqh (31.22 KB) ビュー

実際の制作者:

Microsoft Corporation. ソースコードは.Net Framework 4.6.1から転載されています。 

備考:ライブラリは、MetaTrader 5のビルド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
全ての文字列(非ラテン文字を含む)のUnicodeカテゴリを定義する為のアーカイブされたtxt。
RegexCapture.mqh
表現の一部の一つの成功記録の結果を表示します。
RegexCaptureCollection.mqh
一つのグループによって作成された記録のセットが表示されます。
RegexGroup.mqh
個別のグループの記録結果を表します。
RegexGroupCollections.mqh一つの照合での記録されたグループのセットを返します。
RegexMatch.mqh正規表現の個別照合の結果を表示します。
RegexMatchCollection.mqh入力文字列への正規表現パターンの反復適用によって判定された成功照合のセットを表します。
Regex.mqh不変正規表現を表します。
RegexOptions.mqh 正規表現パラメータ設定時に使用する為の列挙値を表示します。

RegexOptions.mqhファイルの正規表現パラメータ:

パラメータ
詳細
None
パラメータは設定されていません。
IgnoreCase
大文字小文字の違いを無視します。
Multiline複数行モードを指定します。
ExplicitCapture名前のあるグループを取得しません。明示的に名前または番号を指定したグループのみをキャプチャします。(?<名前> 表現の一部)
Singleline単一行モードにします。
IgnorePatternWhitespaceエスケープされない空白をパターンから除外し、#でマークされたコメントを入れます。
RightToLeft検索の方向を左から右ではなく、右から左にします。
Debugプログラムが、デバッガの下で動作していることを示します
ECMAScriptECMAScript互換の動作にします。この値は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("(>)([^<>]*)(<)");

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

(>)
'>'文字の検索
(^[<>]*)
'>'と'<'以外の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)メソッドを使用して『注文』や『取引』テーブルに簡単なフィルタを適用することができます。

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


このフォームを使用する時、私達は興味のあるリストを選択し、リストがフィルタリングされる列と数値を選択します。Findボタンを押すと、いくつかの統計とともにフィルタリングされたリストが下に表示されます。Save ボタンは、現在表示されているリストをcsvファイルへ保存します。保存されたファイルは、サンドボックスにも配置され、Result.csvの名前を持ちます。

MQL5用RegularExpressionsのより詳細に知る為、またその機能でエキスパートアドバイザTests.mqhが作成されました。ここでは、ライブラリ全体の基本的な機能に働きかける、正規表現の使用例の多くが実装されています。

MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/15242

XRAVI XRAVI

Range Action Verification Index (範囲アクション検証指数)トレンドインディケータ

Cronexスーパーポジション Cronexスーパーポジション

RSIやデマーク方式のテクニカル指標の重ね合わせ。

負の取引高インデックス 負の取引高インデックス

負の取引高インデックス(Negative Volume Index、NVI)は取引高の没落と金融商品の価格変動との間の関係を描画します。

正の取引高インデックス 正の取引高インデックス

正の取引高インデックス(Positive Volume Index、PVI)は取引高の増加と金融商品の価格変動との間の関係を描画します。