Programming master school

今回の記事は、MQL4のPrint()関数についての2回目の記事になります。

Print()関数を利用すると、変数の値や、プログラムの流れが確認できるので、プログラミングの理解が深まり、様々な問題解決に役立ちます。

前回の記事はPrint()関数のサンプルコードを利用してログの出力まで説明致しました。

今回は出力させた結果から「プログラム」の動きや「変数」の変化を補足説明をしていきます。

*パソコンに関する内容はWindows10の場合です。

●関連記事
MQL4のPrint関数でログ出力!問題解決の方法を解説!(3)はこちらです。

この記事はこんな方にオススメです。
☑MQL4の動きを知りたい
☑MQL4の変数の中身を知りたい
☑MQL4の動作エラーの原因を探りたい
☑MQL4のインジケータやEAの動作確認方法が知りたい
☑MQL4の理解を深めたい
☑MQL4のコードの動きや意味を知りたい
☑MQL4のif文やfor文が思った通りに動いているか確認したい
☑MQL4のPrint()関数の具体的な使用方法を知りたい

Print()関数のログファイルを開く方法

ログファイルを開くには、Windows標準の「メモ帳」や外部ソフトの「テキストエディタ」などで開くことが出来ます。

Windowsのメモ帳で開く場合

もっとも簡単にログファイルを開く方法は、1回目で紹介したWindows標準の「メモ帳」です。

「logファイル」をダブルクリックすると、通常通は「メモ帳」で自動的に開きます。

もし、開かない場合は、下の画像を参照して下さい。

●「メモ帳」の起動方法

左下の「Windousボタン」→「Windows アクセサリ」→「メモ帳」でメモ帳を起動させます。

 

 

「メモ帳」が起動したらファイルを「メモ帳」にログファイルをドラックアンドドロップします。

 

ログファイルは、下画像の様に出力されます。(上から古い順で表示されます。)

 

テキストビューアで開く場合

外部ソフトのテキストビューアの説明です。

今回は無料ソフトの「GigaText Viewer」を紹介致します。

テキストを閲覧するためのソフトになります。ですので、基本的には編集出来ません。保存も出来ません。 すみません、保存出来ます。

Print()関数を多用すると、ログファイルの容量が多くなり、「メモ帳」では開けない場合があります。その際は、外部ソフトを使用する必要があります。

私はこの「GigaText Viewer」使用してログの確認をしています。

こちらは、大容量のファイルでも早く開きます。見た目も「メモ帳」の様なビジュアルですので、違和感なく使用出来ます。こちらのリンクからダウンロード出来ます。

編集も可能ですが、基本的には閲覧ソフトですので、編集する際はひと手間必要です。

直観的に使用出来ますが、詳しい使用方法は、こちらの記事で説明しています。

Giga Text Viewerはこちらからダウンロード出来ます。

 

テキストエディタで開く場合

外部ソフトのテキストエディタの説明です。

今回は「EmEditor」を紹介致します。

有料ソフトのではありますが30日間の試用期間があります。大容量のファイルを開くことが出来ます。編集も簡単に出来ます。

有料ソフトだけあって沢山の機能があります。試用期間が過ぎると無料ソフトとして使うことは可能ですが、機能制限がある為、大容量のファイルは開けなくなります。

「EmEditor」を試用してみて、こちらの方が使い勝手が良いのでしたら、「EmEditor」も良いと思います。

私は、試用期間だけ使いました。Print()のログ確認程度でしたら、「GigaText Viewer」十分対応可能です。

MQL4プログラムの動作確認方法

私は、「GigaText Viewer」とメタエディタでプログラムを開いて両方を見比べて確認しています。

注意書きなど何かメモをしたい場合には、エクセルやスプレッドシードにその部分だけをコピーしています。

少し詳しく説明致します。

テキストビューアとプログラムを並べる

私の場合は、左にGigaText Viewer、右にプログラムの画面をそれぞれ開きます。

左のGigaText Viewerを見て、右のプログラムの「どこを読み込んでいる」のかや「変数」の変化などを確認していきます。このように見ていくと、プログラムの流れが次第に理解出来てきます。

エクセルやスプレッドシードにコピペする

注意書きや重要点、何か忘れないようにメモをしたい、などの場合には、エクセルやスプレッドシードにその部分だけをコピーして保存します。

私の場合はスプレッドシードに下画像のように書き込んでいます。エクセルやスプレッドシードですと計算もできるので、ログからコピーをして計算も簡単に出来ます。

出力されたログを簡単に解説

1回目の記事で出力されたログを簡単にですが解説致します。太字ログです。

ポジションを持っていないときの動き

まずは、ポジションを持っていない(EAを入れたときやエントリー条件が合致しない)場合のログ一番最初の「 ~~~OnTick()開始~~~」から見ていきましょう。

~~~OnTick()開始~~~ 
今回の場合はここがスタート

