2018年7月11日水曜日

[MQL4] Metatrader の口座残高に関わる情報 6種

[Account Information - MQL4 Reference](https://docs.mql4.com/account) で得られる情報の中で、口座残高に関わるものをまとめました。
### 残高 (Balance) いわゆる口座残高。 [AccountBalance()](https://docs.mql4.com/account/accountbalance) で求めることができる。 含み損益を一切考慮していないので、ポジションを決済するまで値は変化しない。 ### 含み損益 (Floating Profit/Loss) オープンポジションの損益合計。 [AccountProfit()](https://docs.mql4.com/account/accountprofit) で求めることができる。 ### 有効証拠金 (Equity) ``` 有効証拠金 = 残高 + 含み損益 ``` [AccountEquity()](https://docs.mql4.com/account/accountequity) で求めることができる。 ### 必要証拠金 (Margin) 売買に必要な最低額。 ``` 必要証拠金 ≒ 約定金額 / レバレッジ ``` 約定金額は本来の売買に必要な金額(約定予定も含む)。 1ドル100円で1万通貨を売買する場合、100万円。 レバレッジが1の場合、100万円が口座に無いと売買できないが、レバレッジ100ならば1万円あれば売買できるということ。 ただし、実際の値は丸められることがあるブローカーによるので注意。 新規ポジションの必要証拠金を事前に調べるには、[AccountFreeMarginCheck()](https://docs.mql4.com/account/accountfreemargincheck) が使える。 ```mq4 `gutter: false; double new_margin = AccountFreeMargin() - AccountFreeMarginCheck(Symbol(), OP_BUY, MarketInfo(Symbol(), MODE_MINLOT); ``` [AccountFreeMarginCheck()](https://docs.mql4.com/account/accountfreemargincheck) は新規ポジションを取った場合の余剰証拠金(次項参照)を求める点に注意が必要。 必要証拠金に変換するには現時点の余剰証拠金との差分を取る必要がある。 **「必要証拠金」と書いて、オープンポジションの必要証拠金合計を指すこともある。** この合計値を正確に求めるには [AccountMargin()](https://docs.mql4.com/account/accountmargin) が使える。 ### 余剰証拠金 (Free Margin) [AccountFreeMargin()](https://docs.mql4.com/account/accountfreemargin) で求めることができる。 新規注文に使用できる金額。余剰証拠金が(新規の)必要証拠金以上ないと新規注文は出来ない。 ``` 余剰証拠金 = 有効証拠金 - オープンポジションの必要証拠金合計 ``` ただし、上記の式が成り立つのは [AccountFreeMarginMode()](https://docs.mql4.com/account/accountfreemarginmode) が 1 (含み損益を考慮)の場合のみ大抵の業者だと1のはず。 [AccountFreeMarginMode()](https://docs.mql4.com/account/accountfreemarginmode) の値は以下。 - 0 含み損益を考慮しない - 1 含み損益を考慮する - 2 含み益のみ考慮する - 3 含み損のみ考慮する ### 余剰証拠金維持率 (Margin Level) ``` 余剰証拠金維持率 = 有効証拠金 / オープンポジションの必要証拠金合計 ``` 一般的には、余剰証拠金維持率が一定値以下になると、強制ロスカットされる。 余剰証拠金維持率、強制ロスカットレベル等は [AccountInfoDouble()](https://docs.mql4.com/account/accountinfodouble) で求めることができる。 ```mq4 `gutter: false; // 余剰証拠金維持率 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` の時は余剰証拠金の額そのものを参照するとのこと。 ```mq4 `gutter: false; 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 ```