MQL4でアサーション

 MQL4用にアサーションを作成したので紹介します。 作成したコードはGithubで公開しているので、興味のある人はダウンロードして使ってみて下さい。 MQL4-Assert

アサーションとは?

 アサーションはプログラムの前提として満たしているべき条件をテストするための構文です。前提条件を満たしていない場合はエラーを発生させたり、メッセージを表示して処理を中断することができます。開発時に使用することで問題箇所を素早く特定することができます。
 アサーションのもう一つの特徴として、コードから削除せずともリリース時に機能の有効/無効を切り替えることが可能です。アサーションを無効にすると判定処理は実行されないため、処理速度が求められるEAに適しています。
 アサーションは多くのプログラミング言語に標準で実装されている機能ですが、残念ながらMQL4には備わっておりません。そこで今回MQL4用のアサーションを開発しました。

処理の仕組み

 アサーションはMQL4のマクロ機能を利用して作成しました。#defineは定義値を宣言するためのマクロですが、実は色々と応用ができます。基本的には以下のように識別子と値を記述します。

#define SAMPLE 1

 上記のように書くと、コンパイル前にコード内の「SAMPLE」部分が「1」に置換されます。これが#defineの基本形です。
 識別子の部分にはパラメータを受け取ることができます。受け取るパラメータは複数でも可能なので、関数のような使い方もできます。

#define SAMPLE(param1, param2) (param1+param2)

 値の部分は実は複数行に渡るような処理を書くことができます。改行する場合は「¥」をつけます。
 このことを利用して、assert(条件式, エラーメッセージ)の形式で書かれた行を、条件式を評価するif文へと書き換えています。条件を満たしていない場合にはエラーメッセージを出力してプログラムを終了させます。

有効・無効の切り替え

 有効・無効に関しては、IS_ASSERTという定義値が定義済みか否かで判断しています。  #ifdef, #else, #endifを使うことでIS_ASSERTが定義済みの場合と未定義の場合で処理を変えることができます。

#ifdef IS_ASSERT
   // IS_ASSERTが定義済みの場合にコンパイルされる内容
#else
   // IS_ASSERTが未定義の場合にコンパイルされる内容
#endif

 IS_ASSERTが定義済みの場合は条件判定を行うassertを定義し、未定義の場合はassert部分を無にします。これによりリリースバージョンでは判定処理が実施されず、処理速度を損ねることはありません。MQL4、特にEAは処理速度が求められることが多いため、ソースコードからわざわざ削除せずに処理を消せる#ifdefは重宝します。

まとめ

アサーションは作れる!

何かあればGithubのほうにissueなりPullRequestなりください。

arrow_upward