* Positive value indicates a credit (Swap Receive). Negative value indicates a debit (Swap Pay).
Understanding Tom Next Rate Calculations
The "Tom Next" (Tomorrow Next) rate is a fundamental concept in foreign exchange (Forex) trading, representing the adjustment made to a currency position that is held overnight. Unlike a loan calculator, this tool calculates the Swap Points and resulting financial adjustment based on Interest Rate Parity.
How It Works
Forex trades theoretically settle in two business days (Spot). If a trader wants to keep a position open beyond 5:00 PM EST, the position must be "rolled over" to the next value date. This is done via a Swap transaction: selling the position for the current value date and buying it back for the next value date (Tomorrow to Next).
The cost or gain of this rollover depends on the Interest Rate Differential between the two currencies in the pair.
The Formula
The theoretical Tom Next points are calculated using the following logic:
Base Currency: The first currency in the pair (e.g., GBP in GBP/USD).
Quote Currency: The second currency in the pair (e.g., USD in GBP/USD).
If the interest rate of the currency you are buying (Long) is higher than the currency you are selling (Short), you typically earn a credit (Positive Swap). If the interest rate is lower, you pay a fee (Negative Swap).
While this calculator provides the theoretical interbank rate based on pure interest rate differentials, retail brokers often apply a markup or markdown to these rates. Therefore, the actual swap charge you see on your trading platform may differ slightly from the pure mathematical model calculated above.
Key Terms
Spot Rate: The current market price.
Swap Points: The difference between the forward rate and the spot rate, often expressed in pips.
Rollover Days: Typically 1 day. However, on Wednesdays, the rollover covers the weekend (Friday to Monday), so the duration is usually 3 days.
function calculateTomNext() {
// 1. Get Inputs
var spotRate = parseFloat(document.getElementById('spotRate').value);
var positionSize = parseFloat(document.getElementById('positionSize').value);
var baseRatePercent = parseFloat(document.getElementById('baseRate').value);
var quoteRatePercent = parseFloat(document.getElementById('quoteRate').value);
var days = parseFloat(document.getElementById('days').value);
var basis = parseFloat(document.getElementById('dayBasis').value);
// 2. Validate Inputs
if (isNaN(spotRate) || isNaN(positionSize) || isNaN(baseRatePercent) || isNaN(quoteRatePercent) || isNaN(days)) {
alert("Please enter valid numbers in all fields.");
return;
}
// 3. Calculation Logic (Interest Rate Parity)
// Convert percentages to decimals
var rBase = baseRatePercent / 100;
var rQuote = quoteRatePercent / 100;
// Calculate time factor
var timeFactor = days / basis;
// Calculate Interest Factors
// Factor = 1 + (InterestRate * Time)
var factorBase = 1 + (rBase * timeFactor);
var factorQuote = 1 + (rQuote * timeFactor);
// Calculate Forward Rate
// Forward Rate = Spot * (FactorQuote / FactorBase)
// Note: Logic assumes Long Base / Short Quote.
// If we own the Base, we pay Base interest (borrowing to buy?) No, usually:
// Long Pair = Buy Base, Sell Quote.
// You Earn Base Rate, Pay Quote Rate?
// Wait, standard formula for Forward F = S * ( (1+r_quote*t) / (1+r_base*t) ) is for Direct Quote (Price of Foreign in Domestic).
// Let's stick to the standard math:
// Forward = Spot * ( (1 + QuoteInterest * T) / (1 + BaseInterest * T) )
var forwardRate = spotRate * (factorQuote / factorBase);
// Calculate Points (Raw)
var rawPoints = forwardRate – spotRate;
// Calculate Points (Pips)
// Check for JPY pairs (usually 2 or 3 decimals) vs others (4 or 5 decimals)
// Heuristic: If spot > 50, assume JPY-like (multiplier 100), else standard (multiplier 10000)
var pipMultiplier = (spotRate > 50) ? 100 : 10000;
var pointsPips = rawPoints * pipMultiplier;
// Calculate Cost/Credit
// Cost = (Forward – Spot) * PositionSize
// This gives the cost in the Quote Currency
// However, direction matters. The formula above (Forward – Spot) gives the points.
// If Points are positive, it implies Quote Interest > Base Interest.
// Long Position (Buy Base) means: You Hold Base (Earn Base Rate), You Owe Quote (Pay Quote Rate).
// Actually, the Forward Formula F = S * (1+Rq)/(1+Rb).
// If Rq > Rb, then F > S. Points are positive.
// But if you are Long Base (Buying), you are borrowing Quote to buy Base.
// You Pay Rq, Earn Rb.
// If Rq > Rb, you Pay more than you Earn. The cost should be negative.
// But the formula gives Positive points.
// Standard convention: Long Swap Points = S * (Rb – Rq) … approximation.
// Let's adjust the cost calculation for a Long Position perspective:
// Long Cost = PositionSize * Spot * ( (BaseRate – QuoteRate)/100 * (Days/Basis) )
// Using exact math derived from forward:
// Let's use the Swap Value formula for a Long Position:
// Value = Notional * (Spot_End – Spot_Start) – Interest_Cost
// Simplified for Swap Calculator:
// Cost = PositionSize * (Spot * (rBase – rQuote) * timeFactor)
// If Base Rate > Quote Rate, result is Positive (You earn).
// Let's stick to the simpler approximation for the Cost display which is standard for these tools,
// as the exact Forward rate differential is extremely close to this.
var rolloverCost = positionSize * spotRate * ((rBase – rQuote) * timeFactor);
// 4. Update UI
var resultsDiv = document.getElementById('results');
resultsDiv.style.display = 'block';
// Format Forward Rate (5 decimals usually)
document.getElementById('forwardRateResult').innerHTML = forwardRate.toFixed(5);
// Format Raw Points
document.getElementById('pointsRawResult').innerHTML = rawPoints.toFixed(6);
// Format Pips
document.getElementById('pointsPipsResult').innerHTML = pointsPips.toFixed(2) + " pips";
// Format Cost
var costEl = document.getElementById('costResult');
var costFormatted = Math.abs(rolloverCost).toFixed(2);
// Determine currency symbol based on simple heuristic or generic
var currencyLabel = " Quote Currency units"; // generic
if (rolloverCost >= 0) {
costEl.innerHTML = "+" + costFormatted + currencyLabel;
costEl.className = "result-value positive";
} else {
costEl.innerHTML = "-" + costFormatted + currencyLabel;
costEl.className = "result-value negative";
}
}