ログを出力したい!

ログ出力とは?

ログとは、任意のタイミングでプログラムから出力する文字情報の事を指します。プログラムの処理に直接影響を与えることはありませんが、問題が発生した際にログからその原因を探る、といった用途で使用されます。プログラム内でどの程度のログ出力を行うかは開発者次第ですが、ログ出力が多くなるとプログラムの動作速度が低下してしまう恐れがあります。そのため、開発中のプログラムでは細かい動作内容も含めて多めにログを出力し、完成後のプログラムでは問題の原因を特定するために必要な最低限のログのみを出力する、というのが一般的なログ出力の方法となります。

ログを出力するPrint関数

ログを出力するには、MQL4で提供されているPrint関数を使用します。

void Print(
    argument,       // first value
    ...             // next values
);

引用元:Print – MQL4 Reference

引数

Print関数の引数には出力したいログの内容を指定し、Print関数を一回呼ぶごとに一行のログが出力されます。引数の数や型についてはAlert関数と同様となりますので、詳細は以下のリンク先をご参照ください。

アラートを表示したい! – MQL4逆引きリファレンス
https://www.mql4-encyclopedia.com/alert/

戻り値

Print関数に戻り値はありません。

使用例

input uint MAPeriod = 14; // 移動平均の期間

void OnTick()
{
    Print("移動平均の期間=" + IntegerToString(MAPeriod));
}
実行結果(ログ出力)
2018.07.09 12:34:56.789 ExpertAdvisor USDJPY,M1: 移動平均の期間=14
*「ExpertAdvisor」はプログラム名

上記例ではパラメーターで入力された移動平均の期間をログに出力しています。パラメーターはユーザーがプログラムを使用する際に自由に変更することが出来るため、その設定内容が原因で問題が発生することも考えられます。そのようなケースに備えてパラメーターの設定内容をログに出力しておけば、後からどのような設定内容でプログラムを動かしたのかをログから調べることが可能となります。

ログの表示

プログラムを実行しPrint関数が呼ばれると、MetaTrader4のターミナルウィンドウにある「エキスパート」(バックテストの場合はテスターウィンドウにある「操作履歴」)というタブにログの内容が表示されます。表示内容は「日時」「プログラム名」「プログラムを実行したチャートの通貨ペア」「プログラムを実行したチャートの時間足」「ログ内容(Print関数の引数)」というフォーマットになりますので、複数のプログラムが同時に動作している状況であっても、どのチャートのプログラムが出力したログなのかを特定できるようになっています。逆に言うと、日時やプログラム名、チャートの通貨ペアや時間足はPrint関数の引数に含める必要は無い、ということになりますね。

ログファイル

出力されたログはデータウィンドウの「MQL4」(バックテストの場合は「tester」)→「Logs」のフォルダ内に日付毎に保存されています。ただしログファイルは一定期間が過ぎると自動的に削除される仕様となります。重要なログファイルは別のフォルダに移動するなどのバックアップ対策が必要となりますのでご注意ください。

ログ出力による動作速度の低下

ログを出力するとファイルへの書き込み処理が発生するため、プログラムの動作速度が低下します。しかし実際に速度低下による影響が出るのは主にバックテストであり、通常のプログラム実行においては大量のログを出力しない限りほとんど影響はありません。バックテストによる実行かどうかはIsTesting関数で判定が可能なので、バックテストの完了までに時間がかかってしまう場合は一時的にPrint関数を実行しないようにするのも一つの手段となります。

まとめ

ログを出力するにはPrint関数を使用する
Print関数を一回呼ぶごとに一行のログを出力
ログはMetaTrader4での表示の他にログファイルとしても保存される
ログファイルは一定期間経過で自動的に削除される
大量のログ出力は動作速度低下の原因となる

参考URL

Print – MQL4 Reference
https://docs.mql4.com/common/print