EAのコードは正しいはずなのに、チャートに適用しても発注が一切行われない、
という経験はないでしょうか。
原因を探した結果、コードではなく、
ツールバーのAutoTradingボタンがオフになっていただけだった、
ということがよくあります。
この記事では、自動売買が許可されているかを発注前に確認する、
IsTradeAllowed()の使い方と、
falseが返る代表的な原因について解説します。
・IsTradeAllowed()の書式と確認すべきタイミング
・falseが返る3つの代表的な原因
・非推奨関数IsTradeContextBusy()との違い
・MQL5のMQLInfoInteger(MQL_TRADE_ALLOWED)との対応関係
なぜ発注前にIsTradeAllowed()を確認すべきか
まず、この確認がなぜ必要なのかを見ていきます。
許可されていない状態で発注するとどうなるか
自動売買が許可されていない状態でOrderSend()を呼び出すと、
発注は失敗し、GetLastError()でエラーが返ります。
コードの不具合ではなく、環境設定が原因であることに気づきにくいケースです。
既刊MQLInfoInteger(MQL5)記事との対応関係
既刊記事では、MQL5でテスター実行中・取引許可を判定する方法を解説しました。
本記事はそのMQL4版として、
同じ目的をIsTradeAllowed()でどう実現するかを扱います。
この記事で扱う範囲
IsTradeAllowed()が確認するのは「EAの取引許可設定」です。
サーバーへの接続状態はIsConnected()という別の関数で確認します。
IsTradeAllowed()の基本的な使い方
関数の書式と使うタイミングを確認します。
関数の書式と戻り値
bool IsTradeAllowed();
引数は無く、自動売買が許可されていればtrue、
許可されていなければfalseを返します。
どのタイミングで確認すべきか
OnTick()の先頭、エントリー判定より前に確認するのが基本です。
許可されていない間は、不要な価格取得・判定処理を省略できます。
falseが返る3つの代表的な原因
・ツールバーのAutoTradingボタンがオフ
・EAプロパティの「Allow live trading」がオフ
・ブローカー側で自動売買が制限されている場合
AutoTradingボタンとEAプロパティの関係
2つの設定の役割の違いを確認します。
ツールバーのAutoTradingボタン
このボタンは、MT4端末全体の自動売買を一括でオン/オフする、
グローバルなスイッチです。
EAプロパティの「Allow live trading」
EAをチャートに適用する際のプロパティ画面にある、
このEA個別の自動売買許可チェックボックスです。
どちらか一方でもオフならfalseになる
・AutoTradingボタンがオンでも
・EA個別のAllow live tradingがオフなら発注は許可されない
・両方オンになっているかを確認する必要がある
実際に動くコード全体
ここまでの要素をまとめた、許可確認を組み込んだEAです。
//+------------------------------------------------------------------+
//| IsTradeAllowedGuardEA.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
input int FastMAPeriod = 5;
input int SlowMAPeriod = 20;
input double FixedLots = 0.1;
input int StopLossPips = 300;
input int MagicNumber = 20261007;
bool HasOpenPosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
return(true);
}
}
return(false);
}
void OnTick()
{
if(!IsTradeAllowed())
{
Comment("自動売買が許可されていません。",
"AutoTradingボタンとEAのAllow live tradingを確認してください");
return;
}
Comment("自動売買は許可されています");
if(HasOpenPosition())
return;
double fastMA = iMA(_Symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double slowMA = iMA(_Symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double fastMAPrev = iMA(_Symbol, PERIOD_CURRENT, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double slowMAPrev = iMA(_Symbol, PERIOD_CURRENT, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double sl = 0;
if(fastMAPrev <= slowMAPrev && fastMA > slowMA)
{
sl = Ask - StopLossPips * Point;
OrderSend(_Symbol, OP_BUY, FixedLots, Ask, 3, sl, 0,
"IsTradeAllowedGuardEA", MagicNumber, 0, clrBlue);
}
else if(fastMAPrev >= slowMAPrev && fastMA < slowMA)
{
sl = Bid + StopLossPips * Point;
OrderSend(_Symbol, OP_SELL, FixedLots, Bid, 3, sl, 0,
"IsTradeAllowedGuardEA", MagicNumber, 0, clrRed);
}
}
IsTradeContextBusy()との違い(非推奨関数)
似た名前の、もう1つの関数との違いを確認します。
かつてのシングルスレッド取引の名残
IsTradeContextBusy()は、
MT4がまだシングルスレッドで取引処理を行っていた時代に、
他の処理が取引コンテキストを使用中かを確認するための関数でした。
マルチスレッド化以降は実質的に使われていない
・MT4のマルチスレッド取引導入(ビルド600前後)以降
・取引コンテキストの排他制御という概念自体が薄れた
・この関数は現在は使う必要がないとされています
新しいコードではIsTradeAllowed()を優先する
自動売買の許可状態を確認したい場合は、
IsTradeContextBusy()ではなく、
IsTradeAllowed()を使うのが現在の標準的な書き方です。
MQL5のMQLInfoIntegerとの違い
MQL5ではどう書くかを確認します。
MQL5には同名の関数が無い
MQL5にはIsTradeAllowed()という名前の関数自体が存在しません。
MQLInfoIntegerで同じ情報を取得する
bool allowed = (bool)MQLInfoInteger(MQL_TRADE_ALLOWED);
MQL5では、プログラムの実行環境に関する様々な情報を取得する、
MQLInfoInteger()という汎用関数の識別子の1つとして同じ情報を取得します。
既刊MQL5記事へのリンク
MQLInfoIntegerで取得できる他の識別子(テスター実行中かどうか等)は、
既刊のMQL5記事も参照してください。
よくある誤解と注意点
実装でつまずきやすいポイントをまとめます。
ネット接続状態は確認しない
IsTradeAllowed()がtrueでも、
サーバーとの接続が切れていれば発注はできません。
接続状態はIsConnected()で別に確認する必要があります。
falseの間も不要な処理を繰り返さない設計にする
OnTick()の先頭でreturnする設計にしておくことで、
許可されていない間の無駄な指標計算・ログ出力を避けられます。
ストラテジーテスター内での挙動
ストラテジーテスター内では、
通常IsTradeAllowed()はtrueを返す前提でコードが動きます。
実運用のAutoTradingボタンのオフ忘れは、
デモ・実運用のチャートで別途確認する必要があります。
よくある質問
IsTradeAllowed()について、よくある疑問に回答します。
falseの間、エントリーのチェック自体を止めるべきですか?
止めることを推奨します。
許可されていない間に重い指標計算を繰り返しても、
発注できないため意味がなく、処理負荷の無駄になります。
デモ口座でもAutoTradingボタンの確認は必要ですか?
必要です。
デモ口座であっても、
AutoTradingボタンがオフならEAは発注しません。
リアル・デモにかかわらず、確認すべき項目です。
この関数をインジケーターでも使えますか?
呼び出し自体は可能ですが、
インジケーターは通常OrderSend()で発注しないため、
実務的な用途はEA(Expert Advisor)がほとんどです。
【MQL4】IsTradeAllowed()で自動売買が許可されているかを確認する方法について解説してみた(AutoTradingボタン・MQLInfoIntegerとの違い):まとめ
EAが発注しない原因は、コードの不具合だけでなく、
AutoTradingボタンやEAプロパティの設定であることがよくあります。
IsTradeAllowed()をOnTick()の先頭で確認する設計にしておけば、
許可されていない状態での無駄な処理を避けられます。
非推奨のIsTradeContextBusy()ではなく、
IsTradeAllowed()を使い、
MQL5ではMQLInfoInteger(MQL_TRADE_ALLOWED)が、
同じ役割を担うことも、
合わせて覚えておくとよいでしょう。
コメント