MT4 EAが1回もエントリーしない原因を特定する方法|Print()関数でデバッグ解説

コンパイルできたのに1回もエントリーしてくれない時の対処法
EA作成入門
記事内に商品プロモーションを含む場合があります
スポンサーリンク

はじめに

EAを作ったのに「1回もエントリーしない…」そんな経験はありませんか?
実はこの原因の多くは環境ではなく プログラムの条件分岐のミス にあります。

本記事では、初心者でもすぐに試せる Print()関数を使ったデバッグ方法 を解説。
「どのif文が通っていないのか」「変数の値が正しいのか」を簡単に確認できるので、EAが動かない原因を効率的に突き止められます。


まず疑うべきはプログラム

EAが意図通りに動かない原因の99%はコードの問題です。

  • バックテストデータが壊れている
  • 初期証拠金が不足している

といった例外もありますが、ほとんどの場合はif文などの条件分岐が正しく動いていないのが原因です。

「自分が書いたコードを疑う」ことが、問題解決の第一歩です。


Print()関数で条件分岐を追跡する

思い通りにエントリーしない時は、条件分岐がどこで止まっているのかを確認することが大切です。

その最も簡単な方法が Print()関数を挿入してログを残すこと です。

コード例で確認

以下のコードをみてください。これは、新規注文をするEAですが新規注文をしてくれないどこかが誤ったソースコードです。

//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                                    Copyright 2020, mef Software. |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link      "https://fx-prog.com/"
#property version   "1.00"


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
   int int_a = 1,int_b = 2,int_c = 3;   
   double ea_order_stop_price = 0, ea_order_good_price = 0;
   
   int_a = OrdersTotal();
   int_b = int_b + int_a;   
 
   if(int_a == 0)   
   {
      Print("a");
      if(int_b == int_c){
         Print("b");
         if(ea_order_good_price > ea_order_stop_price){
            Print("c");
            ea_order_stop_price = Ask - 100 * Point;
            ea_order_good_price = Ask + 100 * Point;     

            //新規注文
            int ea_ticket_res = OrderSend(NULL,OP_BUY,1,Ask,20,ea_order_stop_price,ea_order_good_price,"",0,0,clrBlue);
         }
      }

   }


   return(0);
}

一体どこに問題があるのでしょうか?

スポンサーリンク

Print()関数を使ったデバッグの基本

デバッグの基本は、if文等の条件分岐が自分の思った通りに通っているかを確認する事です。

サンプルコードにはif文が合計3つあります。そして、各if文の下の行にPrint()を記載しました。これでif文が正しく通っている事を確認できます。

こんなんで解決できるの?と思われるかもしれませんが解決できます!

バックテストで確認する

では、Print()を使う事でどうなるのかバックテストで確認してみましょう。

バックテスト画面でPrint()出力を確認する様子(A)

バックテスト中に赤枠の部分、操作履歴をクリックしてみると「a」がずっと表示されていますね!

これでどのif文に問題があるのかが一目でわかりました。

Print()で分かること

先ほどの結果から、以下の事がわかります。

  • 「何も」表示されない→1つ目のif文条件が誤っている
  • 「a」だけ表示 → 2つ目のif文条件が誤っている
  • 「a」「b」まで表示 → 3つ目のif文条件が誤っている
  • 「a」「b」「c」まで表示 → すべての条件を通過し、注文処理に到達

1つ目のif文の下に書いたPrint(“a”);が実行されているので1つ目のif文は『true』となっています。

ただ、Print(“b”);以降が表示されていないので『if(int_b == int_c)』は『false』となりエントリー処理までたどり着けていないことがわかりますよね。

どのif文が通っていないのかを探るためにはPrint()を使おう!
※” “で囲ってその中に表示したい文字を書く感じです

こんな感じで、自分のソースコードにも同様にif文の下にPrint()を付け加えて確認してみましょう。どこのif文が通っていないかがすぐに分かるはずです。


悪い部分を修正しよう

先ほどの続きになります。Print(“a”);は表示されていましたが、Print(“b”);とPrint(“c”);は表示されていませんでしたよね。

つまり、

ソース修正方法B

