チェックアップのIsTesting()について、MQL4とMQL5のソースコード共通化する方法を説明しています。
関数定義
MQL4の定義
bool IsTesting();
MQL5の定義
定義なし
MQL5にバックテスト中かを取得する関数はありません。ただしMQLInfoInteger()を使う事で同等の処理を行うことが出来ます。
その処理を利用して、MQL4とMQL5のソースコード共通化を行います。
共通化方法
ソース共通化
対処方法
共通化するためにMQL5用の定義をします。
#ifdef __MQL5__ ~ #endifを使用することでMQL5のコンパイルにのみ有効となります。
MQL4の場合は「__MQL4__」を使用しますが、今回使用していないためMQL4は既存で組み込まれた組込み関数が利用されます。
#ifdef __MQL5__
#define IsTesting() ((bool)MQLInfoInteger(MQL_TESTER))
#endif
MQL5ではMQLInfoInteger()を利用することで動作状態を取得することができるため、バックテスト中かどうかの判断を行います。
使用例
このソースコードは私が作成するEA、インジケーターのすべてに組み込むログ出力のマクロ(#define)です。
以下の用途で、表示条件や表示内容を変えてログに出力するための定義です。
- エラー発生をログに出力したい
- テスト時にログに出力したい(※IsTesting())
- 情報をログに出力(常時、デモ口座時)したい
///////////////////////////////////////////////////////////////////////////////
// ログ出力マクロ
#define LOG(Message, Val) (Error(__FUNCTION__ + "(" + IntegerToString(__LINE__) + ") : " + Message, Val, 0))
#define INF(Message, Val) (Error(__FUNCTION__ + "(" + IntegerToString(__LINE__) + ") : " + Message, Val, 1))
#define ERR(Message, Val) (Error(__FUNCTION__ + "(" + IntegerToString(__LINE__) + ") : " + Message, Val, 2, true))
void Error(const string strError, double dVal, int iKind, bool bIsErr = false)
{
if (bIsErr) {
int iError = GetLastError();
Print("■■ ERR : #", iError, " :", strError, " :", dVal);
} else {
if (1 == iKind) {
Print("●○ INF : ", strError, " :", dVal);
} else if (IsTesting() || IsDemo()) {
Print("●● LOG : ", strError, " :", dVal);
}
}
}
以下の関数については別途説明します。
ログマクロの使い方
int OnInit()
{
#ifdef __MQL5__
Print("これはMT5で動作しています");
#else //__MQL4__
Print("これはMT4で動作しています");
#endif
return(INIT_SUCCEEDED);
}
void OnTick()
{
int iOrderTicket = 12345;
INF("iOrderTicket", iOrderTicket);
bResult = OrderDelete(iOrderTicket);
if (!bResult) {
ERR("OrderDelete()", iOrderTicket);
}
LOG("OrderDelete()終了", iOrderTicket);
}
MT5での実行結果
INF()、ERR()、LOG()を使い分けている例です。
LOG()はデモ口座とバックテスト中しか出力されないログですので、あくまでも実際の運用前のデバック用としてログ出力します。
ERR()、INF()はいつでも出力したいログです。
コメント