「口座残高」「有効証拠金」「余剰証拠金」「証拠金維持率」——似たような言葉が並んでいて、どれがどの関数に対応するのか混乱した経験はないでしょうか。実はこのテーマ、ネット上のサンプルコードをそのまま使うと、括弧の数が合っていなかったり、説明している関数と実際のコードが違っていたりして、コピペしただけではエラーになったり誤った値を取得したりすることがあります。

この記事では、EA(エキスパートアドバイザー)開発で必ず使う口座残高系の関数を、実際にMetaEditorでコンパイルできる正しいコードとあわせて整理します。

口座残高

EA(エキスパートアドバイザー)を作成すると非常に重要になるのが口座残高に関する情報です。

今回は口座残高系でよく活用するソースコードを、1つずつ順番にご紹介します。

残高 (Balance)

残高 (Balance)はその名の通りで口座残高になります。

口座残高は含み損益を一切考慮していないので、ポジションが決済されるまでは値が変化しません。

含み損益を一切考慮していないので、ポジションを決済するまで値は変化しない。

double AccountBalance();

含み損益 (Floating Profit/Loss)

含み損益 (Floating Profit/Loss)はオープンポジションの損益合計になります。

double AccountProfit();

有効証拠金 (Equity)

有効証拠金は口座残高に未実現の損益(含み益/含み損)を加えた証拠金残高です。

有効証拠金 (Equity)はAccountEquity()で求めることができます。

double AccountEquity();//有効証拠金 = 残高 + 含み損益

必要証拠金 (Margin)

必要証拠金 (Margin)は売買に必要な最低額です。

必要証拠金 ≒ 約定金額 / レバレッジ

約定金額は本来売買に必要な金額(約定予定を含む)です。

1ドル=100円で1万通貨を売買する場合は100万円。

レバレッジが1の場合100万円が口座になければ、

売買できませんが、レバレッジ100であれば1万円あれば売買することができます。

注意点としては、実際の値は業者によって丸められることがあるので注意が必要です。

まず、新規ポジションの必要証拠金を調べるためにAccountFreeMarginCheck() を利用します。

double  AccountFreeMarginCheck(
   string  symbol,     // symbol
   int     cmd,        // trade operation
   double  volume      // volume
   );

AccountFreeMarginCheck() は、新規ポジションを取った場合の余剰証拠金を求める点に注意が必要です。

必要証拠金に変換する場合は現時点の余剰証拠金との差分を取る必要があります。

必要証拠金と書いて、オープンポジションの必要証拠金合計を指すこともあります。

この合計値を正確に求めるには AccountMargin() が使える。

double new_margin = AccountFreeMargin() - AccountFreeMarginCheck(Symbol(), OP_BUY, MarketInfo(Symbol(), MODE_MINLOT));

※よくある間違い: `AccountFreeMarginCheck(…)`のように関数の中でさらに`MarketInfo(…)`のような別の関数を呼び出すと、閉じ括弧を1つ書き忘れやすくなります。上のコードのように、外側の関数呼び出しの閉じ括弧まで含めて数が合っているか、書き終えたら必ず確認してください。

余剰証拠金 (Free Margin)

余剰証拠金 (Free Margin)は有効証拠金から必要証拠金を差し引いた金額になります。

利益が発生すると、利益分が余剰証拠金に加えられます。

逆に損失が発生すると、損失分が余剰証拠金から差し引かれていきます。

余剰証拠金が新規の必要証拠金以上ないと新規注文は出来ないです。

余剰証拠金 (Free Margin)はAccountFreeMargin() で求めることができます。

double free_margin = AccountFreeMargin();//余剰証拠金 = 有効証拠金 - オープンポジションの必要証拠金合計

※注意: `AccountFreeMarginCheck()`(引数3つ、新規ポジションを取った場合の余剰証拠金を求める)と`AccountFreeMargin()`(引数なし、現時点の余剰証拠金そのものを求める)は名前が似ているため混同しやすい関数です。目的に合わせてどちらを使うか確認してください。

余剰証拠金維持率 (Margin Level)

余剰証拠金維持率 (Margin Level)は時価評価総額に対する必要証拠金の割合のことです。

一般的には余剰証拠金維持率が一定値以下になると強制ロスカットされます。

余剰証拠金維持率、強制ロスカットレベルなどはAccountInfoDouble() で求めることができる。

//余剰証拠金維持率
double margin_level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);
 
//SO_CALL はメールなどで連絡が来るレベル
//SO_SO は強制ロスカットになるレベル
double so_call = AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL);
double so_so   = AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);

なお強制ロスカットのレベルは業者によって、

  • 割合(余剰証拠金維持率)
  • 金額(余剰証拠金)

の2通りがあります。

ACCOUNT_MARGIN_SO_MODEがACCOUNT_STOPOUT_MODE_PERCENTの場合は、

余剰証拠金維持率を参照しており、

ACCOUNT_STOPOUT_MODE_MONEY の時は余剰証拠金の額そのものを参照します。

ENUM_ACCOUNT_STOPOUT_MODE stop_mode = (ENUM_ACCOUNT_STOPOUT_MODE) AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
// 0: ACCOUNT_STOPOUT_MODE_PERCENT
// 1: ACCOUNT_STOPOUT_MODE_MONEY

組み合わせて使う: 証拠金維持率が下がったら警告するコード

ここまでの関数を組み合わせると、証拠金維持率が強制ロスカット水準に近づいたときに警告を出すコードが作れます。ポジションを持っていないときは`AccountMargin()`が0になり維持率の計算自体に意味がないため、ポジションがある場合だけ判定する点に注意してください。

//+------------------------------------------------------------------+
//|                                          MarginLevelWarning.mq4   |
//+------------------------------------------------------------------+
#property strict

void OnTick()
  {
   //ポジションが無いときは維持率の判定自体に意味がないため何もしない
   if(AccountMargin() <= 0)
      return;

   double margin_level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);
   double so_call = AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL);

   if(margin_level <= so_call)
     {
      Alert(Symbol(), ": 証拠金維持率が警告水準(", so_call, "%)を下回りました。現在", margin_level, "%");
     }
  }
//+------------------------------------------------------------------+
Copy

Alert()は同じ条件が続く間、ティックのたびに何度も鳴り続けます。頻繁な通知を避けたい場合は、直近で警告済みかどうかを記録するフラグを追加し、状態が変わったときだけ通知する形に変えてください。

まとめ

今回は口座残高に関するソースコードをご紹介しました。

EA(エキスパートアドバイザー)を作成する場合に非常に重要なので、

ぜひ理解して使いこなせるようにしましょう。

関連記事