English Русский 中文 Español Deutsch Português
テスターでのブレークポイント:それは可能です!

テスターでのブレークポイント:それは可能です!

MetaTrader 4 | 16 3月 2016, 09:19
1 107 0
Christo Tsvetanov
Christo Tsvetanov

はじめに

MQL4で恋しく思う唯一のものは、エキスパートアドバイザーのための標準のデバッガーです。すべての人間は人間らしい感情を持っており、そのため失敗をします。通常のプログラミングにて、ブレークポイントをセットし、プログラムを起動し、ブレークポイントに実行が達した時、停止します。そして、変数の内容を詳しくみることができます。

デバッギングデータの表示は、Print、Commentなどのような機能のおかげで可能です。しかし、時折一時的に特定の場所でプログラムを止め、状況を確認したくなります。ここで重要なポイントがいくつかあります。そのプログラムは、デモアカウントや実際のアカウントでトレードするために起動されます。つまり、数ヶ月間で結果を見ることができるようになるということで、デバッグモードは、エキスパートアドバイザーのテストモードでのみ使用できます。

どう動いているのか

「Visual Test Mode」はテスターに表示されているので、テスター内でのプログラムの素早い通過中のEAのレスポンスを追跡することができます。もし一時的に実行を止めたければ、キーボードで「Pause」を押すか、テスターのツールバーの同じ名前のボタンをマウスでクリックできます。ターミナルの開発者は、いくつかのとても面白い機能を持つWinUser32.mqhというライブラリを提供しています。それらのうちの一つが、keybd_eventです。好きなキーをどれでも押すことができます。

プログラムでポーズを押し、必要なデバッグ情報を表示する関数を記述することができます。エキスパートアドバイザーはDLLを用いているので、まずEAにおいてそれを可能にする必要があります。Ctrl+Oを押して、チェックボックスの選択を入れる/外します:



コードの始めにWinUser32の使用を宣言する必要があります:
#include <WinUser32.mqh>
このアクションは、BreakPointの宣言に続きます。ここでもいくつか重要な点がありますが、最もシンプルな実現方法は何も渡されないパラメータを持つことです:
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は解放がエミュレートされる必要があることを示しています。

エキスパートアドバイザーのコードのブレークポイントの代わりを用いる必要があり、ロングポジションの後、すぐにExpert Advisor Sampleの例がオープンされます。

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

Skypeを用いて、エキスパートアドバイザーからメッセージを送る方法 Skypeを用いて、エキスパートアドバイザーからメッセージを送る方法
この記事は、Skypeを用いてエキスパートアドバイザーから携帯電話にメッセージ、SMSを送る方法について取り扱います。
RSS フィードによるトレードシグナルの送信 RSS フィードによるトレードシグナルの送信
みなさんのコミュニティのメンバーと今すぐコミュニケーションをする有名な方法である RSS FEEDS として、トレードシグナルを送信する方法は私のアイデアです。
デイトレーディングの時間変換の原則 デイトレーディングの時間変換の原則
この記事は、価格フローを取得するためのオペレーション時間のコンセプトについて記載しています。この時間変換を考慮し、変更される移動平均のコードも含んでいます。
自動化トレーディングシステムの作成 自動化トレーディングシステムの作成
これはおそらく魅力的にうつるでしょう - 数分間で利益を生む自動トレーディングシステム(ATC)を作成するプログラムの所有者になれるのです。望ましいインプットを入れ、Enterを押すのみです。すると、テストされたATCを取得し、期待される結果を得ることができます。ユニークなATCの開発に数千時間もかけているところ、これらの内容は浅はかに聞こえます。一方で、これはとても印象的でもあります。しかし、この問題は解決することができるのです。