上の画像の通りで、if(int_a == 0)はtrueだけど2つ目のif文のif(int_b == int_c)がfalseになっているこという事がわかります。これでは、エントリーしてくれないですよね。OrderSend()関数が実行されていないんです。

なので、if(int_b == int_c)の条件が正しいのかをしっかりと考えます。正しいのであれば、その前のソースコードが間違っているという事です。今回はその前のソースコードを正しましょう。

21行目あたり「int_b = int_b + 1;」と修正します。

int start()
{
   int int_a = 1,int_b = 2,int_c = 3;   
   double ea_order_stop_price = 0, ea_order_good_price = 0;
   
   int_a = OrdersTotal();
   int_b = int_b + 1;   
 
   if(int_a == 0)   
   {
      Print("a");
      if(int_b == int_c){
         Print("b");

これでコンパイルして、バックテストで実行してみると・・・

バックテスト画面でPrint()出力を確認する様子(A+B)

「a」と「b」が表示されていますね。がそれでもまだ、エントリーはしてくれません。つまり、

ソース修正方法C

上の画像の通りで、3つ目のif文のif(ea_order_good_price > ea_order_stop_price)がfalseになっているこという事がわかります。これでも、エントリーしてくれないですよね。先ほどと同じくOrderSend()関数が実行されていないんです。

なので、if(ea_order_good_price > ea_order_stop_price)の条件が正しいのかをしっかりと考えます。今回は正しくなかったという事で、if文の条件を正しましょう。

今回であれば、if(ea_order_good_price == ea_order_stop_price)と修正します。

      if(int_b == int_c){
         Print("b");
         if(ea_order_good_price == ea_order_stop_price){
            Print("c");
            ea_order_stop_price = Ask - 100 * Point;
            ea_order_good_price = Ask + 100 * Point;     

            //新規注文
            int ea_ticket_res = OrderSend(NULL,OP_BUY,1,Ask,20,ea_order_stop_price,ea_order_good_price,"",0,0,clrBlue);
         }
      }

これでコンパイルして、バックテストで実行してみると・・・

バックテスト画面でPrint()出力を確認する様子(A+B+C)

「a」と「b」と「c」が表示されていますね。これでようやく全てのif文が正となりOrderSend()関数が実行されて、ようやくエントリーしてくれるようになりましたね!

こうやって、Print()関数を使ってif文でうまくtrueになっていない箇所を探し当てていく感じです。

スポンサーリンク

Print()で変数の値も確認できる

以下にPrint()関数の別の使用例も記載します。

Print()関数ですが、ただ文字を表示するだけではなくこんな使い方もできます。

Print(“指値は[” + ea_order_good_price + “]です”);

これは何をしているのかと言うと、実際の変数をPrintで表示しています。

Print(“文字列” + 変数 + “文字列”);

こんな感じで書く事で、変数を表示させることができます。

         if(ea_order_good_price == ea_order_stop_price){
            Print("c");
            ea_order_stop_price = Ask - 100 * Point;
            ea_order_good_price = Ask + 100 * Point;     

            Print("指値は[" + ea_order_good_price + "]です");

            //新規注文
            int ea_ticket_res = OrderSend(NULL,OP_BUY,1,Ask,20,ea_order_stop_price,ea_order_good_price,"",0,0,clrBlue);
         }

実際にプログラムして確認してみると、

Print()関数で変数を確認

こんな感じで、変数の値を表示する事ができます。

変数の値が正しいかどうかも、こうやって表示してあげればわかりやすくなるのでPrint()関数は是非覚えておきましょう。


Print()の注意点

  • デバッグ用のPrint()は調査が終わったら削除する
  • 必要に応じて残す場合は「変数の監視用」など役割を明確にする

ログが増えすぎると逆に分かりにくくなるので注意しましょう。


さいごに

以上が、『MT4 EAが1回もエントリーしない原因を特定する方法』です。

EAが「全然エントリーしない」時の最強の武器はPrint()関数です。

プログラム初心者のうちはバグの原因特定に時間がかかりがちですが、
Print()を数行仕込むだけで、どの条件が通っていない

 

✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまな
FX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


📊 【2025年最新】FX自動売買EAランキングも公開中!

当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント

タイトルとURLをコピーしました