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項目にあります。

免責事項

この記事は情報提供を目的としたもので、投資助言ではありません。特定の業者・口座・取引を勧めるものではなく、売買のタイミングや金額を示すものでもありません。

外国為替証拠金取引は、為替変動により元本を割り込む可能性があります。レバレッジをかけた取引では、証拠金を上回る速度で損失が拡大する場合があります。過去の実績や記載された条件は、将来の結果を保証しません。

記載した取引条件は確認日時点の公式ページ・ヘルプの内容であり、その後変更される場合があります。取引に関する判断は、読者自身の責任で行ってください。