Contra

MQL5での正規表現

MQL5での正規表現のやり方 -モジュールのダウンロードとサンプルコード-

2021年06月11日

はじめに

MQL5で正規表現を実装する方法を説明します。

必要なモジュールをダウンロードし、インクルードすることで正規表現を実装することができます。

まずはモジュールのインポートから確認しましょう。

モジュールのダウンロード

モジュールは下記のリンクから取得できます。

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

『ZIPとしてダウンロード』を選択しましょう。

MQL5正規表現モジュールのダウンロード方法

ダウンロードしたZIPファイルを解凍しましょう。

モジュールは下記のような構造となっています。

ExpertsとInclude

MQL5正規表現モジュールの構成

ExpertsにはEAを作成するプログラムが入っています。
ここでは正規表現モジュールのサンプルコードが入っており、『.mq5』が拡張子になっています。

一方Includeにはモジュールの本体が含まれています。
具体的には『.mqh』ファイルというものが複数含まれています。

『.mqh』ファイルはインクルードファイルと呼ばれ、これを呼び出すことで定義された変数や関数を使うことができます。

今回はこれから正規表現の関数が定義された『.mqh』ファイルをインクルードしていきます。

Include内にある2つのファイルはMQL5のIncludeフォルダの中へコピーしましょう。

もし用意されたサンプルを実行したい場合は
ExpertsにあるRegExpressions DemoフォルダをExpertsフォルダへコピーしておきましょう。

Regex.mqh

重要なのはIncludeにあるRegularExpressionsフォルダ内の『Regex.mqh』ファイルです。

これさえインクルードすれば正規表現モジュールを使うことができます。
(その他必要なファイルはRegex.mqh内でインクルードしているため)

regexファイル

Tests.mq5

こちらはサンプルコードになっています。

モジュールが正しくIncludeファイルに保存されているか確認するためにもこのコードをコンパイルしてみましょう。

コンパイルエラーが発生する場合は正しい場所に保存されていない可能性があります。

コンパイルされた『Tests.ex5』ファイルをMT5上で実行してみると、このようなポップアップがチャートに表示されます。

MQL5正規表現サンプルコンパイル

ただ、このサンプルは少しわかりにくいので下記にサンプルコードを添付します。

サンプルコード

入力文字列(input_string) “X0,Y10,X20,Z30,X40,Z50″の中から、X0 Y10 X20 X40 を配列(result_array)で取り出すプログラムです。

そしてregular_expressionという名前で関数化しました。これにより入力文字列(input_string)、正規表現パターン(pattern)、結果の配列(result_array)を渡すことで正規表現を使いやすくなりました。

string&は参照渡しです。mql5の関数は配列を直接返せないため関数の前で配列を定義し、関数を実行するとその配列に値が入ります。関数の戻り値がないためvoidで定義しています。

#include <RegularExpressions\Regex.mqh>
void regular_expression(string input_string, string pattern, string& result_array[]){
   CMatchCollection *matches=CRegex::Matches(input_string,pattern);
   CMatchEnumerator *en=matches.GetEnumerator();
   int i=0;
   ArrayResize(result_array,matches.Count());
   while(en.MoveNext())
     {
      CMatch *match=en.Current();
      result_array[i] = match.Groups()[0].Value();
      i++;
     }
   delete en;
   delete matches;
}
int OnInit()
  {
   string result_array[];
   string input_string="X0,Y10,X20,Z30,X40,Z50";
   string pattern="[XY]\\d{1,}";
   regular_expression(input_string, pattern, result_array);
   int num = ArraySize(result_array);
   for(int k=0;k<num;k++){
      PrintFormat("result_array[%d]=> %s",k,result_array[k]);
   }
   return(INIT_SUCCEEDED);
}

初めにRegex.mqhをincludeすることを忘れないようにしましょう。そしてCMatchCollectionとCMatchEnumeratorから始まる2行で正規表現を実行し、マッチした個数に合わせてresult_arrayをリサイズしています。
while文ではマッチした結果をresult_arrayに格納しています。

実行するとコンソールにこのように表示されるはずです。

result_array[0]=> X0
result_array[1]=> Y10
result_array[2]=> X20
result_array[3]=> X40

正規表現のパターンの書き方は下記リンクが参考になります。

トレーダーの為の正規表現

まとめ

MQL5で正規表現を実装する方法をまとめました。

モジュールをダウンロードし、適切なフォルダに入れ、
コードで正しくインクルードすることで使用可能です。

MQL5の書き方はC++に似ていますが難しい部分も多いと思います。
ContraではEAをアプリ上で作成、変換するサービスを展開しています。
無料でアプリのダウンロードができます。ぜひご利用ください。

人気の記事