Price Controls
Overview
A PriceControl record governs how Price Engine prices a single instrument. It specifies the pricing model, spread adjustments, workout methodology, and the source of market prices.
One PriceControl exists per instrument. Records are persisted in the database and republished on startup. The complementary ResolvedPriceControl is the fully-assembled, ready-to-compute view of a PriceControl that Price Engine derives in real time.
Users interact with these settings through the Prices view.
Field Reference
| Field | Description | Example |
|---|---|---|
| instrumentId | Platform instrument identifier. Read-only. | BUSD00001 |
| model | Pricing model. One of: MANUAL, SOURCE, BENCHMARK, PASSTHROUGH, DISCOUNT_MARGIN.See Pricing Models | SOURCE |
| side | Driver side. Controls which side is treated as primary and how adjustments map to bid/mid/ask. One of: BID, MID, ASK, SIDE, SIDE_SIDE.See Pricing Models | MID |
| adjustment1 | Primary adjustment (driver). Interpretation depends on model and side. See Pricing Models | 50 (bps) |
| adjustment2 | Secondary adjustment — bid-ask spread width when side is MID/BID/ASK, or independent ask driver when side is SIDE_SIDE.See Pricing Models | 10 (bps) |
| spreadType | How adjustments are expressed. One of: YIELD (basis points), PRICE. For the SOURCE model, also controls whether source yield or source price drives the output. | YIELD |
| workoutType | Methodology for determining the redemption date. One of: MATURITY, NEXT_CALL, WORST, MANUAL. Fixed-maturity bonds always use maturity date regardless of this setting. | WORST |
| workoutDate | Manual workout date override in YYYYMMDD format. Only used when workoutType = MANUAL. | 20260525 |
| priceSource | Named price source for incoming market prices. Required for SOURCE and PASSTHROUGH models, and for callable bonds that need a price to determine the workout date. See Configuration. | TWEB |
| benchmarkPriceSource | Named price source for benchmark instrument prices. If blank, PE uses its own internally-published price for the benchmark instrument. The benchmark is defined in the instrument's static data. | TWEB |
| note | Free-text notes field. Not used in pricing calculations. | — |
Pricing Models
Price Engine supports five pricing models. The model field, together with side, spreadType, and the adjustment values, determines how bid/mid/ask prices and yields are computed.
MANUAL
Prices are computed entirely from the supplied adjustment values — no external reference price is required.
adjustment1(Driver) is the primary spread value in units defined byspreadTypeadjustment2(BidAsk Spread) defines the bid–ask width- Not supported for floating rate bonds with
spreadType = YIELD— useDISCOUNT_MARGINinstead
SOURCE
Prices are driven by an external market price from the configured priceSource.
adjustment1(Driver) is an incremental spread or price offset applied on top of the source valuespreadTypecontrols whether the source yield (YIELD) or source price (PRICE) serves as the basis- Requires a valid
priceSourcesubscription
BENCHMARK
Prices are derived from the yield of a benchmark instrument plus a spread.
- The benchmark is defined in
instrument.benchmarkInstrumentId(configured in Static Data Server) adjustment1(Driver) is the spread to benchmark yield in basis pointsadjustment2(BidAsk Spread) defines the bid–ask width- Requires
spreadType = YIELDorSPREAD - Not supported for floating rate bonds — use
DISCOUNT_MARGINinstead
PASSTHROUGH
The source price is copied verbatim without modification. All price, yield, discount, PV01, size, and reference spread fields are forwarded as received from priceSource. No Analytics Engine request is made, and no adjustments are applied.
- Requires a valid
priceSource - Spread calculations and yield conversion are bypassed
DISCOUNT_MARGIN
For floating rate bonds only. Prices are derived from discount margin (DM) spreads in basis points and converted to clean price via Analytics Engine.
adjustment1(Driver) is the primary DM value in basis pointsadjustment2(BidAsk Spread) defines the bid–ask DM width- Requires
spreadType = YIELDorSPREAD - Only supported for floating rate bonds (
couponType = FLOAT)
Logical Model
The following diagram shows the user-facing spread values for each model and side combination. Blue cells are user-supplied inputs; the engine derives the rest.

The formula-level representation of how bid/mid/ask are computed from the user marks:

For any given model and side combination, two out of four adjustment slots are editable. These map to adjustment1 and adjustment2 in the data model:

The Prices view presents three columns (Driver, Driver2, BidAsk Spread), with visibility rules applied per Driver Side selection:
Driver Side Reference
| Driver Side | Editable Inputs | Derived Outputs |
|---|---|---|
MID | Driver (midSpread), BidAsk Spread | bid = mid − width/2, ask = mid + width/2 |
BID | Driver (bidSpread), BidAsk Spread | mid = bid + width/2, ask = bid + width |
ASK | Driver (askSpread), BidAsk Spread | bid = ask − width, mid = ask − width/2 |
SIDE | Driver (bidSpread only) | ask side set same as bid; no independent ask spread |
SIDE_SIDE | Driver (bidSpread), Driver2 (askSpread) | bid and ask independently specified |
Recalculation Triggers
Regardless of model or bond type, recalculation is triggered when any of the following change:
- PriceControl settings
- Instrument data (from Static Data Server)
- Business date
Additional triggers by event type:
| Event | Condition |
|---|---|
| Source price update | Model is SOURCE, PASSTHROUGH, or workout type requires a source price |
| Benchmark price update | Model is BENCHMARK; also refreshes benchmark spread output in all models except PASSTHROUGH |
| FRN curve update | Coupon type is FLOAT and model is not PASSTHROUGH |
Hard reset — clears all pending Analytics Engine requests and resets the workout date for callable bonds:
- Workout type changes
- Manual workout date changes when
workoutType = MANUAL - Business date changes
- Coupon type changes
- Bond redemption schedule changes
- Model changes from
PASSTHROUGHto another model
Soft reset — clears prices but preserves pending Analytics Engine requests:
- Pricing side changes
- Model changes (except changes away from
PASSTHROUGH)
Resolved Price Controls
A ResolvedPriceControl is the fully-assembled, ready-to-compute view of a PriceControl. It is built by Price Engine whenever any of its inputs change.
How It Is Assembled
The Resolved PriceControl combines data from four sources:
| Source | Contribution |
|---|---|
PriceControl | Model, side, adjustments, workout settings, price source names |
Instrument (from SDS) | Currency, benchmark instrument ID (resolved via ID reverse mapping), FRN reference index |
PriceProfile | Yield conventions (bondYieldConvention, billYieldConvention), G-curve, Z-curve names |
| Topic resolution | priceTopic and benchmarkPriceTopic resolved from source name + instrument |
The computed spread values (bidSpread, midSpread, askSpread) are derived from adjustment1, adjustment2, side, and model using the same logical model shown above.
For floating rate bonds, the frnIndex and frnCurveTopic fields are populated from the instrument's reference index and the forecast curve configured for that index in Static Data Server.
Validation
Before Price Engine uses a ResolvedPriceControl for pricing, it is validated. If validation fails, the price is published with ok=false and the relevant message is visible in price.message.
All possible validation errors are listed here