MT4でEAを作ったのに、「1回もエントリーしない」「全く動かない」 そんな経験はありませんか?
実はこの原因の多くは、環境ではなくプログラム内の条件分岐(if文)のミスにあります。
本記事では、Print()関数を使ってEAがエントリーしない原因を特定する方法を解説します。
「どのif文が通っていないのか」「変数の値が想定通りか」をログで確認できるため、
初心者でも効率よくデバッグできます。
EAが動かない原因は、条件分岐のミスだけとは限りません。
実際には OrderSendが内部で失敗している、
if文に入る前で処理が止まっている ケースも非常に多いです。
Print()ログで原因が特定できない場合は、
デバッグ機能を使ってソースコードを1行ずつ確認する方法も有効です。
こうした原因を理解したうえで、まず確認すべきポイントを整理していきましょう。
EAがエントリーしない時にまず疑うべきはプログラム
EAが意図通りに動かない原因の多くは、コードにあります。
- バックテストデータが壊れている
- 初期証拠金が不足している
といった例外もありますが、ほとんどの場合は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()を使う事でどうなるのかバックテストで確認してみましょう。

バックテスト中に赤枠の部分、操作履歴をクリックしてみると「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(“a”);は表示されていましたが、Print(“b”);とPrint(“c”);は表示されていませんでしたよね。
つまり、

上の画像の通りで、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");これでコンパイルして、バックテストで実行してみると・・・

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

上の画像の通りで、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);
}
}これでコンパイルして、バックテストで実行してみると・・・

「a」と「b」と「c」が表示されていますね。これでようやく全てのif文が正となりOrderSend()関数が実行されて、ようやくエントリーしてくれるようになりましたね!
こうやって、Print()関数を使ってif文でうまくtrueになっていない箇所を探し当てていく感じです。
Print()とデバッグを組み合わせることで、
「なぜエントリーしないのか」をかなり高い確率で特定できます。
より詳しく処理の流れを追いたい場合は、以下の記事も参考にしてください。
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()は調査が終わったら削除する
- 必要に応じて残す場合は「変数の監視用」など役割を明確にする
ログが増えすぎると逆に分かりにくくなるので注意しましょう。
❓ MT4 EAがエントリーしない時のよくある質問【Print()デバッグQ&A】
💬 EAが1回もエントリーしない原因や、Print()を使ったデバッグ方法についてよくある質問をまとめました。
最も多い原因は、if文などの条件分岐が一度もtrueになっていないことです。
コンパイルやMT4の設定に問題がなくても、エントリー条件が成立していなければOrderSend()は実行されません。
Print()関数を使うことで、どのif文まで処理が進んでいるかをログで確認できます。
これにより、どの条件分岐がfalseになっているのかを視覚的に把握できます。
Print()が一切表示されない場合は、最初のif文自体がfalseになっている可能性が高いです。
エントリー条件以前に、前提条件や初期値の設定を確認する必要があります。
途中までPrint()が表示される場合は、その次のif文条件がfalseになっています。
最後のOrderSend()直前までPrint()が表示されない限り、エントリー処理には到達しません。
Print()で原因が特定できない場合は、MT4のデバッグ機能を使って1行ずつ処理を確認する方法が有効です。
処理の流れや変数の変化をより正確に追跡できます。
デバッグ目的のPrint()は、原因特定が終わったら基本的に削除することをおすすめします。
ログが増えすぎると、逆に重要な情報が分かりにくくなるためです。
さいごに
以上が、『MT4 EAが1回もエントリーしない原因を特定する方法』です。
EAが「全然エントリーしない」時の最強の武器はPrint()関数です。
プログラム初心者のうちはバグの原因特定に時間がかかりがちですが、
Print()を数行仕込むだけで、どの条件が通っていない
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。









コメント