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.
| Position | 1 tick | 60 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
- Risk: 1% × $10,000 = $100.00.
- Stop: 60 ticks = 0.060 in price.
- Value of 1 tick per 1.00 lot: $10.00.
- 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 size | 10,000 MMBtu at the brokers below (the NYMEX futures contract is also 10,000 MMBtu) |
|---|---|
| Digits | 3 or 4 depending on the broker |
| Tick size (SYMBOL_TRADE_TICK_SIZE) | 0.001 or 0.0001 |
| Profit currency | USD |
| 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 lot | contract 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.
| Source | Symbol there | Contract size | Price step |
|---|---|---|---|
| Capital.com | Natural Gas | 10000 | 4 digits |
| Purple Trading | NGAS | 10000 | 0.001 |
| CME Group | NG futures | 10,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.
//+------------------------------------------------------------------+
//| 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.
//@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.