~~~決済条件開始~~~
決済条件を確認していきます

~~~~~決済用MA条件~~~~~
決済用MAの状態を表示しています
mac_1= 111.3519000000002
mac_2= 111.5109
mac_1a= 111.3491000000002
mac_2a= 111.50444

( mac_1 > mac_2 && mac_1a <= mac_2a)= false
買いポジションの決済条件に合致したか?falseなので合致していません。

( mac_1 < mac_2 && mac_1a >= mac_2a) = false
売りポジションの決済条件に合致したか?falseなので合致していません。

決済のOrdersTotal()= 0
保有&待機ポジション数は?"0"ですのでポジションはありません。

~~~エントリー条件開始~~~
エントリー条件を確認していきます

~~~~~エントリー用MA条件~~~~~
エントリー用MAの状態を表示しています
ma_1= 111.2608999999998
ma_2= 111.2956666666665
ma_1a= 111.2569999999998
ma_2a= 111.2900952380951

( ma_1 < ma_2 && ma_1a >= ma_2a) = false
買いエントリーの条件に合致したか?falseなので合致していません。

( ma_1 > ma_2 && ma_1a <= ma_2a)= false
売りエントリーの条件に合致したか?falseなので合致していません。

エントリーのOrdersTotal()= 0
保有&待機ポジション数は?"0"ですのでポジションはありません。

BUY= true
変数「BUY」の中身はtrueが入っています。

SELL= true
変数「SELL」の中身はtrueが入っています。

ここまでが、今回「void OnTick()」の流れになります。

~~~OnTick()開始~~~
ティックが発生したらvoid OnTick()」からまたスタートします。

 

エントリーする場合の動き

次は、エントリーするまでの動きです。ポジションを持っていないときとの違いを見ていきましょう。

まずはログから、エントリーしたところを探します。

「GigaText Viewer」での説明になりますが、「メモ帳」でもほぼ同様です。

「GigaText Viewer」でキーボードの「Ctrl」+「F」キーを押して検索画面を出します。

検索ボックスに #1 と入力して「OK」ボタンを押します。

そうしますと、#1 が検索されて青くなります。
ここが、USDJPYが111.314で買いの約定がされたところです。

ではここから上にスクロールして、最初の「~~~OnTick()開始~~~ 」から見ていきます。

~~~OnTick()開始~~~ 
OnTick()がスタート

~~~決済条件開始~~~
決済条件を確認していきます。

~~~~~決済用MA条件~~~~~
決済用MAの状態を表示しています
mac_1= 111.32495
mac_2= 111.46597
mac_1a= 111.32085
mac_2a= 111.46033

( mac_1 > mac_2 && mac_1a <= mac_2a)= false
買いポジションの決済条件に合致したか?falseなので合致していません。

( mac_1 < mac_2 && mac_1a >= mac_2a) = false
売りポジションの決済条件に合致したか?falseなので合致していません。

決済のOrdersTotal()= 0
保有&待機ポジション数は?"0"ですのでポジションはありません。

~~~エントリー条件開始~~~
エントリー条件を確認していきます

~~~~~エントリー用MA条件~~~~~
エントリー用MAの状態を表示しています
ma_1= 111.2623
ma_2= 111.2668571428571
ma_1a= 111.2652
ma_2a= 111.2648095238095

( ma_1 < ma_2 && ma_1a >= ma_2a) = true
買いエントリーの条件に合致したか?trueなので合致しました。

( ma_1 > ma_2 && ma_1a <= ma_2a)= false
売りエントリーの条件に合致したか?falseなので合致していません。

エントリーのOrdersTotal()= 0
保有&待機ポジション数は?"0"ですのでポジションはありません。

BUY= true
変数「BUY」の中身はtrueが入っています。

SELL= true
変数「SELL」の中身はtrueが入っています。

open #1 buy 0.01 USDJPY at 111.314 ok
買いの条件がtrueなりましたので、エントリーしました。

買いの条件がtrueに変化した後。エントリーすることが確認出来ましたので、コードが合っていることが分かります。

以上がエントリーする場合の動きになります。

ポジション保有中の動き

では次に、ポジションが保有中の動きを見ていきましょう。

先ほどのエントリーした「open #1 buy 0.01 USDJPY at 111.314 ok」のすぐ下の、「~~~OnTick()開始~~~」から見ていきます。

~~~OnTick()開始~~~ 
OnTick()がスタート

~~~決済条件開始~~~
決済条件を確認していきます。

~~~~~決済用MA条件~~~~~
決済用MAの状態を表示しています
mac_1= 111.32495
mac_2= 111.46597
mac_1a= 111.3209
mac_2a= 111.46035

( mac_1 > mac_2 && mac_1a <= mac_2a)= false
買いポジションの決済条件に合致したか?falseなので合致していません。

