MT5でロット数を計算する式|許容損失と損切り幅から決める
損切りまでの距離が決まっているなら、注文のロット数は「許容する損失額 ÷ 1ロットあたりの損切り時の損失額」で決められます。1ロットあたりの損失額は、銘柄仕様のティックサイズとティックバリューで手計算できます。コードでは、結果を口座の通貨で返すと説明されているOrderCalcProfit関数を使うのが確実です。数量は、最後に「数量ステップ」に切り下げます。切り上げると、許容額を超えるためです。
この記事では、計算式、数字を入れた例、MQL5での関数、つまずきやすい点をまとめます。サンプルコードは、MetaEditorで0エラー・0警告でコンパイルできることを確認しています。
(確認:MQL5リファレンス「銘柄プロパティ」、MetaTrader 5ヘルプ「気配値表示」。確認日:2026年10月7日。ログインした口座での実行結果は、この記事では確認していません)
計算式
| 手順 | 式 |
|---|---|
| 1. 損切り幅を価格に直す | 損切り幅(ポイント)× ポイントの値(SYMBOL_POINT) |
| 2. ティック数にする | 価格幅 ÷ ティックサイズ(SYMBOL_TRADE_TICK_SIZE) |
| 3. 1ロットの損失額にする | ティック数 × ティックバリュー(銘柄仕様の値) |
| 4. ロット数にする | 許容する損失額 ÷ 1ロットの損失額 |
| 5. 数量ステップに切り下げる | 最小数量・最大数量の範囲に収める |
ティックバリューは、MT5ヘルプでは「単一価格の変化点のコスト」、MQL5リファレンスのSYMBOL_TRADE_TICK_VALUE_LOSSは「負けポジションの計算されたティック価格」と説明されています。どちらの説明も、口座通貨であるとは書かれていません。そのため、この記事の手計算の例は、ティックバリューが口座通貨で表示される前提の説明用の数字です。コードでは、「値は口座の預金通貨で返される」とMQL5リファレンスに書かれているOrderCalcProfitを使い、換算の前提を置かないようにしています。
数字を入れた例
説明用の例です。実際の値は、自分の口座の仕様で確認してください。
| ケース | 仕様 | 損切り20pips(200ポイント)の1ロットの損失額 | 許容損失 | 数量 |
|---|---|---|---|---|
| USDJPY・円口座 | ティックサイズ0.001、ティックバリュー100円 | 200 × 0.001 ÷ 0.001 × 100 = 20,000円 | 5,000円 | 5,000 ÷ 20,000 = 0.25ロット |
| EURUSD・ドル口座 | ティックサイズ0.00001、ティックバリュー1ドル | 200 × 0.00001 ÷ 0.00001 × 1 = 200ドル | 50ドル | 50 ÷ 200 = 0.25ロット |
20pipsは、3桁・5桁の価格の銘柄では200ポイントです(1pip=10ポイント)。pipsとポイントの換算はMT5の決済逆指値・決済指値の設定方法で扱っています。
MQL5の関数
次のコードは、銘柄・許容損失・損切り幅(ポイント)を渡すと、数量ステップに切り下げた数量を返します。1ロットの損失額は、OrderCalcProfitで「現在の売値(Ask)で1ロットを買い、損切り幅ぶん下がった価格で決済した時の損益」を口座通貨で出し、マイナス記号を除いた値を使います。最小数量に満たない時は、0を返して、注文しないようにしています。
input double InpRiskMoney = 5000.0; // 許容する損失額(口座通貨)
input double InpStopPoints = 200.0; // 損切り幅(ポイント)
// 1ロットの買いを、損切り幅ぶん逆行させた時の損失額(口座通貨)
double LossPerLot(const string symbol, const double stopPoints)
{
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double profit = 0.0;
if(ask <= 0.0 || point <= 0.0 || stopPoints <= 0.0)
return 0.0;
if(!OrderCalcProfit(ORDER_TYPE_BUY, symbol, 1.0, ask, ask - stopPoints * point, profit))
return 0.0;
return MathAbs(profit);
}
// 許容損失と損切り幅から注文数量を計算し、数量ステップに切り下げる
double CalcLots(const string symbol, const double riskMoney, const double stopPoints)
{
double lossPerLot = LossPerLot(symbol, stopPoints);
if(lossPerLot <= 0.0)
return 0.0;
double lots = riskMoney / lossPerLot;
double step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
double vmin = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double vmax = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
if(step > 0.0)
lots = MathFloor(lots / step) * step;
if(lots < vmin)
return 0.0; // 最小数量に満たない時は、注文しない
return MathMin(lots, vmax);
}
void OnStart()
{
double lots = CalcLots(_Symbol, InpRiskMoney, InpStopPoints);
PrintFormat("%s 損失額%.0f・損切り%.0fポイント → 数量 %.2f", _Symbol, InpRiskMoney, InpStopPoints, lots);
}
出力の見方はMQL5のPrintとログの保存場所を参照してください。OnStartはスクリプト用なので、EAに入れる時は、関数CalcLotsだけを取り出して、注文の直前に呼びます(スクリプトとEAの違いはMT5のスクリプトとEAの違い)。
つまずきやすい点
- 契約サイズ・ティックの値は、口座によって違う。マイクロ口座などでは、1ロットの通貨量が違うため、同じ式でもロット数が変わります。値は固定せず、実行時に取得します(MT5の銘柄仕様の見方)
- スプレッドと滑りは、この計算に入っていない。損切りが約定する価格は、指定した価格とずれることがあります。許容額に、余裕を見る必要があります
- 最小数量に満たない時の扱い。許容損失が小さすぎて、最小のロットでも超える時は、注文を見送るか、損切り幅を見直します。この関数は0を返して、見送ります
- 証拠金が足りるかは、別に確認します。ロット数が求まっても、余剰証拠金が足りなければ注文は通りません(MT5の証拠金維持率の見方と計算、MT5で注文できない時の確認)
- 複数のポジションを持つ時は、全体の許容損失を別に決めます。1回ごとの許容額を足し合わせた額が、全体の許容額を超えないようにしてください
まとめ
- ロット数 = 許容損失 ÷(損切り幅 ÷ ティックサイズ × ティックバリュー)。数量ステップに切り下げる
- ティックの値は銘柄仕様から取得し、固定しない。口座や業者を変えるとずれるため
- 最小数量に満たない時は注文しない。証拠金とスプレッドは、別に確認する
EAのロット計算が口座タイプでずれる例はTitan FXでMT5を使う前に確認する6項目にあります。
免責事項
この記事は情報提供を目的としたもので、投資助言ではありません。特定の業者・口座・取引を勧めるものではなく、売買のタイミングや金額を示すものでもありません。
外国為替証拠金取引は、為替変動により元本を割り込む可能性があります。レバレッジをかけた取引では、証拠金を上回る速度で損失が拡大する場合があります。過去の実績や記載された条件は、将来の結果を保証しません。
記載した取引条件は確認日時点の公式ページ・ヘルプの内容であり、その後変更される場合があります。取引に関する判断は、読者自身の責任で行ってください。


