Pricing Engine
Introduction
Celeris has a robust pricing engine to ensure that markets have accurate and fair pricing for all market participants.
Oracles
Celeris is built with an extremely fast, flexible and secure oracle protocol. The oracles can submit price feeds and other real-world information with extremely high reliability and low latency. This is used to derive various fair prices of Celeris' derivative markets.
Index Price
When oracle votes representing 67% of bonded tokens have been submitted for a specific timestamp, the median value of valid votes will be utilized to generate the Index Price for a market.
This typically happens within 1 second of any changes in the spot price.
Mark Price
The Mark Price is the price at which the futures contract is valued when being traded. This can temporarily vary from the actual futures market price in order to protect market participants against manipulative trading. This can also vary from the underlying spot price due to time premiums (contango or backwardation) being applied on the derivative contract.
Fair Price Marking
The mark price of a market is determined by finding a fair price based on the current market's order book and ensuring that it does not deviate too quickly or too much from the index price.
More specifically, the following formula is used to determine each market's mark price:
MPRaw = IndexPrice + EMA30s(FairPrice - IndexPrice)
MarkPrice = clamp(IndexPrice * (100 - MPBand / 2)%, MPRaw, IndexPrice * (100 + MPBand / 2)%)
// MPBand is a market parameter (see GET markets: mark_price_band) denoted in integer basis points,
// EMA30s means 30-second exponential moving average,
// clamp(min, x, max) means min if x < min, or max if x > max, else x.
Fair price can be determined by the following formula:
1. If either the buy or sell order book has no orders:
FairPrice = IndexPrice
2. Otherwise:
ImpactBid = max[averagePrice(sell orders up to ImpactSize lots), BestBidPrice - ImpactBand]
ImpactAsk = min[averagePrice(buy orders up to ImpactSize lots), BestAskPrice + ImpactBand]
FairPrice = (ImpactBid + ImpactAsk) / 2
// ImpactSize is a market parameter (see GET markets: impact_size) denominated in base tokens (same as lot size)
// ImpactBand is a global market parameter (see GET market params: impact_band) denominated in integer basis points.
Last Price Protected
In the case that the oracle network is down or the index price cannot be updated for any other reason, the mark price formulation falls back to use the last traded price of the market.
Users can detect this change by monitoring the marking_strategy
from the GET Prices endpoint. In normal fair price marking, the value will be fair
. When falling back to the last price marking, the value will be last
.
MPRaw = clamp(LastPrice * (100 - LPPBand / 2)%, LastPrice, LastPrice * (100 + LPPBand / 2)%)
MarkPrice = clamp(EMA30(MarkPrice) * (100 - SmoothenBand / 2)%, MPRaw, EMA30(MarkPrice) * (100 - SmoothenBand + 2)%)
// LPPBand is a market parameter (see GET markets: last_price_protected_band) denoted on an integer basis points
// SmoothenBand is a global market parameter (see GET market params: smoothen_band) denoted on an integer basis points
Settlement
Futures on Celeris are cash-settled rather than settled by physical delivery. This means that at the settlement, the buyer of a futures contract will not buy the actual underlying, nor will the seller sell the underlying. There will only be a transfer of losses/gains at the settlement of the contract based on the settlement price. Note that by nature, perpetual markets never settle.
Settlement Price
The last 30 minutes time-weighted average of the Index Price
before each futures contract expiry time is used as the price for market settlement. At contract expiration, all open positions will be closed, and the PnL (based on the difference between the position's average opening price and this settlement price) will be automatically realized.
Last updated