There are two relevant sections on the help page, the direct links (e.g. if you have it in an IB) look like this:
- {LPHP FRD:0:1 2898067 }:
ON ("Overnight"), TN ("Tomorrow-Next"), and SN ("Spot-Next") are not tenors; they are swaps. Each are associated with two separate settlement dates, one for each leg:
• ON is the swap between TOD and TOM.
• TN is the swap between TOM and the following business day (which is spot in a T+2 currency).
- {LPHP FRD:0:1 612124 }:
Certain rules apply when calculating two-day settlements for Overnight (ON) and Tomorrow Night (TN) outrights.
Two-Day Settlement Outright Calculations
• ON bid outright: spot bid - TN ask points - ON ask points
• ON ask outright: spot ask - TN bid points - ON bid points
• TN bid outright: spot bid - TN ask points
• TN ask outright: spot ask - TN bid points
The special rule for US holidays mentioned on the help page refers to days where there is a US holiday only (e.g. independence day or last Friday). On these days, there is no TN quote (see for example 07/03/19) and FRD displays no values (blank).
Longer tenors are classic forward outrights. They are an obligation to buy/sell at the agreed rate (the forward rate) at the date of expiry. That is why you simply add the forward bid to spot bid in these cases, whereas in the ON and TN case, you cross bid and ask because you have two opposite transactions.
Within Bloomberg, you can use OVML to see the difference between a foward (OVML FWD) and a swap (OVML SW). The standard forward has one leg (left hand side is FRD, right hand side OVML FWD). The asterisk (*) next to the side (ask for the 3m forward example) refers to the side of the market that the user is on (by default the client, not the bank / market maker). The generic rule is BBBB (bank buys base at bid), which means the bank is buying the base currency (CCY1 in a CCY1CCY2 quote, so EUR in EURUSD) at the bid. Insofar, if a client buys, the banks sells at ask.
We can also quickly manually compute the values using the formulas above (I am using Julia).
import DataFrames, PrettyTables, Statistics # import relevant packages
# define market data from screenshot (only forward points and Spot)
SP_bid = 1.0441
SP_ask = 1.0447
ON_bid = 0.304
ON_ask = 0.556
TN_bid = 0.666
TN_ask = 0.722
# define fwd_scale
fwd_scale = 10^-4
# compute results according to formulas
ON_Ask_Outright = SP_ask - (TN_bid + ON_bid)*fwd_scale
TN_Bid_Outright = SP_bid - TN_ask*fwd_scale
TN_Ask_Outright = SP_ask - TN_bid*fwd_scale
ON_Bid_Outright = SP_bid - (TN_ask + ON_ask)*fwd_scale
# create DataFrame
tenors = ["ON","TN","SP"]
df = DataFrame(Tenors = tenors)
df[!,"Pts Bid"]=[ON_bid, TN_bid, SP_bid]
df[!,"Pts Ask"]=[ON_ask, TN_ask, SP_ask]
df[!,"Fwds Bid"] = [ON_Bid_Outright, TN_Bid_Outright, SP_bid]
df[!,"Fwds Ask"] = [ON_Ask_Outright, TN_Ask_Outright, SP_ask]
# display results
PrettyTables.pretty_table(df, border_crayon = Crayons.crayon"blue", header_crayon = Crayons.crayon"bold green", formatters = ft_printf("%.7f", [2,3,4,5]))
The swap on the other hand has two legs (near and far) in opposite directions.
ATMF for ON and TN is identical due to OVML rounding values to 4 decimals and displaying MID as can be seen below.
ON_Mid_Outright_OVML = round(Statistics.mean([ON_Bid_Outright, ON_Ask_Outright]), digits = 4) # OVML displays ATMF rounded
TN_Mid_Outright_OVML = round(Statistics.mean([TN_Bid_Outright, TN_Ask_Outright]), digits = 4)
SP_Mid_Outright = round(Statistics.mean([SP_bid, SP_ask]), digits = 4)
df[!,"Mid rounded"] = [ON_Mid_Outright_OVML, TN_Mid_Outright_OVML , SP_Mid_Outright]
PrettyTables.pretty_table(df, border_crayon = Crayons.crayon"blue", header_crayon = Crayons.crayon"bold green", formatters = ft_printf("%.7f", [2,3,4,5]),highlighters = (hl_value(1.0443)))