Edgoro
Stock indices · Free calculator

JPN225 (Nikkei 225) lot size calculator

On JPN225 a point is a 1.0 move in the Nikkei, priced in yen, and the contract size really differs by broker: 1 at Capital.com and Purple Trading, 100 at BlackBull. Risking $100 with a 300-point stop gives 50 lots at a contract size of 1, or 0.50 lots at 100 (USD/JPY 150).

Risk per trade
Position size (rounded down to 0.01 lot)
50.00 lots
Risk amount$100.00
Exact size50.0000 lots
Mini lots (0.10)500.00
Micro lots (0.01)5,000.0
Value per point$0.33
Value of 1 point per lot$0.01

USD account. Point value per lot varies by broker — check your contract specification. Spread and commission not included.

The calculator opens on the worked example below: a USD account, 1% of $10,000, USD/JPY at an example rate of 150. Trading involves substantial risk of loss and is not suitable for every investor. Edgoro is a software tool, not a broker or financial adviser: nothing it produces is investment advice, and past or backtested performance does not guarantee future results.

What 1 point is on JPN225

JPN225 (JP225 at some brokers) is a CFD on the Nikkei 225, quoted in yen. Profit = points × contract size × lots, in yen, converted at USD/JPY for a USD account.

With a contract size of 1 a point is ¥1 per lot, $0.0067 at USD/JPY 150, so positions are counted in tens of lots. With 100 it is ¥100 per lot, $0.67: the same trade is a hundred times fewer lots. Neither is wrong; using one broker's number at another broker is.

JPN225 point value per lot

Value of one point (1.00 in price): 1 × 1 = ¥1 ÷ 150 = $0.0067 per 1.00 lot, at an example USD/JPY rate of 150, with a contract size of 1.

Position1 point300 points (300.00)
1.00 lot$0.0067$2.00
0.10 lot$0.0007$0.20
0.01 lot$0.0001$0.0200

Worked example: 1% of $10,000

  1. Risk: 1% × $10,000 = $100.00.
  2. Stop: 300 points = 300.00 in price.
  3. Value of 1 point per 1.00 lot: $0.0067.
  4. Lot size = $100.00 ÷ (300 × $0.0067) = 50.0000, rounded down to the 0.01 step: 50.00 lots.

At ¥1 per point per lot, a 300-point stop costs ¥300 ($2) per lot, so $100 buys 50 lots.

Same trade with a contract size of 100: $100.00 ÷ (300 × $0.67) = 0.50 lots.

Contract size and tick value in MT5

In MetaTrader 5, right-click JPN225 in Market Watch and choose Specification: it shows Contract size, Digits, Profit currency and the volume limits. Tick size and tick value are what MQL5 reads with SYMBOL_TRADE_TICK_SIZE and SYMBOL_TRADE_TICK_VALUE; the script below prints them for your account.

Contract size1 at Capital.com and Purple Trading, 100 at BlackBull Markets
Digits0 to 2 depending on the broker (price step 1, 0.1 or 0.01)
Tick size (SYMBOL_TRADE_TICK_SIZE)1, 0.1 or 0.01
Profit currencyJPY
Tick value, 1.00 lot (SYMBOL_TRADE_TICK_VALUE)contract size × tick size in JPY, converted to your account currency
Value of 1 Nikkei point per lotcontract size × ¥1

Published values, checked on 2026-11-12. Specifications change and can differ by account type: your own Specification window is the reference.

SourceSymbol thereContract sizePrice step
Capital.comJP22511 digit
Purple TradingJP22510.01
BlackBull MarketsJPN2251001

MQL5: lot size from a money risk

A script that sends no order: it reads the contract size, tick size, tick value and volume limits your broker sets for JPN225, then prints the lot size that risks 1% of the balance at the stop. The stop is a price distance (300.00), so the result is the same on 2-, 3- or 5-digit quotes. Save it as MQL5/Scripts/LotSize_JPN225.mq5 and compile it in MetaEditor (F7): 0 errors, 0 warnings.

MQL5
//+------------------------------------------------------------------+
//| LotSize_JPN225.mq5                                             |
//| Lot size that risks a % of the balance at a given stop distance|
//+------------------------------------------------------------------+
#property script_show_inputs

input string InpSymbol       = "JPN225"; // Symbol, exactly as in Market Watch
input double InpRiskPercent  = 1.0;      // Risk per trade, % of balance
input double InpStopDistance = 300.00;   // Stop-loss distance in price (300.00 = 300 points)

// Lots that lose about riskMoney at the stop, rounded down to the volume step.
// Returns 0 when even the minimum volume would risk more than riskMoney.
double LotsForRisk(const string symbol, const double riskMoney, const double stopDistance)
  {
   double tickSize  = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); // 1.00 lot, one tick, account currency
   double step      = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   double minLot    = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double maxLot    = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   if(tickSize <= 0.0 || tickValue <= 0.0 || step <= 0.0 || stopDistance <= 0.0)
      return 0.0;
   double lossPerLot = stopDistance / tickSize * tickValue;            // money lost by 1.00 lot at the stop
   double lots       = MathFloor(riskMoney / lossPerLot / step + 1e-9) * step;
   if(lots < minLot)
      return 0.0;
   int volumeDigits = (int)MathMax(0.0, MathCeil(-MathLog10(step) - 1e-9));
   return NormalizeDouble(MathMin(lots, maxLot), volumeDigits);
  }

