Deribit has released the ability to create and trade combos in TESTNET. A combo, sometimes referred to as a strategy, are combinations of different instruments that can be executed with one trade/request/transaction.
For example, buying the perp and selling a Dec future, would require buying the perp and separately to that selling the Dec future. This can result in execution risk and crossing the spreads in 2 books whilst a Dec-Perp Future spread would have its own order book and since it carries less delta risk, should be a tighter spread than trading the legs separately.
A combo book is listed as a separate instrument on Deribit. For example, if you want to buy the BTC-31MAR23-100000-C whilst simultaneously selling the BTC-31MAR23-200000-C would require trading the Call Spread. If the combo instrument does not exist, then it can be created (more details on how to create a combo is later in this article). If the combo already exists, then it would be labelled as BTC-CS-31MAR23-100000_200000. This can be considered as an instrument in itself
One would enter orders on this combo book in the same way the enter orders in other books. For example, using the API request private/buy specifying the combo instrument name. Most of the API endpoints and subscriptions for an instrument also work for a combo instrument like ticker or finding the bandwidth (with Max Buy and Min Sell prices)
Combos can be found in the side menu by clicking in the top left corner or by going to TESTNET here.
You will then see 2 tabs with the Combo List and Create Combo:
In the first future spread in the Combo List above +1 BTC-20MAY22 and -1 BTC-PERPETUAL means that buying 10 usd of the combo results in buying 10 usd of the BTC-20MAY22 and selling 10 usd of the BTC-PERPETUAL.
Selling 10 usd of the combo results in selling 10 usd of the BTC-20MAY22 and buying 10 usd of the BTC-PERPETUAL
Note: One would not see open orders for the combo legs but only for the combo. Whilst trades would be reported both for the combo and the individual legs. So trading the BTC-CS-31MAR23-100000_200000 call spread would result in 3 trades, one for the combo itself BTC-CS-31MAR23-100000_200000 and a trade for each of the legs.
Note: Implied markets from the legs are not put in the combo order book, nor vice versa. The implied prices of the options legs are shown as an indication on public/ticker and also in the Combo List
Combo Naming and Valid Combos
Note: Only certain combos are allowed to be created. Below is a list of those combos including the naming terminology
Expiry E2 > E1 > Perpetual
Strike X4 > X3 > X2 > X1
Combo type | Syntax for Combo name | Buying 1 means: | Combo name example | Example of buying 1 |
Future Spread | FS-E2_E1 | +1 E2
-1 E1 |
FS-30SEP22_31DEC21 | +1 30SEP22
-1 31DEC21 |
Call Spread | CS-E1-X1_X2 | +1 E1-X1-C
-1 E1-X2-C |
CS-29OCT21-3000_4000 | +1 29OCT21-3000-C
-1 29OCT21-4000-C |
Call Ratio Spread 1×2 | CSR12-E1-X1_X2 | +1 E1-X1-C
-2 E1-X2-C |
CSR12-29OCT21-3000_4000 | +1 29OCT21-3000-C
-2 29OCT21-4000-C |
Call Ratio Spread 1×3 | CSR13-E1-X1_X2 | +1 E1-X1-C
-3 E1-X2-C |
CSR13-29OCT21-3000_4000 | +1 29OCT21-3000-C
-3 29OCT21-4000-C |
Call Ratio Spread 2×3 | CSR23-E1-X1_X2 | +2 E1-X1-C
-3 E1-X2-C |
CSR13-29OCT21-3000_4000 | +2 29OCT21-3000-C
-3 29OCT21-4000-C |
Put Spread | PS-E1-X2_X1 | +1 E1-X2-P
-1 E1-X1-P |
PS-29OCT21-4000_3000 | +1 29OCT21-4000-P
-1 29OCT21-3000-P |
Put Ratio Spread 1×2 | PSR12-E1-X2_X1 | +1 E1-X2-P
-2 E1-X1-P |
PSR12-29OCT21-4000_3000 | +1 29OCT21-4000-P
-2 29OCT21-3000-P |
Put Ratio Spread 1×3 | PSR13-E1-X2_X1 | +1 E1-X2-P
-3 E1-X1-P |
PSR13-29OCT21-4000_3000 | +1 29OCT21-4000-P
-3 29OCT21-3000-P |
Put Ratio Spread 2×3 | PSR23-E1-X2_X1 | +2 E1-X2-P
-3 E1-X1-P |
PSR23-29OCT21-3000_4000 | +2 29OCT21-4000-P
-3 29OCT21-3000-P |
Straddle | STRD-E1-X1 | +1 E1-X1-C
+1 E1-X1-P |
STRD-29OCT21-3000 | +1 29OCT21-3000-C
+1 29OCT21-3000-P |
Strangle | STRG-E1-X1_X2 | +1 E1-X1-P
+1 E1-X2-C |
STG-29OCT21-3000_4000 | +1 29OCT21-3000-P
+1 29OCT21-4000-C |
Strangle (ITM) | GUTS-E1-X1_X2 | +1 E1-X1-C
+1 E1-X2-P |
GUTS-29OCT21-3000_4000 | +1 29OCT21-3000-C
+1 29OCT21-4000-P |
Risk Reversal | RR-E1-X1_X2 | +1 E1-X1-P
-1 E1-X2-C |
RR-29OCT21-3000_4000 | +1 29OCT21-3000-P
-1 29OCT21-4000-C |
Risk Reversal (ITM) | RRITM-E1-X1_X2 | +1 E1-X1-C
-1 E1-X2-P |
RRITM-29OCT21-3000_4000 | +1 29OCT21-3000-C
-1 29OCT21-4000-P |
Call Calendar Spread | CCAL-E2_E1-X1 | +1 E2-X1-C
-1 E1-X1-C |
CCAL-31DEC21_29OCT21-3000 | +1 31DEC21-3000-C
-1 29OCT21-3000-C |
Put Calendar Spread | PCAL-E2_E1-X1 | +1 E2-X1-P
-1 E1-X1-P |
PCAL-31DEC21_29OCT21-3000 | +1 31DEC21-3000-P
-1 29OCT21-3000-P |
Call Diagonal Calendar Spread | CDIAG-E2_E1-X(E2)_X(E1) | +1 E2-C-X(E2)
-1 E1-C-X(E1) |
CDIAG-31DEC21_29OCT21-2000_3000 | +1 31DEC21-2000-C
-1 29OCT21-3000-C |
Put Diagonal Calendar Spread | PDIAG-E2_E1-X(E2)_X(E1) | +1 E2-P-X(E2)
-1 E1-P-X(E1) |
PDIAG-31DEC21_29OCT21-4000_3000 | +1 31DEC21-4000-P
-1 29OCT21-3000-P |
Straddle Calendar | STDC-E2_E1-3000 | +1 E2-X1-C
+1 E2-X1-P -1 E1-X1-C -1 E1-X1-P |
STDC-31DEC21_29OCT21-3000 | +1 31DEC21-3000-C
+1 31DEC21-3000-P -1 29OCT21-3000-C -1 29OCT21-3000-P |
Straddle Calendar (Diagonal) | DSTDC-E2_E1-X(E2)_X(E1) | +1 E2-X(E2)-C
+1 E2-X(E2)-P -1 E1-X(E1)-C -1 E1-X(E1)-P |
DSTDC-31DEC21_29OCT21-3000_4000 | +1 31DEC21-3000-C
+1 31DEC21-3000-P -1 29OCT21-4000-C -1 29OCT21-4000-P |
Reversal / Conversion | REV-E1-X1 | +1 E1-X1-C
-1 E1-X1-P |
REV-29OCT21-3000 | +1 29OCT21-3000-C
-1 29OCT21-3000-P |
Call Butterfly | CBUT-E1-X1_X2_X3 | +1 E1-X1-C
-2 E1-X2-C +1 E1-X3-C |
CBUT-29OCT21-3000_4000_5000 | +1 29OCT21-3000-C
-2 29OCT21-4000-C +1 29OCT21-5000-C |
Put Butterfly | PBUT-E1-X1_X2_X3 | +1 E1-X1-P
-2 E1-X2-P +1 E1-X3-P |
PBUT-29OCT21-3000_4000_5000 | +1 29OCT21-3000-P
-2 29OCT21-4000-P +1 29OCT21-5000-P |
Iron Butterfly | IBUT-E1-X1_X2_X3 | -1 E1-X1-P
+1 E1-X2-C +1 E1-X2-P -1 E1-X3-C |
IBUT-29OCT21-3000_4000_5000 | -1 29OCT21-3000-P
+1 29OCT21-4000-C +1 29OCT21-4000-P -1 29OCT21-5000-C |
Skinny Call Butterfly | CBUT111-E1-X1_X2_X3 | +1 E1-X1-C
-1 E1-X2-C +1 E1-X3-C |
CBUT111-29OCT21-3000_4000_5000 | +1 29OCT21-3000-C
-1 29OCT21-4000-C +1 29OCT21-5000-C |
Skinny Put Butterfly | PBUT111-E1-X1_X2_X3 | +1 E1-X1-P
-1 E1-X2-P +1 E1-X3-P |
PBUT111-29OCT21-3000_4000_5000 | +1 29OCT21-3000-P
-1 29OCT21-4000-P +1 29OCT21-5000-P |
Call Ladder | CLAD-E1-X1_X2_X3 | +1 E1-X1-C
-1 E1-X2-C -1 E1-X3-C |
CLAD-29OCT21-3000_4000_5000 | +1 29OCT21-3000-C
-1 29OCT21-4000-C -1 29OCT21-5000-C |
Put Ladder | PLAD-E1-X3_X2_X1 | +1 E1-X3-P
-1 E1-X2-P -1 E1-X1-P |
PLAD-29OCT21-5000_4000_3000 | +1 29OCT21-5000-P
-1 29OCT21-4000-P -1 29OCT21-3000-P |
Call Condor | CCOND-E1-X1_X2_X3_X4 | +1 E1-X1-C
-1 E1-X2-C -1 E1-X3-C +1 E1-X4-C |
CCOND-29OCT21-3000_4000_5000_6000 | +1 29OCT21-3000-C
-1 29OCT21-4000-C -1 29OCT21-5000-C +1 29OCT21-6000-C |
Put Condor | PCOND-E1-X1_X2_X3_X4 | +1 E1-X1-P
-1 E1-X2-P -1 E1-X3-P +1 E1-X4-P |
PCOND-29OCT21-3000_4000_5000_6000 | +1 29OCT21-3000-P
-1 29OCT21-4000-P -1 29OCT21-5000-P +1 29OCT21-6000-P |
Iron Condor | ICOND-E1-X1_X2_X3_X4 | -1 E1-X1-P
+1 E1-X2-P +1 E1-X3-C -1 E1-X4-C |
ICOND-29OCT21-3000_4000_5000_6000 | +1 29OCT21-3000-P
-1 29OCT21-4000-P -1 29OCT21-5000-C +1 29OCT21-6000-C |
Box | BOX-E1-X1_X2 | +1 E1-X1-C
-1 E1-X1-P -1 E1-X2-C +1 E1-X2-P |
BOX-29OCT21-3000_4000 | +1 29OCT21-3000-C
-1 29OCT21-3000-P -1 29OCT21-4000-C +1 29OCT21-4000-P |
Jelly Roll | JR-E2_E1-X1 | +1 E2-X1-C
-1 E2-X1-P -1 E1-X1-C +1 E1-X1-P |
JR-31DEC21_29OCT21-3000 | +1 31DEC21-3000-C
-1 31DEC21-3000-P -1 29OCT21-3000-C +1 29OCT21-3000-P |
Create Combo
There is a limit to how many combos you can create and you require equity in the account from which the combo is being created. This limit would be to create 5 combos per account in a week – that limit might be adjusted later on.
Using the UI:
Go to the Create Combo tab and start with selecting which combo you would like to add followed by the expiries and, if it’s an option combo, the strikes.
Using the API:
private/create_combo: Read more here.
The request above would create a strangle with an amount of 1 on each leg even though the amount in the request is 5. If the direction of both legs were input as “sell”, this would still create a strangle. In both cases, it would result in:
In the API request above, if the direction of the call was set to “sell” while the put remained a “buy”, that would create a Risk Reversal. If the amount on the call was set to a different value than the put, then the combo would not be within the allowed combo types and would return the error “invalid strategy”.
Retrieving a list of combos
With the UI, one can just see the list of combos and their associated instrument name.
Through the API, this can be retrieved with public/get_instruments and specifying the kind as “future_combo” or “option_combo”. ie https://test.deribit.com/api/v2/public/get_instruments?currency=BTC&kind=option_combo
This can also be done through subscribing, ie using public/subscribe. The request on the right shows a subscription to any instrument (outright or combo) for BTC. This subscription could also be just for future combos for example by using instrument.state.future_combo.BTC
The new API endpoints specifically for combos. They are:
We have already gone through private/create_combo so here is a brief description of the others that are listed here.
public/get_combo_details: This is to just get the name of an existing combo instrument on the platform and to find out the leg details. Looking at the UI, one can easily see the leg details for this Call Condor
And this information can also be retrieved via the API:
public/get_combo_ids: This is to get the combo instrument names and can be filtered for just active, inactive or rfq:
public/get_combos: This would simply return all active and rfq combos on platform under that currency and includes the leg details of each combo:
RFQ
In the UI, one can send an rfq on a combo by simply clicking the RFQ button in the RFQ column in the Combo List. We will also add the same functionality to RFQ via the UI as for outrights (ie from right clicking on the combo to get the context menu with RFQ or by clicking the “Request Button” on the top right of the order form for that instrument)
Via the API, an RFQ on a combo works the same as an RFQ on an outright (with private/send_rfq and specifying the instrument name). There is a limit to the number of times a day this can be used and the account making the rfq requires Equity. The direction and amount that the user wants to trade can be specified in the rfq but is not compulsory. A user who specifies a direction and an amount is not forced to trade in that direction nor with that amount. It is indicative only.
The best way to get notified of RFQs via the API would be to subscribe to rfq.{currency} and this could be done for all currencies by using “any” or could be specified for a currency:
RFQs can also be retrieved with a REST request with public/get_rfqs
The rfq state is for 30 seconds, but all it does is broadcast the interest to trade to the market. There is no change in the trading dynamics of the instrument during an rfq.
Note: When a combo is created, it automatically goes into RFQ
Notes on using FIX protocol for Deribit Combo/RFQ
The FIX Combo and Request For Quotes (RFQ) functionality on Deribit is similar to the described above REST/WS API. The detailed tags/fields of the request is described int the FIX specification on the docs.deribit.com portal. Here we describe briefly the logic.
Let’s start with combos. Recently added FIX messages for combo instruments are Security Definition Request (c) and Security Definition (d). The field Security Request Type(321) of the Security Definition Request (c) defines the behavior of the request, such that different values of the field allows to cover creating combos, retrieving list of existing combos or retrieving the details about the specific combo. Namely:
- To create a combo, the requester must send the proposal of the security as the SecurityDefinition Request (c) with Security Request Type(321) equal to 1, and with needed description of the legs as a certain number of component blocks <InstrumentLeg>-s. If all checks are passed the combo will be created (if it does not exist yet). In that case of success, the server will reply with the Security Definition (d) message with Security Response Type (323) equal to 2 (“accept security proposal with possible revisions as indicated in the message”. The other fields of the response will contain the detailed description of the new (or existing) combo. The filed SecurityID (48) identifies the combo. If the request is invalid or not allowed then it will be rejected and the field Security Response Type (323) of the returned Security Definition message will be set to 5 (“reject proposal”).
- To request the details of the existing combo, the requester sends SecurityDefinition Request (c) with Security Request Type(321) equal to 0 and non-empty field SecurityID (48). In response, the server will send the Security Definition (d) of the existing combo with the corresponding SecurityID.
- To request the list of combo instruments, the requester sends SecurityDefinition Request (c) with Security Request Type(321) equal to 3 and selected Currency (15). The server will respond with Security Definition (d) message with the list of existing combo security symbols: the amount of the symbols is defined as NoUnderlyings(711) tag and followed the list of Underlying Symbol-s (311) which are actually the identifiers of the currently existing combo-s.
- Trading, Execution Reports and Market Data for combo instruments are committed, requested or notified via standard FIX messages, similar to the normal instruments. The symbols of combos obtained via the above Security Definition Request (c) can be directly used in the New Order Single, Cancle/ Replace and other FIX requests.
As to the RFQ functionality, currently Deribit supports only auto-complete RFQ model. There were added following FIX messages, which provide possibility to get snapshot or subscribe for the existing quotes as well as to send new quotes:
- To subscribe for quote requests from other traders or to pull the list of the existing ones, the requester sends RFQ Request (AH). The request must have non-empty Currency (15) field. If the requester wants to subscribe for the quote requests then the field Subscription Request Type (263) must be equal to 1. The requester may unsubscribe from the RFQ notifications using Subscription Request Type (263) = 2. Also it is possible to pull the existing quotes without subscription using (default or 263=0), in that case the server responds to the requester with the set of Quote Requests (R) – see below – which are not expired and exist in the system at the moment of the request.
- To request a certain quote, the requester sends Quote Request (R) message with the description of the quotes in the group after NoRelatedSym (146). In case of success the server will respond with Quote Status Report (AI) and the quote will be disseminated between interested subscribers and available for pulling via RFQ Request (AH). Otherwise, in case of a failure, the server responds with a Quote Request Reject (AG), for example if the limit of the active combo-s has been reached.
- The subscribers, which used RFQ Request (AH) with Subscription Request Type (263) equal to 1, will receive quotes as Quote Request (R) message. In case of quote expiration the Quote Status Report (AI) will be sent to the subscribers notifying about such an event.
AUTHOR(S)