「証拠金維持率が下がりそうでロットが怖い…」「EA側で自動的にロット調整したい」──そんな悩みを抱える初心者〜中級者の方は多いはずです。
本記事では、証拠金維持率(〇%)を保つために必要なロット数を自動算出するMT4用関数を、コピペで使えるMQL4サンプルコード+初心者向けの丁寧な解説つきで紹介します。
以下のような用途で活用できます:
- 証拠金維持率◯%を常に保つロット数を自動算出したい
- 資金量に応じて可変ロットの EA を作りたい
- FXTFなどの「最大ロット制限」を考慮した安全設計をしたい
- 複数EAで共通利用できるロット算出関数を作りたい
はじめに:ロット計算を関数化しておくメリット
MT4 の EA を作る際、「証拠金維持率が下がらないようにロットを抑えたい」「資金に合ったロットだけを安全にエントリーしたい」という場面は非常によくあります。
こうしたロット計算を毎回その場しのぎで書くのは無駄であり、ミスの原因にもなります。 関数としてまとめておけば、他のEAにも使い回しができ、保守性・安全性が大きく向上します。
【コピペOK】証拠金維持率からロット数を自動計算する関数
まずは完成形の関数です。EAにそのまま貼り付けて使えます。
//+------------------------------------------------------------------+
//|【関数】証拠金維持率に対してのロット数を取得する
//|
//|【引数】 SyoukoIji:証拠金維持率 (200%に設定したい場合、200)
//| SaidaiLot:最大ロット数を設定する (0設定で、自動取得)
//|
//|【戻値】ロット数(1000通貨=0.01)
//|
double funcLotGet(int SyoukoIji,int SaidaiLot)
{
double Kekka=0;
//最大ロット数確認
double server_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
if(SaidaiLot == 0 || SaidaiLot > server_Lot){
SaidaiLot = server_Lot;
}
//口座残高
double KouzaMoney = AccountInfoDouble(ACCOUNT_BALANCE);
//利用可能金額算出
Kekka = KouzaMoney / SyoukoIji * 100;
//必要証拠金(1ロット分)で割る
Kekka = Kekka / MarketInfo(Symbol(),MODE_MARGINREQUIRED);
//少数点を0.01単位までにする
Kekka = NormalizeDouble(Kekka, 2);
//最大ロット数を超えている場合は、最大ロット数にする
if(Kekka > SaidaiLot){
Kekka = SaidaiLot;
}
return Kekka;
}この関数は「口座残高 → 維持率 → 必要証拠金」という流れから、自動的にロット数を算出します。 最大ロット制限も考慮しており、実運用でも安全に使える仕様です。
関数の引数と戻り値の解説
引数
- SyoukoIji:目標証拠金維持率(200%にしたいなら「200」)
- SaidaiLot:最大ロット(0を指定すれば自動取得)
FX業者によって最大ロットは異なるため、安全のため自動制限をかける仕様にしています。
戻り値
設定した維持率を満たすために必要なロット数(0.01単位)を返します。 最大ロット制限を超えることはありません。
処理内容の流れ
処理は次の4ステップで構成されています:
- 口座残高(BALANCE)を取得
- 維持率から「実際に使える資金」を算出
- 必要証拠金(1ロット)で割ることでロット計算
- 小数点2桁に丸め、最大ロット制限を適用
例:BALANCE 5,000,000円、維持率200% の場合
(5,000,000円 / 200%) × 100 = 2,500,000円(使用可能額)
必要証拠金が 430,000円なら:
2,500,000 / 430,000 = 5.81ロット
→ NormalizeDouble() により 5.81ロット となります。
【使用例】EAのロット指定を自動化する
// 新規エントリー注文
int CNo = OrderSend(
NULL, // 通貨ペア
OP_BUY, // オーダータイプ[OP_BUY / OP_SELL]
funcLotGet(200,10), // ロット[0.01単位](証拠金200%維持、FXTFは最大10Lot)
Ask, // オーダープライスレート
・・・OrderSend()関数のロット数のところに書き込むだけでOKです。あとは、funcLotGet()関数を丸々ソース内に貼り付けてください。

使用した結果はこんな感じで、証拠金維持率は常に200%前後で推移するロット数でエントリーできています。
実装のポイントと注意事項
- 必要証拠金(MODE_MARGINREQUIRED)は口座タイプで異なる
必ずデモ口座で数値を確認してから本番に使用することを推奨します。 - 最大ロット制限は必ず適用する
FXTF のように「10ロット上限」の業者では不可欠な安全処理。 - 維持率100%を切る計算は危険
ロットの増やしすぎを防ぐため、維持率は最低150〜200%推奨です。
さいごに:EAの共通パーツとして使い回そう
以上、証拠金維持率からロット数を自動計算する関数(MT4版)を紹介しました。 一度関数化しておけば、複数EAの安全設計に活用でき、資金管理の精度を大幅に高められます。
👉 EA の基礎から学びたい方は FX自動売買(EA)の始め方ガイド もおすすめです。
👉 関数・小ネタをもっと探したい方は EAプログラミング小ネタ集 もぜひどうぞ。
✅ 他にも多数のEAサンプルを公開中!
今回紹介した内容以外にも、当サイトではさまざまな
FX自動売買EAのサンプルコードを提供しています。
自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。
📊 【2025年最新】FX自動売買EAランキングも公開中!
当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。
EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!









コメント
初めまして。
MQL4の勉強を始めて数週間の初学者です。
サンプルソース集が非常に参考になり、本当にありがたいです。
もし可能でしたら、1トレード当たり全体証拠金のN%のリスクを取るようなロットサイズを計算する関数?をこちらのサイトでご教授お願い致します。
これからもよろしくお願いします。
グレープドラゴンさん
はじめまして、参考にして頂き有難うございます!
全体証拠金といいますとどんな感じでしょう。
例えば口座資金50万円(余剰証拠金50万円)あって、米ドル/円の10万通貨の必要証拠金が5万円の場合、
N%を10%とすると結果【Lot=1.0(10万通貨)】となるような関数でしょうか?
お返事ありがとうございます!
ご丁寧にありがとうございます!
例えば50万円があって、始めに1トレード10%(5万円)失ってもいい(許容損失額)と逆指値幅を決定してから適正ロットを計算すると言うことです!
そういう事ですね。
出来ると思いますので、近々記事にしますね。
返信ありがとうございます!
楽しみに記事の更新を待ちますっ!
お待たせしました。
記事が書けましたのでまた参考にしてみてください。