Market Maker Protection

Mass quoting, an important part of any well-functioning market, requires market makers to post liquidity in a vast range of instruments. Market maker protection (MMP) is a feature that helps MM control their risk of getting hit simultaneously in multiple contracts.

MMP is supported for portfolio margin only and is available to RMMs by default. For other users, MMP can be enabled upon request. Please reach out to the support team if you would like to have access to this feature.


  1. MMP is enabled at an asset level. MMP configs have to be set separately for each asset. Since portfolio margin is supported only for those assets for which options are listed, MMP can be enabled only on these assets.

  2. Every account support 5 different MMP tags, namely mmp1, mmp2, mmp3, mmp4, mmp5.

  3. MMP orders need to be tagged specifically in "mmp" field of order request. When MMP gets triggered, only orders tagged as 'mmp' are cancelled. All your other orders remain un-impacted.

  4. Every mmp tag has it's own configuration and is completely independent of other mmp tag configs. Also, there is no synchronization in the measurement windows of different MMP tags. An RMM can come up with their own logic to leverage multiple MMP tags.

  5. MMP configuration for any tag can be changed using the Update MMP Config Api.

Sample MMP Order payload
  product_id: 139,
  order_type: "limit_order",
  limit_price: "16000",
  size: 100,
  side: "buy",
  mmp: "mmp1"      # this order belongs to mmp1, skip mmp field for a non-mmp order

MMP Config Parameters

  1. window_interval : This defines the window in seconds in which MMP limits are checked. The window starts after the first trade. When the interval has ended, the counters are reset.

  2. freeze_interval : This defines the time interval in seconds for which MMP orders are frozen once MMP gets triggered. MMP is reset once freeze interval has ended (counted from the time MMP gets triggered). You can set this to 0 if you want to do a Manual reset instead of automatic reset.

  3. trade_limit: Trade limit in terms of the quoting asset (like 200k USDT) for which mmp is triggered. Trade limit is direction agnostic. Buy and sell orders are added and don't offset each other.

  4. delta_limit: Delta notional limit in terms of the quoting asset (like 200k USDT). This takes into account the sign of delta for a contract. So, if you trade 10 BTC worth of a call option with 0.1 delta and 10 BTC worth of put option with -0.05 delta, then net delta notional when spot was 10000 is 10 * 0.1 * 10000 + 10 * (-0.05) * 10000 = 50000 USDT. Delta for futures contracts is 1.

  5. vega_limit: Vega limit in terms of the quoting asset. For example - if you trade 10 BTC worth of call option with vega 2500 USDT and 10 BTC worth of put options with vega 1500 USDT, then net vega traded is 2500 + 1500 = 4000 USDT.

Socket MMP update

When MMP is triggered, we publish a message on socket indicating when MMP was triggered and the timestamp when MMP will be reset.

# payload received on mmp_trigger socket channel
    user_id: 1,
    asset: "BTC",
    frozen_till: 1561634049751430     # timestamp is microseconds, will be -1 if manual reset is enabled
    labels: [ "mmp1", "mmp2" ]        # in this case, two mmp configs were triggered due to single trade

Behavior of batch apis with MMP orders

  • You can send MMP and Non-MMP orders together in both batch create and batch edit apis

  • Batch create and Batch edit api will reject the whole batch even if one mmp order is rejected due to MMP triggered.

Last updated