Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Overview

Request for quote is a control used for buying and selling bonds. The Kodiak implementation implements Directed Request for Quote where counterparties need to be selected to send the quote request to.

Server

...

Currently the quote server is hosted on kodiak-dev → C:\temp\publish\Kodi.Kodiak.Quotes.Api . To start the server, simply run the application as administrator.

The swagger for the server can then be viewed on kodiak-dev here: http://localhost:7080/swagger/index.html

Or on your local machine here:

https://kodiak-dev.kodi.is:7081/swagger/index.htmlThe feature can be turned on/off in the Kodiak Server using the variable “EnableRequestForQuote”.

Server

The server validates tokens from Kodiak Token Issuer and it is necessary to include tokens from there as bearer tokens to communicate with the RFQ server.

The server contains the following operations:

Code Block
GET
"/api/quotes/login/{token}"
Returns an object containing Sends all quotes, quote offersdata andto quotequotes tradesqueue for the today.user

POST
"/api/quotes"
Body: CreateQuoteRequestCreateQuoteRequestRequest
To send a new quote request

Example body:
{
  "Symbol": "HFF150434",
  "Side": 1,
  "Price": 100.0,
  "MinimumQuantity": 20000.0,
  "MaximumQuantity": 40000.0,
  "ExposureDuration": 300,
  "ClientReference": "Test quote request",
  "Counterparties": ["ISY48"]
}

DELETE
"/api/quotes/{quoteId}"
Body: CancelQuoteRequestCancelQuoteRequestRequest
To cancel the quote request specified by the quoteId quoteRequestId

Example body:
{
  "QuoteRequestId": 100
}

POST
"/api/quotes/{quoteIdquoteRequestId}/offer_quote"
Body: CreateQuoteOfferRequestCreateQuoteRequest
To send a quote to the quote request specified by the quoteRequestId

Example body:
{
  "QuoteRequestId": 100,
  "Side": 1,
  "Price": 100.0,
  "Quantity": 20000.0,
  "ClientReference": "Test quote"
}

DELETE
"api/quotes/{quoteRequestId}/offer_quote"
Body: CancelQuoteRequest
To cancel the quote sent to the quote request specified by the quoteIdquoteRequestId

Example body:
{
  "QuoteRequestId": 100,
  "QuoteId": 50
}

POST
"/api/quotes/{quoteId}/accept_quote"
Body: AcceptQuoteOfferRequestAcceptQuoteRequest
To accept a quote offer for the quote. Quote offer specified in accept quote type

Example body:
{
  "QuoteRequestId": 100,
  "QuoteId": 50,
  "Side": 1,
  "Price": 100.0,
  "Quantity": 20000.0
}

Client

You can open a new quote window under Trading → QuotesRequest For Quote

Flow

The initiator starts the process by creating a quote request. The required fields are buyBuy/Sell/sellBoth, quantity, Symbol , Price and a list of counterparties.

...

Counterparties. The default lifetime of a quote request is 180 seconds, but any other duration can be specified. Min Quantity will be visible to the respondent of the quote request, but price, Max Quantity and Client Reference can only be seen by the initiator.

...

All counterparties specified in the counterparties list will receive the quote and have around 3 minutes to respond before the quote expires.

...

request. The amount of time they have to respond to the quote request is the lifetime specified in the quote request.

...

The recipient can respond to the quote request with a quote offer. The required fields are buy/sell, quantity and price. None of the fields are limited by any of the fields specified in the initial quote.

...

Client Reference will can only be seen by the respondent.

...

Finally, the initiator can accept one or more of the quote offersquotes.

...

The buy/sell side is limited to the buy/sell side of the quote offer. The required fields are quantity and price. The price needs to be equal to or higher than the price of the quote offer if the accepting quote offer has a sell side. The price needs to quantity must be equal to or lower than the price of the quote offer if the accepting quote offer has a buy side. The quantity must be equal to or lower than the quote offer in all cases.

...

quantity of the quote.

...

When a quote offer is accepted, a manual trade is generated.

Using Postman collection to call ems for opposite side quote requests

It isn’t possible to respond to a quote internally, and we’re unsure about whether or not we will implement it in the future. Therefore, to go through the entire flow from creating a quote to generating a quote trade, you can use the postman collection included here to call ems-s and ems-s2 for testing purposes:

View file
nameRequest for quote.postman_collection.json

This collection contains methods to call ems-s and ems-s2 to make quote requests, including sending a quote, canceling a quote, sending a quote offer and accepting a quote offer.

You’ll first have to fill the environment variables for y48/y49_username and y48/y49_password with a y48/y49 user and password combination. You can edit these variables in the right hand sidebar under “Environment quick look”.

In order to be able to send requests to ems-s or ems-s2, you’ll first have to authenticate through “Get token - y48/y49”. The token response will then be saved in the environment and you can send requests to ems-s and/or ems-s2.

Examples

Example flow using the OMS Client as an initiator and a y_49 user as the respondent using postman:

  • You create a quote using the OMS Client, adding ISY49 as a counterparty

  • You find the EXCHANGE_QUOTE_MESSAGE_ID of the quote in the kodiak-dev database using this select statement:

    • SELECT TOP(10) * FROM QUOTES ORDER BY ID_QUOTES DESC

  • You insert the EXCHANGE_QUOTE_MESSAGE_ID into the url for “Quote offer - y49”:

  • You accept the quote offer in the client. The quote will get a status of filled and a new trade will be generated

Example flow using the y_49 trader as the initiator through postman and the OMS Client as the respondent:

  • You create a new quote in postman under “Enter quote - y49”

  • You send a quote offer in the OMS Client

  • The id to accept the quote offer through ems-s2 isn’t available to us anywhere so the flow can’t be completed as of right now…

, at which point the counterparty for the quote will be visible to both sides.

...

Trade ticker

Optionally, quotes can be displayed in the trade ticker for Genium/Inet bonds. Quotes are marked orange in the trade ticker. The trade ticker can only display quote offers quotes and generated quote trades, but not the quote requests.

...

By default, quotes are not shown in the trade ticker, but the setting can be enabled/disabled for each trade ticker window under Trade Ticker Settings.

...

It is also possible to enable/disable showing quotes in the trade ticker by default when opening a new trade ticker window under Tools → Settings → Market Data → Show quotes by default. The current workspace needs to be saved and the client restarted for the setting to be modified.

...

Deployment

Prerequisites

The Kodiak Token Issuer needs to be present on the target machine in order to send requests to the RFQ server. You can find instructions for deploying the Token Issuer here:

  • Add to folder inetpub/wwwroot/token-issuer-iis

You will also have to run the CreateScript on your database in order for the service to run successfully.

Creating the service

To deploy the service, unzip the file inside to C:\KodiakRFQServer. Then, in a command prompt running with administrator privileges, run this command:

Code Block
sc create KodiakRFQServer binPath= "C:\KodiakRFQServer\Kodi.Kodiak.Quotes.api.exe" DisplayName= "Kodiak RFQ Server" start= auto

When these steps are completed you will be able to start, stop and restart the service under Windows Services.

Checklist:

  • Add ports 7081 and 7080 to local firewall rules