void OnStart()
  {
   if(!SymbolSelect(InpSymbol, true))
     {
      PrintFormat("%s not found: use the exact name from Market Watch (some brokers add a suffix)", InpSymbol);
      return;
     }
   int    digits   = (int)SymbolInfoInteger(InpSymbol, SYMBOL_DIGITS);
   double point    = SymbolInfoDouble(InpSymbol, SYMBOL_POINT);
   double contract = SymbolInfoDouble(InpSymbol, SYMBOL_TRADE_CONTRACT_SIZE);
   double tickSize = SymbolInfoDouble(InpSymbol, SYMBOL_TRADE_TICK_SIZE);
   double tickVal  = SymbolInfoDouble(InpSymbol, SYMBOL_TRADE_TICK_VALUE);
   string currency = AccountInfoString(ACCOUNT_CURRENCY);
   double risk     = AccountInfoDouble(ACCOUNT_BALANCE) * InpRiskPercent / 100.0;
   double lots     = LotsForRisk(InpSymbol, risk, InpStopDistance);

   PrintFormat("%s: contract size %g, %d digits, tick size %s, tick value %g %s per lot",
               InpSymbol, contract, digits, DoubleToString(tickSize, digits), tickVal, currency);
   PrintFormat("Stop %s = %.0f points. Risk %.2f %s",
               DoubleToString(InpStopDistance, digits), InpStopDistance / point, risk, currency);
   if(lots > 0.0)
      PrintFormat("Lot size: %g", lots);
   else
      Print("Even the minimum volume risks more than that: widen the risk or tighten the stop");
  }

The key line is stopDistance / tickSize * tickValue: the money one lot loses at the stop, already converted to your account currency by the terminal. Dividing the risk by it and flooring to SYMBOL_VOLUME_STEP gives the volume to pass to CTrade::Buy() or CTrade::Sell().

Pine Script v6 equivalent

The same sizing on a TradingView chart, from syminfo.pointvalue (money per 1.0 of price per unit) and syminfo.mintick (the chart's tick). Checked by Edgoro Pine Check; paste it into TradingView's Pine Editor to add it to a chart.

Pine Script v6
//@version=6
indicator("JPN225 lot size for a money risk", overlay = true)

riskMoney    = input.float(100.0, "Risk per trade (account currency)", minval = 0.01)
accountCcy   = input.string("USD", "Account currency")
stopDistance = input.float(300.00, "Stop-loss distance (price)", minval = 0.0)
contractSize = input.float(1.0, "Units per 1.00 lot at your broker", minval = 0.0)

// One unit of the symbol gains or loses syminfo.pointvalue (in syminfo.currency) per 1.0 of price
fx          = request.currency_rate(syminfo.currency, accountCcy)
lossPerUnit = stopDistance * syminfo.pointvalue * fx
units       = lossPerUnit > 0 ? riskMoney / lossPerUnit : na
lots        = contractSize > 0 ? math.floor(units / contractSize * 100) / 100 : na

var table info = table.new(position.top_right, 2, 3, bgcolor = color.new(color.gray, 80))
if barstate.islast
    table.cell(info, 0, 0, "Stop")
    table.cell(info, 1, 0, str.tostring(stopDistance / syminfo.mintick, "#") + " ticks of " + str.tostring(syminfo.mintick))
    table.cell(info, 0, 1, "Units")
    table.cell(info, 1, 1, str.tostring(units, "#.####"))
    table.cell(info, 0, 2, "Lots (rounded down)")
    table.cell(info, 1, 2, str.tostring(lots, "#.##"))

On a CFD chart syminfo.pointvalue is usually 1, so units is the number of index units: set the contract size input to your broker's value. On a futures chart, syminfo.pointvalue already includes the contract multiplier, so units are contracts and the contract size input should be 1.

Common mistakes on JPN225

  • Copying a lot size between brokers. 50 lots at a contract size of 1 is a sensible $100 risk; 50 lots at 100 is a $10,000 risk on the same stop. Read Contract size every time you change broker or account.
  • Yen, not dollars. The value per point is in yen; convert at USD/JPY.
  • Volume limits. Positions of tens of lots can hit the maximum volume per order. Check Maximal volume in the Specification window; the script below caps the size at it.

Lot size sets how much a trade loses if the stop is hit at its price. It doesn't make a trade a good one, and gaps or slippage can make the loss larger. Trading involves substantial risk of loss and is not suitable for every investor. Edgoro is a software tool, not a broker or financial adviser: nothing it produces is investment advice, and past or backtested performance does not guarantee future results.

All 34 symbols

Tools and code for the same job

Want the sizing inside an Expert Advisor?

Describe your JPN225 strategy in plain English and Edgoro's MT5 EA generator writes the MQL5 Expert Advisor, with risk-based lot sizing like the script above, and compiles it in MetaEditor before you get it. Test it on a demo account: a clean build isn't proof that a strategy works.