EA(自動売買)を開発するとき、「今の口座残高はいくらか?」「あとどれくらい注文を出せる余裕があるか?」といった口座情報の取得は欠かせません。
MQL4には口座情報を取得するための便利な関数が用意されています。この記事では、特に重要な4つの関数――AccountBalance()・AccountEquity()・AccountMargin()・AccountFreeMargin()の使い方を、コードサンプル付きでわかりやすく解説します。
4つの関数の役割を理解しよう
まずは、それぞれの関数が「何を返すのか」を整理しましょう。
AccountBalance() ― 口座残高
AccountBalance()は、口座の残高(Balance)を返す関数です。ここで言う残高とは、確定済みの損益のみを反映した金額です。含み損益は一切考慮されないため、ポジションを決済するまで値は変化しません。
void OnTick()
{
double balance = AccountBalance();
Print("口座残高: ", balance, " ", AccountCurrency());
}
AccountEquity() ― 有効証拠金
AccountEquity()は、有効証拠金(Equity)を返します。有効証拠金は次の計算式で求められます。
有効証拠金 = 残高 + 含み損益(+スワップ)
ポジションを保有していないときは、残高と有効証拠金は同じ値になります。ポジションを持っている場合は、含み損益によってリアルタイムに変動します。
void OnTick()
{
double equity = AccountEquity();
Print("有効証拠金: ", equity, " ", AccountCurrency());
}
AccountMargin() ― 必要証拠金
AccountMargin()は、現在保有しているポジションに対する必要証拠金(Used Margin)の合計を返します。ポジションを持っていなければ0になります。
void OnTick()
{
double margin = AccountMargin();
Print("必要証拠金: ", margin, " ", AccountCurrency());
}
AccountFreeMargin() ― 余剰証拠金
AccountFreeMargin()は、余剰証拠金(Free Margin)を返します。計算式は次のとおりです。
余剰証拠金 = 有効証拠金 − 必要証拠金
この値がゼロに近づくと新規注文が出せなくなり、マイナスになるとマージンコール(強制ロスカット)の対象になります。EA開発では非常に重要な値です。
void OnTick()
{
double freeMargin = AccountFreeMargin();
Print("余剰証拠金: ", freeMargin, " ", AccountCurrency());
}
4つの関数の関係を図で理解する
4つの値の関係を整理すると、次のようになります。
/*
┌─────────────────────────────────────────┐
│ AccountBalance() │
│ (口座残高) │
│ + │
│ 含み損益・スワップ │
│ = │
│ AccountEquity() │
│ (有効証拠金) │
├────────────────────┬────────────────────┤
│ AccountMargin() │ AccountFreeMargin()│
│ (必要証拠金) │ (余剰証拠金) │
└────────────────────┴────────────────────┘
*/
このように、有効証拠金は必要証拠金と余剰証拠金に分かれるという関係を覚えておくと、各関数の役割がスッキリ理解できます。
口座情報を一括表示するサンプルコード
4つの関数に加えて、証拠金維持率(Margin Level)も計算して一括表示するサンプルです。証拠金維持率は AccountEquity() / AccountMargin() * 100 で求められます。
void OnTick()
{
double balance = AccountBalance();
double equity = AccountEquity();
double margin = AccountMargin();
double freeMargin = AccountFreeMargin();
// 証拠金維持率の計算(ポジションがないときはゼロ除算を回避)
double marginLevel = 0;
if(margin > 0)
marginLevel = equity / margin * 100.0;
Print("===== 口座情報 =====");
Print("残高: ", DoubleToString(balance, 2), " ", AccountCurrency());
Print("有効証拠金: ", DoubleToString(equity, 2), " ", AccountCurrency());
Print("必要証拠金: ", DoubleToString(margin, 2), " ", AccountCurrency());
Print("余剰証拠金: ", DoubleToString(freeMargin, 2), " ", AccountCurrency());
Print("証拠金維持率: ", DoubleToString(marginLevel, 2), " %");
}
ポジションを保有した状態でこのEAを動かすと、ティックごとに口座情報がログに出力されます。デバッグやテストにぜひ活用してください。
EA開発での実践活用テクニック
テクニック1:証拠金維持率チェックでエントリーを制御する
証拠金維持率が一定以下になったら新規エントリーを止める、という安全装置をEAに組み込む方法です。
bool IsSafeToTrade(double minMarginLevel)
{
// ポジションがない場合はチェック不要(安全)
if(AccountMargin() == 0)
return true;
double marginLevel = AccountEquity() / AccountMargin() * 100.0;
if(marginLevel < minMarginLevel)
{
Print("証拠金維持率が低下しています: ", DoubleToString(marginLevel, 2), "%");
return false;
}
return true;
}
// 使用例
void OnTick()
{
// 証拠金維持率が200%以上のときだけエントリー許可
if(!IsSafeToTrade(200.0))
return;
// ここにエントリーロジックを書く
}
テクニック2:AccountFreeMarginCheck()で事前に証拠金をシミュレーション
MQL4にはAccountFreeMarginCheck()という便利な関数もあります。これは「指定した通貨ペア・売買方向・ロット数で注文を出した場合の余剰証拠金」を事前にシミュレーションできます。
証拠金が不足する場合はエラーコード134(ERR_NOT_ENOUGH_MONEY)が生成されるため、注文前のチェックに最適です。
bool HasEnoughMargin(string symbol, int cmd, double lots)
{
double freeMarginAfter = AccountFreeMarginCheck(symbol, cmd, lots);
if(freeMarginAfter <= 0 || GetLastError() == 134)
{
Print("証拠金不足: 注文後の余剰証拠金 = ", DoubleToString(freeMarginAfter, 2));
return false;
}
return true;
}
// 使用例
void OnTick()
{
double lots = 0.1;
if(!HasEnoughMargin(Symbol(), OP_BUY, lots))
{
Print("証拠金が足りないためエントリーを見送ります");
return;
}
// 注文処理へ進む
}
テクニック3:余剰証拠金からロットを自動計算する
余剰証拠金の一定割合を使ってロット数を自動計算する方法です。資金管理の基本として多くのEAで使われるテクニックです。
double CalcLotByFreeMargin(double riskPercent)
{
// 余剰証拠金の一定割合を使用可能金額とする
double availableMargin = AccountFreeMargin() * riskPercent / 100.0;
// 1ロットあたりの必要証拠金を概算
double marginPerLot = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
if(marginPerLot <= 0)
return 0.0;
double lots = availableMargin / marginPerLot;
// ロットステップに丸める
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
lots = MathFloor(lots / lotStep) * lotStep;
// 最小・最大ロットの制限
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
lots = MathMax(minLot, MathMin(maxLot, lots));
return lots;
}
// 使用例:余剰証拠金の10%でロット計算
void OnTick()
{
double lots = CalcLotByFreeMargin(10.0);
Print("算出ロット数: ", DoubleToString(lots, 2));
}
よくある疑問と注意点
Q. AccountBalance()とAccountEquity()の違いは?
AccountBalance()は確定済みの残高のみ、AccountEquity()は含み損益を加えた「今この瞬間の実質的な資産額」です。ポジションがなければ同じ値になります。
Q. デモ口座でも使える?
はい、すべての関数はデモ口座でもリアル口座でも同じように動作します。開発中はデモ口座で十分テストしてからリアル口座に移行しましょう。
Q. MQL5では使える?
MQL5では関数名が異なります。AccountInfoDouble(ACCOUNT_BALANCE) のように AccountInfoDouble() 関数にパラメータを渡す形式になっています。MQL4からの移行時にはご注意ください。
まとめ
今回紹介した4つの口座情報取得関数を一覧表で振り返りましょう。
| 関数名 | 取得できる値 | 含み損益の影響 |
|---|---|---|
AccountBalance() |
口座残高 | 受けない |
AccountEquity() |
有効証拠金(残高+含み損益) | 受ける |
AccountMargin() |
必要証拠金 | 間接的に受ける |
AccountFreeMargin() |
余剰証拠金(有効証拠金−必要証拠金) | 受ける |
これらの関数を組み合わせることで、証拠金維持率のチェック、注文前の証拠金シミュレーション、自動ロット計算など、安全で実用的なEAを作ることができます。
まずはサンプルコードをコピーしてストラテジーテスターで動かしてみてください。実際の数値を確認しながら学ぶことで、理解がぐっと深まるはずです。

