テスターでのブレークポイント:それは可能です!
はじめに
MQL4で恋しく思う唯一のものは、エキスパートアドバイザーのための標準のデバッガーです。すべての人間は人間らしい感情を持っており、そのため失敗をします。通常のプログラミングにて、ブレークポイントをセットし、プログラムを起動し、ブレークポイントに実行が達した時、停止します。そして、変数の内容を詳しくみることができます。
デバッギングデータの表示は、Print、Commentなどのような機能のおかげで可能です。しかし、時折一時的に特定の場所でプログラムを止め、状況を確認したくなります。ここで重要なポイントがいくつかあります。そのプログラムは、デモアカウントや実際のアカウントでトレードするために起動されます。つまり、数ヶ月間で結果を見ることができるようになるということで、デバッグモードは、エキスパートアドバイザーのテストモードでのみ使用できます。
どう動いているのか
「Visual Test Mode」はテスターに表示されているので、テスター内でのプログラムの素早い通過中のEAのレスポンスを追跡することができます。もし一時的に実行を止めたければ、キーボードで「Pause」を押すか、テスターのツールバーの同じ名前のボタンをマウスでクリックできます。ターミナルの開発者は、いくつかのとても面白い機能を持つWinUser32.mqhというライブラリを提供しています。それらのうちの一つが、keybd_eventです。好きなキーをどれでも押すことができます。
プログラムでポーズを押し、必要なデバッグ情報を表示する関数を記述することができます。エキスパートアドバイザーはDLLを用いているので、まずEAにおいてそれを可能にする必要があります。Ctrl+Oを押して、チェックボックスの選択を入れる/外します:
コードの始めにWinUser32の使用を宣言する必要があります:
#include <WinUser32.mqh>
void BreakPoint()
その関数は、ビジュアルテスティングモードにて作動するので、チェックを挿入します:もしテスターがビジュアルテスティングモードになければ、そのままにします:
if (!IsVisualMode()) return(0);
いくつかのデータを視覚化します。個人的には、最も説明が詳しいものはComment()を使用したものです。BidとAskのみが必要だとしmさう。
string Comm=""; Comm=Comm+"Bid="+Bid+"\n"; Comm=Comm+"Ask="+Ask+"\n"; Comment(Comm);
“\n”は、ここでは以後のデータは次の行に表示されることを示しています。Pauseを押してみましょう。
keybd_event(19,0,0,0); Sleep(10); keybd_event(19,0,2,0);
最初の行はキーを押し、最後の行は解放しています。早すぎるポーズ/停止は処理されずにとどまる可能性があるので、Sleepボタンも必要です。19は、ポーズの仮想コードで、最後の行の2は解放がエミュレートされる必要があることを示しています。
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); BreakPoint();
以下が挿入される必要のあるコードです:
//We will use a function, described in header file #include //Breakpoint neither receive nor send back any parameters void BreakPoint() { //It is expecting, that this function should work //only in tester if (!IsVisualMode()) return(0); //Preparing a data for printing //Comment() function is used as //it give quite clear visualisation string Comm=""; Comm=Comm+"Bid="+Bid+"\n"; Comm=Comm+"Ask="+Ask+"\n"; Comment(Comm); //Press/release Pause button //19 is a Virtual Key code of "Pause" button //Sleep() is needed, because of the probability //to misprocess too quick pressing/releasing //of the button keybd_event(19,0,0,0); Sleep(10); keybd_event(19,0,2,0); }
ローカル変数に何をすべきでしょうか?
問題は宣言の外のそのような変数の「不可視性」です。この場合、そのデータは渡される必要があります。同じ記事からMacdCurrent変数を見たいとします。このために、以下のように関数を修正します:
void BreakPoint(double MacdCurrent) { if (!IsVisualMode()) return(0); Comment("MacdCurrent = ",MacdCurrent);
オプショナルブレークポイント
時々、プログラムが特定の行に達した時に常に止まらず、追加の必要条件が満たされた時のみ止まって欲しいと願います。これはループでは普通に発生します。例えば、カウンターが特定のすでに定義された値に達した際に実行中止したいとします。そのために追加の必要条件を渡す必要があります:
void BreakPoint(double MacdCurrent, bool Condition) { if (!IsVisualMode() || (!Condition)) return(0); //Or - which is the same: //if (!(IsVisualMode()&&Condition)) return(0); Comment("MacdCurrent = ",MacdCurrent);
次の通りに記述します:
for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); BreakPoint(MacdCurrent, cnt==1);
まとめ
そのプログラムに接続し、使用するためのライブラリを作成してみませんか?問題は、様々なバリエーションがあり、それごとにBreakPoint関数を修正する必要があることです。実際、上記に記載されているものは単なる一般的なものでしかありません。様々な方法で実装できます。
最後にプログラムでポーズを実現する方法を最初に推測したKlot に感謝したいと思います。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1427
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索