Edgoro
Oil and natural gas · Free calculator

Natural gas (NG) lot size and tick value calculator

On natural gas a tick is $0.001 per MMBtu and a lot (like the NYMEX futures contract) is 10,000 MMBtu at the brokers we checked, so one tick is $10 per lot and a $0.10 move is 100 ticks. Risking 1% of $10,000 with a 60-tick stop gives 0.16 lots.

Risk per trade
Position size (rounded down to 0.01 lot)
0.16 lots
Risk amount$100.00
Exact size0.1667 lots
Mini lots (0.10)1.67
Micro lots (0.01)16.7
Units1,666.6667 MMBtu
Value of 1 tick per lot$10.00

USD account. 1 tick = a 0.001 move. Contract size 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. 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 tick is on NATGAS

Henry Hub natural gas is priced in dollars per million British thermal units (MMBtu). CME Group describes the NYMEX futures contract as 10,000 MMBtu with a minimum tick of $0.001, so a tick is worth 10,000 × $0.001 = $10. Capital.com and Purple Trading publish the same 10,000 contract size for their gas CFDs.

How many ticks is a move? Divide by 0.001: a $0.10 move is 100 ticks, a $1.00 move 1,000 ticks. The MT5 point depends on the quote: Purple Trading's tick is 0.001, Capital.com shows 4 digits, so its point is 0.0001 and a 60-tick stop is 600 points there.

NATGAS tick value per lot

Value of one tick (0.001 in price): 0.001 × 10,000 = $10 per 1.00 lot, with a contract size of 10,000.

Position1 tick60 ticks (0.060)
1.00 lot$10.00$600.00
0.10 lot$1.00$60.00
0.01 lot$0.10$6.00

Worked example: 1% of $10,000

  1. Risk: 1% × $10,000 = $100.00.
  2. Stop: 60 ticks = 0.060 in price.
  3. Value of 1 tick per 1.00 lot: $10.00.
  4. Lot size = $100.00 ÷ (60 × $10.00) = 0.1667, rounded down to the 0.01 step: 0.16 lots.

60 ticks is a $0.060 move. The exact size is 0.1667 lots, rounded down to 0.16.

Contract size and tick value in MT5

In MetaTrader 5, right-click NATGAS 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 size10,000 MMBtu at the brokers below (the NYMEX futures contract is also 10,000 MMBtu)
Digits3 or 4 depending on the broker
Tick size (SYMBOL_TRADE_TICK_SIZE)0.001 or 0.0001
Profit currencyUSD
Tick value, 1.00 lot (SYMBOL_TRADE_TICK_VALUE)$10 per 0.001 with 10,000 MMBtu ($1 per 0.0001)
Value of a $0.001 tick per lotcontract size × $0.001

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.comNatural Gas100004 digits
Purple TradingNGAS100000.001
CME GroupNG futures10,000 MMBtu$0.001 per MMBtu

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 NATGAS, then prints the lot size that risks 1% of the balance at the stop. The stop is a price distance (0.060), so the result is the same on 2-, 3- or 5-digit quotes. Save it as MQL5/Scripts/LotSize_NATGAS.mq5 and compile it in MetaEditor (F7): 0 errors, 0 warnings.

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

input string InpSymbol       = "NATGAS"; // Symbol, exactly as in Market Watch
input double InpRiskPercent  = 1.0;      // Risk per trade, % of balance
input double InpStopDistance = 0.060;    // Stop-loss distance in price (0.060 = 60 ticks)

// 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("NATGAS 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(0.060, "Stop-loss distance (price)", minval = 0.0)
contractSize = input.float(10000.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 natural gas CFD chart syminfo.pointvalue is usually 1 (one MMBtu), so set the contract size to your broker's (10,000 at the brokers above). On a futures chart such as NYMEX:NG1!, syminfo.pointvalue already includes the contract multiplier: units are then contracts, so set the contract size input to 1.

Common mistakes on NATGAS

  • Ticks on a 4-digit quote. Where the quote has 4 digits, the MT5 point is 0.0001, a tenth of the futures tick: "60 points" there is only 6 ticks.
  • Futures and CFD sizes mixed up. One NYMEX contract and one 10,000-MMBtu CFD lot have the same tick value, but a CFD lot can be split to 0.01 and the futures can't. The futures tick value calculator covers the exchange contract.
  • Volatility. Gas can move several percent in a day; at $10 per tick per lot, a $0.20 move is $2,000 per lot. Size from the stop, never from the margin.

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 NATGAS 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.