( mac_1 < mac_2 && mac_1a >= mac_2a) = false
売りポジションの決済条件に合致したか?falseなので合致していません。

決済のOrdersTotal()= 1
保有&待機ポジション数は?さきほどエントリーしたので"1"になりました。

"1"になったので、プログラムのfor(int i = OrdersTotal()-1; i>=0; i--)の条件に合致しますので、初めてforを通ります。

変数【i】の値= 0
forが通った時の変数 "i" の値です。"0" ですので、さきほどのforの条件i>=0が合致しているのが分かります。

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)= true
ifの条件の状態を表示しています。trueですので、条件が合致していることになります。合致しているので、ifが通ります。
因みに、「i(今回は"0")番目のポジションは取引数中ですか?」と言う意味になります。

if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnum)= true
さきほどと同じで、ifの条件の状態を表示しています。trueですので、条件が合致していることになります。合致しているので、ifが通ります。
現在保有中のポジションは、「EAの入っている通貨ペアと同じで且つマジックナンバーが合っていますか?」と言う意味になります。

if(OrderType()==OP_BUY)= true
同じく、ifの条件の状態を表示しています。trueですので、条件が合致していることになります。合致しているので、ifが通ります。
現在保有中のポジションは、「買いポジションですか?」と言う意味になります。

ここまでは通りましたが、つぎのプログラム(決済条件)のif( mac_1 > mac_2 && mac_1a <= mac_2a)の条件に合致していないので、決済はされませんでした。

ここから上の方にある、買いポジションの決済条件が"false"になっていますので、決済されないことが分かると思います。

~~~エントリー条件開始~~~
エントリー条件を確認していきます

~~~~~エントリー用MA条件~~~~~
エントリー用MAの状態を表示しています
ma_1= 111.2623
ma_2= 111.2668571428571
ma_1a= 111.2654
ma_2a= 111.2649047619048

( ma_1 < ma_2 && ma_1a >= ma_2a) = true
買いエントリーの条件に合致したか?trueなので合致しました。

( ma_1 > ma_2 && ma_1a <= ma_2a)= false
売りエントリーの条件に合致したか?falseなので合致していません。

エントリーのOrdersTotal()= 0
保有&待機ポジション数は?"0"ですのでポジションはありません。

BUY= true
変数「BUY」の中身はtrueが入っています。

SELL= true
変数「SELL」の中身はtrueが入っています。

買いのエントリー条件が、"true"ですが、つぎのプログラムif(BUY == true && OrdersTotal()==0)の条件に合致してしていないので、新たにエントリーしません。

OrdersTotal()==0ですので、ポジション保有中は新たにエントリーしません。

以上がポジション保有中の動きになります。

決済する場合の動き

それでは、最後の決済の場合の動きになります。#1を検索したときと同じ様に、「GigaText Viewer」で、キーボードの「ctrl」+「F」キーを押して、検索ボックスに #1 と入力して「OK」ボタンを押します。

「open #1 buy 0.01 USDJPY at 111.314 ok」の #1 が検索されたとおもいます。次に「F3」キーを押してください。

そうしますと、「close #1 buy 0.01 USDJPY at 111.314 at price 111.275」の#1 が検索されたとおもいます。

ではここから上にスクロールして頂き、最初の「~~~OnTick()開始~~~」から見ていきます。

~~~OnTick()開始~~~ 
OnTick()がスタート

~~~決済条件開始~~~
決済条件を確認していきます。

~~~~~決済用MA条件~~~~~
決済用MAの状態を表示しています
mac_1= 111.32605
mac_2= 111.32517
mac_1a= 111.321775
mac_2a= 111.32373

( mac_1 > mac_2 && mac_1a <= mac_2a)= true
買いポジションの決済条件に合致したか?trueなので合致しました。

( mac_1 < mac_2 && mac_1a >= mac_2a) = false
売りポジションの決済条件に合致したか?falseなので合致していません。

決済のOrdersTotal()= 1
保有&待機ポジション数は?ポジション保有中なので"1"になっています。

変数【i】の値= 0
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)= true
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnum)= true
if(OrderType()==OP_BUY) true
if(OrderType() 0
ここは、「ポジション保有中の動き」と同じなので省略します。

close #1 buy 0.01 USDJPY at 111.314 at price 111.275
買いポジションの決済条件が、trueですので決済されました。

以上が決済する場合の動きになります。

 

以上が出力されたログの解説になります。

今回のPrint()関数説明のは、ここまでにします。

次回は、私がPrint()関数を使用していて気づいた「注意点」についてお伝え致します。

Print関数でログ出力!問題解決方法のまとめ

今回お伝えしたように、ログとプログラムを並べて見ていくと、プログラムの動きが次第にわかるようになってくると思います。

「思った動きになっている」「思った動きになっていない」「変数の状態は?」などいろいろと確認が出来ますので、是非使ってみて下さい。

Programming master school
おすすめの記事