Change Log
2025-08-19
- Added two new columns for the order parameter fields: Direction (I / O) and Amendable (Y / N).
- Extracted the “GUI fields” column from the order parameter fields table into a separate table which shows the mappings between the WS API and OEMS GUI fields.
2024-06-14
- Rate limits have been imposed for all available APIs. Each service and action type will have a section documenting the rate limits for that specific API.
- Removed internal and restricted APIs from public access:
product
service, actionsgetMarketProperties
,genericSearch
,addProduct
,modifyProduct
.quotes
service, actionsrequest
andcancel
.
- Added changelog section.
2019-02-08
- Initial documentation release.
About TORA API
Welcome to the TORA API! The public API provides methods to access data from the system in order to use it in different applications. The data is transmitted in JSON format over HTTP (REST & Websocket).
General WebSocket protocol considerations
Property value types must be booleans, numbers, strings, objects, arrays, or null. However, it is useful define a set of standard data types when dealing with certain values. These data types will always be strings, but they will be formatted in a specific manner so that they can be easily parsed.
Type | Format | Description |
---|---|---|
boolean | - | Booleans can only have two values: true or false |
number | INT | Number contains no decimals |
number | DEC | Number contains decimals |
string | - | Used for storing and manipulating generic text |
string | DATE | A calendar date representation formatted as recommended by ISO 8601 using the YYYY-MM-DD format |
string | DURATION | An amount of intervening time in a time interval representation formatted P[n]Y[n]M[n]DT[n]H[n]M[n]S or P[n]W as shown and recommended by ISO 8601 |
string | TIMESTAMP | A timestamp representation as recommended by RFC 3339 |
string | ENUM | A set of named values called elements of the type |
string | UUID | A string representation of the universally unique identifier |
object | - | A JSON object that contains property names and values |
list | - | An array of values |
General Client Request
Parameter | Type | Format | Description |
---|---|---|---|
messageId | string | - | A unique identifier for the message. This is useful for correlating server logs with individual responses received at a client |
service | string | - | The service we need to route this request to |
action | string | - | The performed action |
params | object | - | Request parameters |
General Server Response
Initial object image updates:
{
"messageId": "...",
"service": "...",
"event": "update",
"messageReferenceId": "...",
"data": {
"objects": [...]
// note that isComplete is not set
}
}
// .. the last update that completes the initial image:
{
"messageId": "...",
"service": "...",
"event": "update",
"messageReferenceId": "...",
"data": {
"objects": [...],
"isComplete": true
}
}
Parameter | Type | Format | Description |
---|---|---|---|
messageId | string | UUID | A unique identifier for the message |
messageReferenceId | string | - | Refers the request messageId |
service | string | - | The service which handled the request |
event | string | - | Indicates the reply type |
params | object | - | Refers the request parameters |
data | object | - | The response payload |
status | object | - | Status contains the integer code and the string message |
Rate Limiting
To ensure fair usage and maintain optimal performance for all clients, our API employs rate limiting. This section details our rate limiting policies and provides guidelines for best practices.
What is Rate Limiting?
Rate limiting is a mechanism that controls the amount of incoming and outgoing traffic to or from a network. It is used to prevent abuse and overuse of resources, ensuring that all clients have access to the API in a fair manner.
Rate Limit Policy
Our API enforces rate limits, on a per-account basis, with the following key points:
- Each account is allowed a specific number of requests per minute, hour and day, depending on the service and action type used.
- Besides the rate limits, which limit the number of requests a client can perform in a certain time frame, we also impose limits on the number of active subscriptions for a certain service.
- The exact numbers can be found in the form of a table, under every available action type in this documentation.
- The thresholds defined in this documentation are applied by default to all accounts, however they can be adjusted per the needs of every account, if necessary.
- Whenever a limit is breached, the client will receive a reject response with status code 429 and a reject message stating which limit has been breached and some other additional information.
Best Practices for Efficient API Usage
To optimize your API usage and stay within the rate limits:
- Batch Requests: Whenever possible, batch multiple operations into a single request.
- Cache Responses: Cache frequent responses to reduce the number of API calls.
- Optimize Queries: Avoid making unnecessary requests by optimizing your queries and filtering data effectively.
- Monitor Usage: Regularly monitor your API usage against the provided rate limit headers to avoid unexpectedly hitting the limits.
Further Assistance
If you have any questions or need assistance regarding the rate limiting, please contact our OEMS support team.
OEMS
End points
Environment | WEBSOCKET |
---|---|
UAT | wss://api.uat.toradev.net/oems/v1 |
Authentication
The WebSocket protocol has a heartbeat mechanism. The server sends Ping messages every 30s, while the client needs to respond with a Pong message. A payload is mandatory on the Pong message, and can be anything (usually a timestamp is used).
Auth Routing Parameters
Parameter | Type | Description | Values |
---|---|---|---|
service | string | The auth service | auth |
action | string | The requested action | auth |
Auth Request Parameters
To authorize, use this code (replace
openIdToken
andaccessToken
with your tokens):
// Create a new WebSocket.
var socket = new WebSocket('wss://api.uat.toradev.net/oems/v1');
// Send the auth request
socket.send({
"messageId": "jTzNAHXnCv",
"service": "auth",
"action": "auth",
"params": {
"authMethod": "openIdConnect",
"idToken": "openIdToken",
"accessToken": "accessToken",
"group": "Group1",
"user": "user1"
}
});
Auth request is successful, the returned JSON is similar to:
{
"messageId": "...",
"service": "auth",
"event": "auth",
"messageReferenceId": "jTzNAHXnCv",
"status": {
"code": 0,
"message": "Ok"
}
}
Auth request is unsuccessful, the returned JSON is similar to:
{
"messageId": "...",
"service": "auth",
"event": "auth",
"messageReferenceId": "jTzNAHXnCv",
"status": {
"code": 201,
"message": "Auth failed: invalid id token"
}
}
Auth request is unsuccessful, the user was not specified:
{
"messageId": "...",
"service": "auth",
"event": "auth",
"messageReferenceId": "uccAL090CQ",
"data": {
"availableUsers": [
"user1",
"user3",
"user4"
]
},
"status": {
"code": 201,
"message": "Auth failed: No user specified. See the list of available user in the data/availableUsers field"
}
}
Auth request is unsuccessful, the group was not specified:
{
"messageId": "...",
"service": "auth",
"event": "auth",
"messageReferenceId": "uccAL090CQ",
"data": {
"availableGroups": [
"Group1",
"Group3",
"Group",
"Group5",
"Group7"
]
},
"status": {
"code": 201,
"message": "Auth failed: No group specified. See the list of available groups in the data/availableGroups field"
}
}
Parameter | Type | Format | Description |
---|---|---|---|
authMethod | string | - | The auth method used |
idToken | string | ID Token signature | The signature which can be verified with the public RSA key |
accessToken | string | Access Token signature | The uniquely Keycloak/Ping-generated encrypted token that allows user access to resources |
group | string | - | The group this user needs to authenticate for |
user | string | - | The compass user account we are authenticating with |
When the authentication is being performed, a compass user name must be supplied; this is because one email address can be linked with several compass user accounts, and the client needs to drive the user selection. When no user account is supplied but the token is valid, the auth request is rejected and a list of available users is returned.
In the case when the group membership is not known upfront, the client can initialize the authentication using the authMethod
, the idToken
and a valid accessToken
, and the server will respond providing the list of groups that are enabled for the user. Please note that in this case, the connection will be terminated, and the client will need to re-authenticate and specify the group.
In the case where there is only one user account enabled for that token in that specific environment, the login will pick that user account and that will be used in that session. This can also be applied for group selection. If for the token we have only one user account enabled on only one group, the login will be validated and the user + group combination will be used in that session. The auth service will return the picked user account and group, letting the client know what was selected.
Examples:
Email address: user1@domain.com
Compass user accounts for this address:
compassUser1 with access to groups: GROUP1, GROUP2
compassUser2 with access to groups: GROUP3
Auth request with valid token having: only the token
Result: request rejected; reason: should pick one user out of the two available for this request: compassUser1, compassUser2
Auth request with valid token having: token + user: compassUser1
Result: request rejected; reason: should pick one group out of the two available for this request: GROUP1, GROUP2
Auth request with valid token having: token + user: compassUser1 + group: GROUP1
Result: request succeeded; the token + user + group combination is valid and we return the user and group on the response
Auth request with valid token having: token + user: compassUser2
Result: request succeeded; the token + user combination determines that this user is only member of a single group; we validate it and we return the user and group on the response
Auth request with valid token having: token + user: someCompassUser
Result: request rejected; reason: someCompassUser is invalid
Email address: user2@domain.com
Compass user accounts for this address:
compassUser3 with access to groups: GROUP4
Auth request with valid token having: only the token
Result: request succeeded; the token determines that there is only one user for this email address and this user is member of only one group; we validate it and we return the user and group on the response
Both the idToken
and accessToken
have an expiration time, after which these two become invalid. Before this expire time is reached out, the tokens need to be refreshed, so that the validation passes and the
already logged-in user remains connected to the application; if the validation fails, the user is logged out.
Auth Response Data
Parameter | Type | Format | Description |
---|---|---|---|
availableGroups | list | - | A collection of strings representing the available groups |
availableUsers | list | - | A collection of strings representing the available users for the email address |
Orders
Parameter | Values |
---|---|
service | orders |
The order service provides information on the orders inside the system. The authenticated client can perform the order actions detailed bellow:
- subscribe: the client is ready to receive updates on the orders that match the subscription filter
- unsubscribe: the client stops receiving updates on the orders that match the subscription filter
- parent register: stages the parent order inside the system, but doesn't send it to the exchange
- parent send: sends the existing parent order to the exchange
- parent registerAndSend: performs both
register
andsend
for the required parent order - parent amend: amends the existing parent order, setting it with the specified values
- parent cancel: cancels the existing parent order
- child register: stages the child order inside the system for the specified parent, but doesn't send it to the exchange
- child send: sends the existing child order to the exchange
- child registerAndSend: performs both
register
andsend
for the required child order - child amend: amends the existing child order, setting it with the specified values
- child cancel: cancels the existing child order
- manual execution: creates a manual execution
- extra samples: more samples for various instruments
Order Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "orders",
"action": "subscribe",
"params": {
"subscriptionId": "test order subscription",
"symbolType": "tora"
}
});
The initial order image is retrieved:
// First message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [...]
}
}
// Last message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [...],
"isComplete": "true"
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates on the orders that are present in the system.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Order Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora , forex ; if missing, defaults to tora |
filter | object | - | Instructs the orders service to return all the orders that match this filter |
Order Subscription Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "orders",
"event": "subscribe",
"params": {
"subscriptionId": "test order subscription",
"symbolType": "tora"
},
"status": {
"code": 0,
"message": "Subscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "orders",
"event": "subscribe",
"params": {
"subscriptionId": "test order subscription",
"symbolType": "tora"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Order Unsubscribe
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "orders",
"action": "unsubscribe",
"params": {
"subscriptionId": "test order subscription"
}
});
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "orders",
"event": "unsubscribe",
"params": {
"subscriptionId": "test order subscription"
},
"status": {
"code": 0,
"message": "Unsubscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "orders",
"event": "unsubscribe",
"params": {
"subscriptionId": "test order subscription"
},
"status": {
"code": 201,
"message": "Invalid unsubscribe request: <reason>."
}
}
Parameter | Values |
---|---|
action | unsubscribe |
params.subscriptionId | The subscription id for which the client doesn't need to receive any more updates |
The client requests not to receive any more updates for the specified subscription.
Order Updates
The initial order image is retrieved:
// First message in the initial image
{
"messageId": "bb60e356-b325-4ef3-bc5d-c75eb95697ef",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [{
"orderId": "SUF/GlqBWG8AAq/j",
"clientOrderId": "05a075a3-926a-4791-8a39-e33899b1152c",
"creationTime": "2018-11-06T16:51:22.000Z",
"sendTime": "2018-11-06T16:51:22.000Z",
"lastUpdateTime": "2018-11-06T16:51:22.000Z",
"broker": "ml",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"quantity": 1000,
"executedQuantity": 700,
"limitPrice": 6250.54,
"owner": "george",
"flowType": "DMA",
"state": "SENT",
"status": "OK",
"brokerAccount": "ARDITI",
"internalAccount": "hoarding",
"executedValue": 4263.342,
"referencePrice": 6250.54,
"averagePrice": 6219.77095339,
"notionalValue": 6232.574627,
"previousExecutedQuantity": 0,
"previousExecutedValue": 0.0,
"dayAvgPx": 6219.77095339,
"tradeBook": "oranges"
},
{
"orderId": "SUF/GlqBWG8AAq/w",
"clientOrderId": "bbe7ac4a-34c1-4496-8581-367b4f3a277d",
"creationTime": "2018-11-06T20:11:45.000Z",
"sendTime": "2018-11-06T20:43:58.000Z",
"lastUpdateTime": "2018-11-06T20:43:58.000Z",
"broker": "gs",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.SP.JPY.1734",
"quantity": 3000,
"executedQuantity": 400,
"limitPrice": 6019.86,
"owner": "george",
"flowType": "DMA",
"state": "SENT",
"status": "ERROR",
"errorMessage": "Some error triggered by last user action",
"brokerAccount": "ARDITI",
"internalAccount": "hoarding",
"tradeBook": "lemons"
}
]
}
}
// Last message in the initial image
{
"messageId": "77226975-3b8e-48ed-868c-f2dc88388a91",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [{
"orderId": "SUF/GlqBWG8AA/aa",
"clientOrderId": "bde9e8c4-b6c0-4c5e-b514-2f1ddbf597a8",
"creationTime": "2018-11-06T18:30:51.000Z",
"sendTime": "2018-11-06T18:31:22.000Z",
"lastUpdateTime": "2018-11-06T18:31:22.000Z",
"broker": "jpm",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.2137",
"quantity": 1500,
"executedQuantity": 1300,
"limitPrice": 6238.5,
"owner": "george",
"flowType": "DMA",
"state": "SENT",
"status": "OK",
"brokerAccount": "ARDITI",
"internalAccount": "hoarding",
"tradeBook": "oranges"
}],
"isComplete": "true"
}
}
// Subsequent update
{
"messageId": "db744fdb-596c-4b52-b759-16e6f291b5e4",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [{
"orderId": "SUF/GlqBWG8AAq/j",
"clientOrderId": "05a075a3-926a-4791-8a39-e33899b1152c",
"creationTime": "2018-11-06T16:51:22.000Z",
"sendTime": "2018-11-06T16:51:22.000Z",
"lastUpdateTime": "2018-11-06T16:51:22.000Z",
"broker": "ml",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"quantity": 1000,
"executedQuantity": 800,
"limitPrice": 6250.54,
"owner": "george",
"flowType": "DMA",
"state": "SENT",
"status": "OK",
"brokerAccount": "ARDITI",
"internalAccount": "hoarding",
"tradeBook": "oranges"
}
]
}
}
//Order update for multi-leg order
{
"messageId": "b95b0445-9c52-461e-ab27-587a77533c84",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orderSubscriptionIdUprDt2dQiekAAAAy"
},
"data": {
"orders": [
{
"orderId": "AAAJYWdQitkAAACJ",
"clientOrderId": "CLIENT_IDUprDt2dQiekAAAA6",
"isParent": false,
"parentId": "AAAJYWdQitkAAAB8",
"symbol": "SPR.FUT.ATW.IEU.USD.202810-3M",
"exchange": "IEU",
"broker": "simu",
"side": "BUY",
"quantity": 2000.0,
"limitPrice": 120.0,
"owner": "TestUser1",
"flowType": "DMA",
"brokerAccount": "LongShort",
"internalAccount": "InternalAccount1",
"state": "SENT",
"executedQuantity": 1000.0,
"creationTime": "2024-12-04T17:02:32.209000Z",
"sendTime": "2024-12-04T17:02:32.602000Z",
"lastUpdateTime": "2024-12-04T17:02:33.072000Z",
"status": "OK",
"executedValue": 10000.0,
"notionalValue": 1.3E8,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"condition": "NORMAL",
"averagePrice": 10.0,
"dayAvgPx": 10.0,
"legs": [
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202812",
"side": "BUY",
"executedValue": 10000.0,
"executedQuantity": 1000.0,
"previousExecutedValue": 0.0,
"previousExecutedQuantity": 0.0
},
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202811",
"side": "BUY",
"executedValue": 10000.0,
"executedQuantity": 1000.0,
"previousExecutedValue": 0.0,
"previousExecutedQuantity": 0.0
},
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202810",
"side": "BUY",
"executedValue": 10000.0,
"executedQuantity": 1000.0,
"previousExecutedValue": 0.0,
"previousExecutedQuantity": 0.0
}
],
"currentMarginFlag": "None",
"externalId": "CLIENT_IDUprDt2dQiekAAAA6",
"lastUpdateOwner": "TestUser1",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"lastExecutedTime": "2024-12-04 17:02:32.000 GMT 0us",
"originator": "TestUser1",
"pendingQuantity": 1000.0,
"strategyId": "AAAJYWdQitkAAAB8",
"strategyType": -1,
"isHidden": false
}
]
}
}
Parameter | Values |
---|---|
event | update |
params | The subscription parameters |
data.orders | The list of orders that were updated |
data.isComplete | Is set, and the value is true when the initial order image transfer is complete |
Order Fields
Parameter | Type | Format | Description | Direction | Amendable |
---|---|---|---|---|---|
aggregatedParentId | string | UUID | Aggregation parent identifier for orders part of an aggregation | O | N |
algoFields | object | - | Values for the algo fields that were set on this order; example: {"StartTime": "xxx", "EndTime": "yyy", "ParticipationRate": "15"} |
I / O | Y |
algoStrategy | string | - | The broker algo strategy used | I / O | Y |
allocationMethod | string | - | Specified allocation method for this order; can be either the predefined allocation method name, or it can be a custom allocation string | I / O | Y |
averagePrice | number | DEC | Order execution average price | O | N |
broker | string | - | Order execution broker | I / O | Y |
brokerAccount | string | - | Indicates the specified account a client has at a certain broker | I / O | Y |
brokerDestinationParameters | string | - | Some brokers offer specific ways of matching orders. This is accomplished by creating pools where orders are stored and then executed according to their specific pool parameters (these are set before the order is sent). Example: {"Hidden": true, "PostOnly": false} |
I / O | Y |
brokerOrdTypeFlag | string | - | Populated for orders flagged with a specific destination at the broker, shown as BrkFlag in GUI. Examples: prg , jmc , wap , etc |
I / O | Y |
capacity | string | - | Order capacity | I / O | Y |
carriedFlag | string | ENUM | Set on GTC orders with true if the order is tora level and false if the order is broker level; not present on DAY orders. |
I / O | Y |
caspianCode | string | - | Caspian symbol for the instrument this order is traded | I / O | N |
childQuantity | number | DEC | On parent orders: sum of the quantities of all children | O | N |
clientAlias | string | - | Identifier for the client alias | I / O | N |
clientOrderId | string | - | The client order identifier | I | N |
commissionMethod | object | - | The cost order's template id, together with the selected cost type, parameters and flags | I / O | Y |
condition | string | ENUM | The condition of the traded order. The possible conditions are: NORMAL , WORKED , OPEN , CLOSE , FUNARI , FOK (fill or kill), IOC (immediate or cancel) |
I / O | Y |
confirmation | string | ENUM | Order limit confirmation; possible values: NONE , Y , N |
I / O | Y |
creationTime | string | TIMESTAMP | Order creation time | O | N |
creatorComponent | string | - | Order creator component | I / O | N |
crossingParameters | string | - | Displays the crossing parameters set for the TORA pool | I / O | Y |
dayAvgPx | number | DEC | Order execution average price for the current trading day | O | N |
errorMessage | string | - | Order error description message | O | N |
evaluateRelativePrice | boolean | - | Evaluate the relative price specified by the relativePrice parameter. If true , order registration requests will overwrite the limit price, while amend/send requests will amend the existing limit price. Defaults to false if missing. Note that this parameter is only valid within a request, and is not retained between subsequent requests. |
I | N |
exchange | string | - | Order exchange | I / O | N |
exchangeExecutionId | string | - | Last execution's id on the exchange | O | N |
exchangeInternalId | string | - | Exchange internal id | O | N |
exchangeOrderID | string | - | Exchange order id | I / O | N |
excludedDealers | list | - | Indicates the list of excluded dealers. Used for FX instruments. The differences between the all supported dealers and the ones specified here may contain one item for FULL subscription type or one or more items for LMT subscription type or an empty value. |
I | Y |
executedQuantity | number | DEC | Current executed quantity for this order | O | N |
executedValue | number | DEC | Current executed value for this order | O | N |
externalId | string | - | The external order id for orders that are generated from outside the system | I / O | N |
externalOwner | string | - | The external owner for orders that are generated from outside the system | I / O | Y |
fixBrokerOrderId | string | - | Order id received from broker over FIX | I / O | N |
fixExecId | string | - | Execution id received over FIX | I / O | N |
fixExecRefId | string | - | Execution reference id received over FIX | I / O | N |
fixingDate | string | TIMESTAMP | Date at which the difference between the prevailing spot market rate and the agreed-upon rate is calculated | I / O | Y |
fixOrderId | string | - | Order id received over FIX | I / O | N |
flowType | string | ENUM | The order handling instruction: DMA , ALGO , WORKED |
O | N |
freezeTime | string | UNIX-TIMESTAMP | Time when the order is marked as frozen during the EOD Events | O | N |
groupingId | string | - | Grouping identifier for orders that are part of a group | I / O | Y |
groupingType | string | - | Grouping type for orders that are part of a group; possible values: PAIR , CROSS , AGGREGATION |
I / O | Y |
includedDealers | list | - | Indicates the list of included dealers. Used for FX instruments. May contain one item for FULL subscription type or one or more items for LMT subscription type or an empty value. |
I | Y |
instrumentType | string | ENUM | Indicates the type of FX instruments; possible values: FXSPOT , FXFWD , FXSWP |
I | N |
internalAccount | string | - | Indicates the internal account selected for this order | I / O | Y |
internalComment | string | - | Internal comment set on this order | I / O | Y |
internalNote | string | - | The internal note that was set on this order | I / O | Y |
isCrossing | boolean | - | Indicates this order has been crossed | I / O | N |
isDeleted | boolean | - | Indicated whether this order was removed from the system | O | N |
isFrozen | boolean | - | Indicated whether this order was frozen during the EOD Events | O | N |
isParent | boolean | - | True when this is a parent order | O | N |
lastTradingDate | string | TIMESTAMP | The last trading date for this GTD order. The timezone of this parameter is GMT. |
I / O | Y |
lastUpdateOwner | string | - | The last update owner | I / O | Y |
lastUpdateTime | string | TIMESTAMP | The last update time | O | N |
legs | object | - | An object used to specify the data fields of legs | I / O | N |
legs -> name | string | - | Indicates the name of leg; possible values:near , far |
I | Y |
legs -> quantity | string | - | Indicates the quantity of leg. If it is missing then the quantity value from order will be used for all of legs. | I | Y |
legs -> settlementDate | string | yyyyMMdd | Indicates the settlement date of FXFWD/FXSWP's legs. If it is missing, then the tenor value will be used. | I | Y |
legs -> tenor | string | - | Indicates the tenor code used to determine the settlement date of FXSWP's legs. Examples: SPOT , TOM , 1W , 6M , 5Y |
I | Y |
legs -> symbol | string | - | Instrument symbol this leg is received | O | N |
legs -> side | string | ENUM | Execution side. Possible values BUY , SELL , BTC , SHORT , SSE |
O | N |
legs -> executedValue | number | DEC | Current executed value for this leg | O | N |
legs -> previousExecutedValue | number | DEC | Previous trading day leg executed value | O | N |
legs -> previousExecutedQuantity | number | DEC | Previous trading day leg executed quantity | O | N |
limitPrice | number | DEC | Order limit price | I / O | Y |
limitRequestId | string | - | Identifier for the limit request | I / O | N |
limitRequestIdTime | string | TIMESTAMP | Timestamp for the limit request | I / O | N |
limitStatus | string | ENUM | The limit status for this order; possible values: PLIM = Pending Limits, APPR = Approved, REJD = Rejected |
I / O | Y |
liquiditySection | string | - | Identifies the feed (or section) for which liquidity data is offered | I / O | N |
liquidityTransactionId | string | - | Identifier for the last liquidity transaction | I / O | N |
locateBroker | string | - | The locate broker for SHORT orders | I / O | N |
locateId | string | - | The locate ID for SHORT orders | I / O | Y |
manualExecution | string | - | Populated withYwhen this order is booked manually, missing when this is a regular trade | I / O | N |
matchId | string | - | Indicator for the matching that took place in the dark pool | I / O | N |
mifidFields | object | - | MIFID related fields carried on this order | I / O | Y |
note | string | - | Order note | I / O | Y |
notionalPrice | number | DEC | Price used to compute the notional value | I / O | Y |
notionalValue | number | DEC | Notional value of the traded order | O | N |
openClose | string | ENUM | Identifies whether an order is a margin order or a non-margin order; possible values: Open , Close |
I / O | Y |
orderId | string | UUID | The order identifier | O | N |
orderType | string | - | Type of this order: MARKET , STOP , LIMIT or for ALGO orders (ATDL) the format broker_ATDL where broker is the execution broker. When condition is WORKED the following order types are used: MKT , CD , STLMT , LOB , VWAP , STOP , STOPLMT , STOPCD . |
I / O | Y |
originator | string | - | Order originator | I / O | N |
owner | string | - | Order owner | I / O | Y |
panicMode | string | - | Panic mode flag | I / O | Y |
parentId | string | UUID | If this order is a child order, this will hold the parent order identifier | I / O | N |
pendingQuantity | number | DEC | The order portion that has not yet been executed | I / O | N |
positionMultiplier | number | DEC | Position multiplier for the instrument this order is traded in | I / O | N |
previousExecutedQuantity | number | DEC | Previous trading day executed quantity | O | N |
previousExecutedValue | number | DEC | Previous trading day executed value | O | N |
primaryExchangeBloombergCode | string | - | Bloomberg code for the primary exchange the instrument this order is traded | I / O | N |
primaryExchangeReutersCode | string | - | Reuters code for the primary exchange the instrument this order is traded | I / O | N |
productExpireDate | string | TIMESTAMP | The expire date for derivatives with expiration | I / O | N |
productNativeCode | string | - | Exchange native code for Caspian products | I / O | N |
quantity | number | DEC | Order quantity | I / O | Y |
referencePrice | number | DEC | Order reference price; the price at the order Register time, then updated at the order Send time | I / O | Y |
relativePrice | string | - | Order relative price; Available types are ASK{t} BID{t} LAST{t} OPEN{t} CLOSE{t} , where {t} represents a signed-integer number of ticks to offset. cf: ASK+2 BID-1 . When evaluateRelativePrice is true , limitPrice will be overwritten by what the relative price is evaluated to at the moment of the action. |
I / O | Y |
relativeTimeout | number | INT | Order relative price's timeout in milliseconds. Overrides the default relativePrice evaluation timeout if specified. Default timeout is used if omitted. Note that this parameter is only valid within a request, and is not retained between subsequent requests. |
I | N |
sender | string | - | Order sender | I / O | N |
sendTime | string | TIMESTAMP | Order send time | O | N |
settlementCCY | string | - | Order settlement currency | I / O | N |
settlementDate | string | yyyy-MM-dd HH:mm:ss.SSS z | Order settlement date | I / O | Y |
shortLocate | string | - | Order short locate | I / O | N |
side | string | ENUM | Order side; possible values: BUY , SELL , BTC , SHORT , SSE |
I / O | N |
state | string | ENUM | Order state; possible values: SENT , FILD , REDG , CAND , PAMD , PSEN , PCAN , EXPD , OVER |
O | N |
status | string | ENUM | Order status; possible values: OK , ERROR |
O | N |
stopPrice | number | DEC | Stop price for this order | I / O | Y |
strategy | string | - | Order strategy description | I / O | Y |
strategyId | string | - | Order strategy id | I / O | N |
strategyType | string | - | Order strategy type | O | N |
subscriptionType | string | - | FOREX subscription type; possible values: FULL , LMT |
I / O | Y |
suspended | string | - | Order suspended flag | I / O | N |
symbol | string | - | Instrument symbol this order is traded. If the symbolType has value forex then the symbol field must contains the pair of FX currencies separated by slash / |
I / O | N |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora , forex ; if missing, defaults to tora |
I | N |
synthType | string | - | Populated for the orders placed on a synthetic instrument. Examples: swp , cfd , etc, will be empty for normal orders |
I / O | Y |
tag | string | - | Order custom tag | I / O | Y |
timeInForce | string | ENUM | Order TIF, must be missing for DAY orders, possible values: GTS = Good 'Till Session, GTC = Good 'Till Cancelled, GTD = Good 'Till Date |
I / O | Y |
timeout | number | INT | Order timeout | I / O | N |
tradeBook | string | - | Indicates the specified tradebook for this order | I / O | Y |
tradedCCY | string | - | Specifies the currency in which the trade is executed. This field is applicable for forex orders. | I / O | Y |
transferFromId | string | - | Transfer from identifier | I / O | N |
transferToId | string | - | Transfer to identifier | I / O | N |
unsolicitedTouch | string | - | Order unsolicited touch | I / O | Y |
waveId | string | - | Order wave identifier | I / O | Y |
workAMPM | string | - | Worked AM/PM parameter | I / O | Y |
workATDLDescription | string | - | Worked ATDL description. The timezone of timestamp parameters is the market timezone. | I / O | Y |
workATDLGUI | string | - | Worked ATDL state | I / O | Y |
workAutomate | string | - | Worked automate parameter | I / O | Y |
workBrkSpec | string | - | Worked broker specific parameter | I / O | Y |
workBrkSpecATDL | string | - | Worked ATDL broker specific parameter. The timezone of timestamp parameters is GMT. | I / O | Y |
workBrkSpecStrategy | string | - | Worked broker specific strategy parameter | I / O | Y |
workTimeBegin | string | TIMESTAMP | Worked start time parameter | I / O | Y |
workTimeEnd | string | TIMESTAMP | Worked end time parameter | I / O | Y |
workType | string | - | Type of a worked order; possible values: MKT , VWAP , CD , StopMKT , STLMT , StopLMT , LOB , StopCD , BrkAlgo . For ALGO orders (ATDL), the type has the format broker_ATDL , where broker is the execution broker. |
I / O | Y |
workVolume | string | - | Worked volume parameter | I / O | Y |
Mappings between WS API fields and OEMS GUI fields
WS API Field | GUI Field |
---|---|
aggregatedParentId | Parent ID |
broker | Broker |
brokerAccount | BrokerAccount |
brokerOrdTypeFlag | BrkFlag |
childQuantity | Child Qty |
commissionMethod | Commission Method |
condition | Condition |
confirmation | Confirmation |
creationTime | Creation Time |
dayAvgPx | DayAvgPrice |
errorMessage | Error Message |
exchange | EX |
externalId | External ID |
externalOwner | External Owner |
flowType | Flow Type |
groupingId | Grouping ID |
groupingType | Grouping Type |
internalAccount | Internal Account |
internalNote | Internal Note |
limitPrice | LMTPx |
limitStatus | Limit Status |
note | Comments |
openClose | Opt OpenClose |
orderId | Order ID |
orderType | Order Type |
originator | Originator |
owner | Owner |
parentId | Parent ID |
pendingQuantity | Pending |
sendTime | Sending Time |
settlementDate | Settlement Date |
side | Side |
state | State |
status | Status |
stopPrice | Stop Price |
synthType | SynthType |
tag | Tag |
tradeBook | Trade Book |
tradedCCY | Traded CCY |
unsolicitedTouch | Unsolicited Touch |
workType | Worked Type |
Subscription filters
Subscribe for all orders:
socket.send({
"messageId": "9feec0f4-04ff-4ea1-aecc-8fe2a0d40490",
"service": "orders",
"action": "subscribe",
"params": {
"subscriptionId": "test order subscription - all orders",
"symbolType": "tora"
}
});
All orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "9feec0f4-04ff-4ea1-aecc-8fe2a0d40490",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription - all orders"
},
"data": {
"orders": [...]
}
}
Subscribe for all parent orders:
socket.send({
"messageId": "f795b899-764d-4dbf-948f-e2517f059795",
"service": "orders",
"action": "subscribe",
"params": {
"subscriptionId": "test order subscription - only parent orders",
"symbolType": "tora",
"filter": {
"isParent": true
}
}
});
All parent orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "f795b899-764d-4dbf-948f-e2517f059795",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription - only parent orders"
},
"data": {
"orders": [...]
}
}
Subscribe for all specific parent's child orders:
socket.send({
"messageId": "005c22be-1a2b-4666-9cfb-daec3653a25d",
"service": "orders",
"action": "subscribe",
"params": {
"subscriptionId": "test order subscription - specific child orders",
"symbolType": "tora",
"filter": {
"parentId": "someParentId"
}
}
});
All parent orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "005c22be-1a2b-4666-9cfb-daec3653a25d",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription - specific child orders"
},
"data": {
"orders": [...]
}
}
Filter Parameter | Description |
---|---|
isParent | Instructs the orders service to return all the parent orders |
parentId | Instructs the orders service to return all specific parent's child orders |
When subscribing for orders, the API allows subscriptions for all the orders, when filter is not set, for parent only orders, "isParent"
: true filter parameter is set, or for orders that have a specific parent, "parentId"
: "specificParentId"
Parent Register
Use the
register
action and specify the required order fields
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "order_2018-11-14_1",
"symbol": "CS.NULL.JAPAN.SP.JPY.2137",
"symbolType": "tora",
"quantity": 2000,
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "LongShort",
"broker": "binance"
}
}
});
The parent order is registered
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "register",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
},
"status": {
"code": 0,
"message": "Ok"
}
}
DMA parent register. Use the
register
action and specify the required order fields. The NORMAL condition is implicit, so orders missing the condition field will be considered DMA.
socket.send({
"messageId": "cc82875a-4270-461b-8807-0cfb57285a4d",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "CLORDID_DMA_ORDER_1",
"symbol": "CS.NULL.JAPAN.T.JPY.6702",
"symbolType": "tora",
"quantity": 1000,
"side": "BUY",
"broker": "ubs",
"condition": "NORMAL",
"brokerAccount": "BA",
"internalAccount": "IA",
"tradeBook": "TB"
}
}
});
WORKED parent register. Use the
register
action and specify the required order fields. For an order to be considered WORKED, it is required to specify the condition as WORKED and an order type.
socket.send({
"messageId": "db8dd9b5-9635-4a05-bf53-12230123f799",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "CLORDID_WORKED_ORDER_1",
"symbol": "CS.NULL.JAPAN.T.JPY.6702",
"symbolType": "tora",
"quantity": 1000,
"side": "BUY",
"broker": "ubs",
"condition": "WORKED",
"orderType": "CD",
"brokerAccount": "BA",
"internalAccount": "IA",
"tradeBook": "TB"
}
}
});
ALGO parent register. Use the
register
action and specify the required order fields. For an order to be considered ALGO, it is required to specify the condition as WORKED, the algo strategy and algo fields, as well as an order type having thebroker_ATDL
format.
socket.send({
"messageId": "3763f5f8-e4cf-4add-aa7d-f79402197756",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "CLORDID_ALGO_ORDER_1",
"symbol": "CS.NULL.JAPAN.T.JPY.6702",
"symbolType": "tora",
"quantity": 1000,
"side": "BUY",
"broker": "baml",
"condition": "WORKED",
"orderType": "BAML_ATDL",
"brokerAccount": "BA",
"internalAccount": "IA",
"tradeBook": "TB",
"algoStrategy": "VWAP",
"workBrkSpecATDL": "6401:1;6408:M;6168:20230215-13:31:23;126:20230215-14:31:23;6961:1900.0"
}
}
});
FXSWP parent register with bhalanced quantities. Use the
register
action and specify the required order fields
socket.send({
"messageId": "2023-02-07_5",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "order_2019-10-14_1",
"symbol": "USD/JPY",
"symbolType": "forex",
"side": "BUY",
"quantity": 1000,
"limitPrice": "1.537",
"brokerAccount": "BA",
"broker": "ebs"
"exchange":"EBS",
"tradedCCY":"USD",
"legs": [
{
"name": "near",
"tenor":"SPOT"
},
{
"name": "far",
"settlementDate":"20230223"
}
]
}
}
});
FXSWP parent register with unbalanced quantities. Use the
register
action and specify the required order fields
socket.send({
"messageId": "2023-02-07_5",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "order_2019-10-14_1",
"symbol": "USD/JPY",
"symbolType": "forex",
"side": "BUY",
"limitPrice": "1.537",
"brokerAccount": "BA",
"broker": "ebs"
"exchange":"EBS",
"tradedCCY":"USD",
"legs": [
{
"name": "near",
"tenor":"SPOT",
"quantity": 1000
},
{
"name": "far",
"settlementDate":"20230223",
"quantity": 2000
}
]
}
}
});
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | register |
params.order | The specified parent order fields |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Parent Send
Use the
send
action and specify theorderId
or theclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "send",
"params": {
"orderId": "AAEWu1vsKJYAAABX",
// or
"clientOrderId" : "order_2018-11-14_1",
// optional
"skipLimitChecks" : true,
// optional
"evaluateRelativePrice" : true,
// optional
"relativeTimeout" : 1000
}
});
The parent order is sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "send",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | send |
params.orderId | The parent order with this ID will be sent |
params.clientOrderId | Client specified order ID, useful for identifying the order on the client side |
params.skipLimitChecks | Bypass limit checks on the order for this action; limits will be skipped both for the parent order and the child order |
params.evaluateRelativePrice | See Order Fields. |
params.relativeTimeout | See Order Fields. |
Parent Register and Send
Use the
registerAndSend
action, and specify the required order fields
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"clientOrderId": "order_2018-11-14_1",
"symbol": "CS.NULL.JAPAN.SP.JPY.2137",
"symbolType": "tora",
"quantity": 2000,
"side": "BUY",
"relativePrice": "ASK-1",
"account": "LongShort",
"broker": "citi"
}
}
});
The parent order is registered and sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "registerAndSend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | registerAndSend |
params.orderId | The parent order with this ID will be registered and sent |
params.clientOrderId | Client specified order ID, useful for identifying the order on the client side |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Parent Amend
Use the
amend
action and specify the required order fields, along with the parent order identifier:orderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "amend",
"params": {
"order": {
"orderId": "AAEWu1vsKJYAAABX", // or "clientOrderId" : "order_2018-11-14_1"
"symbolType": "tora",
"quantity": 4000 // increase the quantity to 4000
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "LongShort",
"broker": "binance",
}
}
});
The parent order is amended
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "amend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
},
"status": {
"code": 0,
"message": "Ok"
}
}
ALGO parent amend. Use the
amend
action and specify the required order fields, along with the parent order identifier:orderId
orclientOrderId
socket.send({
"messageId": "2019-10-14_5",
"service": "orders",
"action": "amend",
"params": {
"order": {
"orderId": "AAEWu1vsKJYAAABX", // or "clientOrderId" : "order_2019-10-14_1"
"symbolType": "tora",
"quantity": 2000,
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "LongShort",
"broker": "seb"
"condition":"WORKED",
"algoStrategy":"1111",
"algoFields":{
"StartTime":"20191020-14:59:30",
"EndTime":"20191020-15:59:30",
"ParticipationRate":"30" //change the participation rate to 30
}
}
}
});
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 7500 |
1 hour | 15000 |
1 day | 15000 |
Parameter | Values |
---|---|
action | amend |
params.order | The specified parent order fields and the ones that need to be updated |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Amending the parent order is similar to the parent register action, except that when performing this action, we only need to set the updated fields and the order identifier. There are a few constraints when amending the parent order: the parentId
, orderId
, clientOrderId
, side
or symbol
fields cannot be changed. Also, the broker
field can be changed only if the parent order is still in register state (not sent to the broker).
Parent Amend & Send
Use the
amendAndSend
action and specify the required order fields, along with the parent order identifier:orderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "amendAndSend",
"params": {
"order": {
"orderId": "AAEWu1vsKJYAAABX", // or "clientOrderId" : "order_2018-11-14_1"
"limitPrice": "123.4"
}
}
});
The parent order is amended and sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "amendAndSend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 7500 |
1 hour | 15000 |
1 day | 15000 |
Parameter | Values |
---|---|
action | amendAndSend |
params.order | The specified parent order fields and the ones that need to be updated |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Currently, only the limitPrice
field is eligible for this amendment. Specifying any other fields will be rejected.
Parent Cancel
Use the
cancel
action and specify theorderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "cancel",
"params": {
"orderId": "AAEWu1vsKJYAAABX"
// or
"clientOrderId" : "order_2018-11-14_1"
}
});
The parent order is cancelled
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "cancel",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "AAEWu1vsKJYAAABX"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 12500 |
1 hour | 25000 |
1 day | 25000 |
Parameter | Values |
---|---|
action | cancel |
params.orderId | The parent order with this ID will be cancelled |
params.clientOrderId | The parent order having this client order ID will be cancelled |
Child Register
Use the
register
action and specify the required order fields, along with theparentId
// The parent order id needs to be specified
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "order_2018-11-14_1",
"symbol": "CS.NULL.JAPAN.SP.JPY.2137",
"symbolType": "tora",
"quantity": 2000,
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "LongShort",
"broker": "binance",
"parentId": "AAEWu1vsKJYAAABX"
}
}
});
The child order is registered
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "register",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | register |
params.order | The specified child order fields |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Please note that when slicing a parent order into several child orders, for each of the child orders that are being registered, the parent id field must be set; otherwise, this register action is treated as a basic parent register action.
Child Send
Use the
send
action and specify theorderId
or theclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "send",
"params": {
"orderId": "U9W4IV0LOL8AB0JW",
// or
"clientOrderId" : "order_2018-11-14_1",
// optional
"evaluateRelativePrice" : true,
// optional
"relativeTimeout" : 1000
}
});
The child order is sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "send",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | send |
params.orderId | The child order with this ID will be sent |
params.clientOrderId | Client specified order ID, useful for identifying the order on the client side |
params.evaluateRelativePrice | See Order Fields. |
params.relativeTimeout | See Order Fields. |
This action is identical to the parent send one.
Child Register and Send
Use the
registerAndSend
action, and specify the required order fields, along with theparentId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"clientOrderId": "order_2018-11-14_1",
"symbol": "CS.NULL.JAPAN.SP.JPY.2137",
"symbolType": "tora",
"quantity": 2000,
"side": "BUY",
"relativePrice": "BID+1",
"account": "LongShort",
"broker": "citi",
"parentId": "AAEWu1vsKJYAAABX"
}
}
});
The child order is registered and sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "registerAndSend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | registerAndSend |
params.orderId | The child order with this ID will be registered and sent |
params.clientOrderId | The child order having this client order ID will be registered and sent |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Please note that when slicing a parent order into several child orders, for each of the child orders that are being registered and sent, the parent id field must be set; otherwise, this register and send
action is treated as a basic parent registerAndSend action.
Child Amend
Use the
amend
action and specify the required order fields, along with the child order identifier:orderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "amend",
"params": {
"order": {
"orderId": "AAEWu1vsKJYAAABX", // or "clientOrderId" : "order_2018-11-14_1"
"symbolType": "tora",
"quantity": 4000,// increase the quantity to 4000
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "LongShort",
"broker": "binance",
"parentId": "AAEWu1vsKJYAAABX"
}
}
});
The child order is amended
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "amend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 7500 |
1 hour | 15000 |
1 day | 15000 |
Parameter | Values |
---|---|
action | amend |
params.order | The specified child order fields and the ones that need to be updated |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Amending the child order is similar to the child register action, except that when performing this action, we only need to set the updated fields and the order identifier. There are a few constraints when amending the child order: the parentId
, orderId
, clientOrderId
, side
or symbol
fields cannot be changed. Also, the broker
field can be changed only if the child order is still in register state (not sent to the broker).
Child Amend & Send
Use the
amendAndSend
action and specify the required order fields, along with the child order identifier:orderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "amendAndSend",
"params": {
"order": {
"orderId": "AAEWu1vsKJYAAABX", // or "clientOrderId" : "order_2018-11-14_1"
"limitPrice": "123.4"
}
}
});
The child order is amended and sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "amendAndSend",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 7500 |
1 hour | 15000 |
1 day | 15000 |
Parameter | Values |
---|---|
action | amendAndSend |
params.order | The specified child order fields and the ones that need to be updated |
params.skipAlgoParamValidation | Indicates if the ALGO parameters specified into params.order.workBrkSpecATDL should be validated or not. This flag is optional and the default value is false. |
Currently, only the limitPrice
field is eligible for this amendment. Specifying any other fields will be rejected.
Child Cancel
Use the
cancel
action and specify theorderId
orclientOrderId
socket.send({
"messageId": "2018-11-14_5",
"service": "orders",
"action": "cancel",
"params": {
"orderId": "U9W4IV0LOL8AB0JW"
// or
"clientOrderId" : "order_2018-11-14_1"
}
});
The child order is cancelled
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "cancel",
"messageReferenceId": "2018-11-14_5",
"data": {
"orderId": "U9W4IV0LOL8AB0JW"
// or
"clientOrderId" : "order_2018-11-14_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 12500 |
1 hour | 25000 |
1 day | 25000 |
Parameter | Values |
---|---|
action | cancel |
params.orderId | The child order with this ID will be cancelled |
params.clientOrderId | The child order having this client order ID will be cancelled |
This action is identical to the parent cancel one.
Manual Execution
Use the
manualExecution
action in order to create a manual execution as you would from the manual orders pad
// Send a manual fill
socket.send({
"messageId": "FUT-a7c822d-1",
"service": "orders",
"action": "manualExecution",
"params": {
"execution": {
"broker": "daiwa",
"brokerAccount": "BA1",
"clientOrderId": "FUT-a7c822d-1",
"condition": "NORMAL",
"orderType": "STLMT",
"price": 31222.35,
"quantity": 2,
"side": "BUY",
"specialInstruction": "Funari",
"symbol": "FUT.IDX.NK225.OS.JPY.202403",
"symbolType": "tora",
"brokerOrdTypeFlag": "cfd",
"settlementDate": "2023-12-18",
"fillTime": "2024-01-16T10:11:12.345Z",
"commission": 0.3,
"initiator": "initiatorWSGW FUT 1",
"fxRate": 13.4
}
});
//The successful action gets the following ack message
{
"messageId": "49bb2d7f-058f-4987-aacd-538005d3592f",
"service": "orders",
"event": "manualExecution",
"messageReferenceId": "FUT-a7c822d-1",
"data": {
"orderId": "AAAS7GV8AioAAACJ"
},
"status": {
"code": 0,
"message": "Ok"
}
}
//On the order subscription this update will be received
{
"messageId": "e58099f6-9f3b-494b-9b3b-2bd4a80fb197",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [
{
"orderId": "AAAS7GV8AioAAACO",
"clientOrderId": "FUT-a7c822d-1",
"isParent": false,
"parentId": "AAAS7GV8AioAAACJ",
"symbol": "FUT.IDX.NK225.OS.JPY.202403",
"exchange": "OS",
"broker": "daiwa",
"side": "BUY",
"quantity": 2.0,
"limitPrice": 31222.35,
"owner": "testuser",
"flowType": "DMA",
"brokerAccount": "BA1",
"state": "FILD",
"executedQuantity": 2.0,
"creationTime": "2023-12-15T07:42:35.508000Z",
"lastUpdateTime": "2023-12-15T07:42:35.920000Z",
"status": "OK",
"executedValue": 62444.7,
"notionalValue": 6.24447E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"condition": "NORMAL",
"orderType": "LIMIT",
"averagePrice": 31222.35,
"dayAvgPx": 31222.35,
"currentMarginFlag": "None",
"externalId": "FUT-a7c822d-1",
"lastUpdateOwner": "testuser",
"limitStatus": "APPR",
"manualExecution": "Y",
"margin": "None",
"brokerOrdTypeFlag": "cfd",
"creatorComponent": "WSGW",
"lastExecutedTime": "2023-12-08 10:11:12.345 UTC 678us",
"note": "Funari",
"originator": "testuser",
"pendingQuantity": 0.0,
"productNativeCode": "169030018",
"settlementDate": "2023-12-18 14:59:59.000 GMT 0us",
"strategyId": "AAAS7GV8AioAAACJ",
"strategyType": -1,
"isHidden": true
},
{
"orderId": "AAAS7GV8AioAAACJ",
"clientOrderId": "FUT-a7c822d-1",
"isParent": true,
"symbol": "FUT.IDX.NK225.OS.JPY.202403",
"exchange": "OS",
"broker": "daiwa",
"side": "BUY",
"quantity": 2.0,
"limitPrice": 31222.35,
"owner": "testuser",
"flowType": "DMA",
"brokerAccount": "BA1",
"state": "FILD",
"executedQuantity": 2.0,
"creationTime": "2023-12-15T07:42:34.283000Z",
"lastUpdateTime": "2023-12-15T07:42:35.920000Z",
"status": "OK",
"executedValue": 62444.7,
"notionalValue": 6.24447E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"condition": "NORMAL",
"orderType": "LIMIT",
"averagePrice": 31222.35,
"dayAvgPx": 31222.35,
"currentMarginFlag": "None",
"externalId": "FUT-a7c822d-1",
"lastUpdateOwner": "testuser",
"limitRequestId": "AAAS7GV8AioAAACQ",
"limitStatus": "APPR",
"manualExecution": "Y",
"margin": "None",
"brokerOrdTypeFlag": "cfd",
"creatorComponent": "WSGW",
"note": "Funari",
"originator": "testuser",
"pendingQuantity": 0.0,
"productNativeCode": "169030018",
"settlementDate": "2023-12-18 14:59:59.000 GMT 0us",
"childQuantity": 2.0
}
],
"isComplete": true
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | manualExecution |
params | See Execution Params |
Notes:
- creating a manual execution will create an order as well (parent or a child order if parentId is specified)
- some order params that make sense for a manual execution will apply (Order Fields)
Manual Execution Fields
Parameter | Type | Format | Description | GUI fields |
---|---|---|---|---|
allocationMethod | string | - | Specified allocation method for this order; can be either the predefined allocation method name, or it can be a custom allocation string | AllocationMethod |
bestExec | string | - | BestEx; Example values: Cost , Natur , Other , Price , Settlement , Size , Speed , etc |
BestEx |
broker | string | - | Order execution broker | Broker |
brokerAccount | string | - | Indicates the specified account a client has at a certain broker | BrokerAccount |
brokerOrdTypeFlag | string | - | Populated for orders flagged with a specific destination at the broker, shown as BrkFlag in GUI. Examples: prg , jmc , wap , etc |
BrkFlag |
clientOrderId | string | - | The client order identifier | |
condition | string | ENUM | The condition of the traded order. The possible conditions are: NORMAL , WORKED |
Condition |
fillTime | string | TIMESTAMP | Timestamp of the fill. Allowed format: ISO 8601 e.g. 2024-01-16T10:11:12.345Z |
Fill time |
fxRate | number | DEC | FXRate | FXRate |
initiator | string | - | Order initiator | Initiator |
note | string | - | Order note | Comments |
parentId | string | UUID | If the manual fill is for a child order, this will hold the parent order identifier. | Parent ID |
quantity | number | DEC | Order quantity | Quantity |
settlementDate | string | YYYY-MM-DD | Order settlement date | Settlement Date |
specialInstruction | string | - | Special order instruction; Possible values: NI , OnClose , OnOpen , Funari , etc |
Special instruction |
side | string | ENUM | Order side; possible values: BUY , SELL , BTC , SHORT , SSE |
Side |
symbol | string | - | Instrument symbol this order is traded. If the symbolType has value forex then the symbol field must contains the pair of FX currencies separated by slash / |
|
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora , forex ; if missing, defaults to tora |
|
synthType | string | - | Populated for the orders placed on a synthetic instrument. Examples: swp , cfd , etc, will be empty for normal orders |
SynthType |
tag | string | - | Order custom tag | Tag |
tradeBook | string | - | Indicates the specified tradebook for this order | Trade Book |
Order End Of Day events
// The orders are frozen
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [{
"orderId": "SUF/GlqBWG8AAq/j",
"isFrozen": true,
//..rest of the order fields
},
"orderId": "SUF/GlqBWG8AA/aa",
"isFrozen": true,
//..rest of the order fields
},
//..rest of the frozen orders
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
// The orders are cleared
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "test order subscription"
},
"data": {
"orders": [{
"orderId": "SUF/GlqBWG8AAq/j",
"isFrozen": true,
"isDeleted": true,
//..rest of the order fields
},
"orderId": "SUF/GlqBWG8AA/aa",
"isFrozen": true,
"isDeleted": true,
//..rest of the order fields
},
//..rest of the frozen orders
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
The Freeze
event resets intraday positions and marks eligible orders as frozen (all orders are eligible to be frozen, but the TIF orders). A frozen order has isFrozen: true
, and can still be found inside the system, but the actions allowed upon them are limited. Frozen orders do not allow any amends other than amending the: Trade Book
, Internal Account
, Broker Account
, User Comment
(and SOI
), Tag
, Allocation Method
, Commission
, Settlement Date
. Amending the allocation method on frozen orders results in re-allocation of the positions, exactly as it does for the regular/active orders.
Also, any incoming fill from the broker on a frozen order, will not be accepted. In case a fill will come from the broker on a frozen order, a warning will be triggered in the Monitor application, so that support will be able to contact the broker.
Position columns affected by the freeze event:
Name | Description |
---|---|
Position SOD | Current day start of day position |
Position Intraday | Current day intraday position (affected by orders traded throughout the day) |
Position EOD | Current day end of day position (sum of SOD + Intraday) |
T-1 Position SOD | Previous trading day start of day position |
T-1 Position Intraday | Previous trading day intraday position |
T-1 Position EOD | Previous trading day end of day position |
The Clear
event transfers positions to previous positions, and resets the intraday position, deleting frozen orders from the system. The order will be updated with isDeleted: true
, signaling its removal inside the OEMS.
At a Freeze
event, the orders will stop contributing to the calculations of the intraday position, and will be considered in the calculations of the Yesterday position. (also known as the Frozen position)
Position | Before Freeze | After Freeze |
---|---|---|
Intraday position | P1 | 0 |
T-1 Intraday position | P2 | P1 |
The Freeze
event is considered to be the end of the Trading day. This means that the start of day position needs to be ‘prepared’ for the next trading day. In order to accomplish this, the SOD position will need to reflect all the positions that were traded throughout the previous trading day, meaning that SOD position will become equal to the end of day position (New Current Day SOD = Old Current Day SOD + Old Current Day Intraday)
The newly calculated SOD position can be overwritten by the client’s SOD process (process that retrieves an SOD file from the client’s external system and applies the SOD values over the system’s calculated values).
Also, because the client still needs to see what his SOD was for the previous trading day, the current day start of day position will be copied over to the previous trading day start of day position.
Position | Before Freeze | After Freeze |
---|---|---|
Intraday position | P1 | 0 |
Intraday SOD | P2 | P2 + P1 |
T-1 Intraday position | P3 | P1 |
T-1 SOD | P4 | P2 |
Executions
Parameter | Values |
---|---|
service | executions |
The executions service provides information on the executions inside the system. The authenticated client can perform the execution actions detailed bellow:
- subscribe: the client is ready to receive updates on the executions that match the subscription filter
- unsubscribe: the client stops receiving updates on the executions that match the subscription filter
The multi-leg executions allow for much more granular tracking and reporting multi-part orders.
Execution Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "executions",
"action": "subscribe",
"params": {
"subscriptionId": "test execution subscription",
"symbolType": "tora"
}
});
The initial executions image is retrieved:
// First message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [...]
}
}
// Last message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [...],
"isComplete": "true"
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates on the executions that are present in the system.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora , forex ; if missing, defaults to tora |
filter | object | - | Instructs the orders service to return all the executions that match this filter |
Subscription Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "executions",
"event": "subscribe",
"params": {
"subscriptionId": "test execution subscription",
"symbolType": "tora"
},
"status": {
"code": 0,
"message": "Subscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "executions",
"event": "subscribe",
"params": {
"subscriptionId": "test execution subscription",
"symbolType": "tora"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Execution Updates
The initial execution image is retrieved:
// The initial image
{
"messageId": "bb60e356-b325-4ef3-bc5d-c75eb95697ef",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [{
"executionId": "AAAhkFwECXwAAACw",
"orderId": "SUF/GlqBWG8AAq/j",
"time": "2018-11-06T16:51:22.000Z",
"broker": "ml",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"quantity": 500,
"price": 6250.54,
"owner": "george"
},
{
"executionId": "AAAhkFwECXwAAAdi",
"orderId": "SUF/GlqBWG8AAq/j",
"time": "2018-11-06T16:51:25.000Z",
"broker": "ml",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"quantity": 200,
"price": 6250.54,
"owner": "george"
}
],
"isComplete": "true"
}
}
// Subsequent update
{
"messageId": "db744fdb-596c-4b52-b759-16e6f291b5e4",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [{
"executionId": "AAAhkFwECXwAAAdm",
"orderId": "SUF/GlqBWG8AAq/j",
"time": "2018-11-06T16:51:22.000Z",
"broker": "ml",
"side": "SELL",
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"quantity": 100,
"price": 6250.54,
"owner": "george"
}
]
}
}
//Execution for multi-leg order
{
"messageId": "8bea7199-c72f-4570-965b-3e91c18749de",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "execSubscriptionMsgIdUprDt2dQiekAAAAw"
},
"data": {
"executions": [
{
"executionId": "AAAhj2dQiwUAAAAS",
"orderId": "AAAJYWdQitkAAACJ",
"symbol": "SPR.FUT.ATW.IEU.USD.202810-3M",
"quantity": 1000.0,
"price": 10.0,
"time": "2024-12-04T17:02:32.000000Z",
"owner": "TestUser1",
"broker": "simu",
"side": "BUY",
"fixExecId": "headExecIdPartialFill",
"parentId": "AAAJYWdQitkAAAB8",
"originator": "TestUser1",
"currentSentQty": 1000.0,
"marginFlag": "None",
"lastModifiedTime": "1733331753072",
"orderExchange": "IEU",
"legs": [
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202812",
"side": "BUY",
"executions": [
{
"executionId": "AAAhj2dQiwUAAAAT0",
"fixExecId": "legExecIdATWMZ8UprDt2dQiekAAABP",
"price": 10.0,
"quantity": 1000.0
}
]
},
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202810",
"side": "BUY",
"executions": [
{
"executionId": "AAAhj2dQiwUAAAAU0",
"fixExecId": "legExecIdATWMV8UprDt2dQiekAAABR",
"price": 10.0,
"quantity": 1000.0
}
]
},
{
"symbol": "FUT.CMDT.ATWM.ICE.USD.202811",
"side": "BUY",
"executions": [
{
"executionId": "AAAhj2dQiwUAAAAV0",
"fixExecId": "legExecIdATWMX8UprDt2dQiekAAABT",
"price": 10.0,
"quantity": 1000.0
}
]
}
]
}
]
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.executions | The list of executions that were updated |
data.isComplete | Is set, and the value is true when the initial executions image transfer is complete |
Execution Fields
Parameter | Type | Format | Description | GUI Fields |
---|---|---|---|---|
executionId | string | UUID | Execution identifier | |
fixExecId | string | - | FIX execution id received from broker or executionId if this is a manual execution. |
|
fixExecRefId | string | - | FIX execution reference id provided by the broker or executionId of the canceled/corrected execution if the action was performed from GUI.Available only for canceled and corrected executions. |
|
orderId | string | UUID | Order identifier for which this execution is received | OrderID |
time | string | TIMESTAMP | Execution time | |
broker | string | - | Execution broker | Broker |
side | string | ENUM | Execution side. Possible values BUY , SELL , BTC , SHORT , SSE |
Side |
symbol | string | - | Instrument symbol this execution is received | |
quantity | number | DEC | Execution quantity | Quantity |
price | number | DEC | Execution price | Price |
owner | string | - | Order owner | Owner |
isFrozen | boolean | - | Indicated whether this execution was frozen during the EOD Events | |
isDeleted | boolean | - | Indicated whether this execution was removed from the system | |
isCanceled | boolean | - | Indicates whether this execution was canceled or corrected, either by the broker or manually from UI | |
isSuspended | boolean | - | Indicates whether this execution was suspended | |
isManual | boolean | - | Indicates whether this execution was manually added | Manual Flag |
legs | object | - | An object used to indicates the data fields of legs | |
legs -> name | string | - | Indicates the name of leg; possible values:near , far |
|
legs -> quantity | string | - | Indicates the quantity of leg. | |
legs -> settlementDate | string | yyyyMMdd | Indicates the settlement date of FXFWD/FXSWP's legs. | |
legs -> tenor | string | - | Indicates the tenor code used to indicate the settlement date of FXSWP's legs. If it is missing, then the settlementDate value can be used. Examples: SPOT , TOM , 1W , 6M , 5Y |
|
legs -> symbol | string | - | Instrument symbol this leg is received | |
legs -> side | string | ENUM | Execution side. Possible values BUY , SELL , BTC , SHORT , SSE |
Side |
legs -> executions | object | - | An object used to indicate the data fields of legs executions. | |
legs -> executions -> executionId | string | UUID | Leg execution identifier | |
legs -> executions -> fixExecId | string | - | FIX leg execution id received from broker or executionId if this is a manual execution. |
|
legs -> executions -> price | number | FLOAT | Leg execution price | Price |
legs -> executions -> quantity | number | FLOAT | Leg execution quantity | Quantity |
executionExchange | string | - | Provides the execution exchange | Execution Exchange |
execExtraFields | object | - | Extra information for this execution, fields as ExecutingBroker , TriggerExecId , FlowType , WorkedType , BrokerSpecific , BrokerSpecificATDL , BrokerSpecificStratATDL , ATDLDescription , CommissionType , CommissionAmt , CommissionCcy , Predicted |
|
note | string | - | Execution note | |
parentId | UUID | - | Parent order id for which this execution was received | |
originator | string | - | Order originator for which this execution was received | Originator |
currentSentQty | number | DEC | Remaining quantity at the exchange | |
marginFlag | string | - | The order margin flag. Possible values: missing, Open , Close |
|
qJump | string | - | Queue jump flag. Set to Y when this order jumped the queue |
|
lastModifiedTime | string | TIMESTAMP | Last modified time | |
counterPartyId | string | - | The identifier for the execution counter party | |
orderExchange | string | - | Order exchange | |
lastLiquidityIndicator | number | DEC | LAst liquidity indicator | |
lastCapacity | number | DEC | Last capacity |
Subscription filters
Subscribe for all executions:
socket.send({
"messageId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "executions",
"action": "subscribe",
"params": {
"subscriptionId": "test execution subscription - all executions",
"symbolType": "tora"
}
});
All executions are retrieved:
{
"messageId": "...",
"messageReferenceId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription - all executions"
},
"data": {
"executions": [...]
}
}
Subscribe for specific order's executions:
socket.send({
"messageId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "executions",
"action": "subscribe",
"params": {
"subscriptionId": "test execution subscription - specific executions",
"symbolType": "tora",
"filter": {
"orderId": "someOrderId"
}
}
});
All executions are retrieved:
{
"messageId": "...",
"messageReferenceId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription - specific executions"
},
"data": {
"executions": [...]
}
}
Filter Parameter | Values |
---|---|
orderId | Instructs the executions service to return all specific order's executions |
Execution End Of Day events
// The executions are frozen
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [{
"executionId": "SUF/GlqBWG8AAq/j",
"isFrozen": true,
//..rest of the execution fields
},
"executionId": "SUF/GlqBWG8AA/aa",
"isFrozen": true,
//..rest of the execution fields
},
//..rest of the frozen executions
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
// The executions are cleared
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "executions",
"event": "update",
"params": {
"subscriptionId": "test execution subscription"
},
"data": {
"executions": [{
"executionId": "SUF/GlqBWG8AAq/j",
"isFrozen": true,
"isDeleted": true,
//..rest of the execution fields
},
"executionId": "SUF/GlqBWG8AA/aa",
"isFrozen": true,
"isDeleted": true,
//..rest of the execution fields
},
//..rest of the frozen executions
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
In a similar manner we described for orders, the Freeze
event marks eligible executions as frozen. A frozen execution has isFrozen: true
, and can still be found inside the system.
Please note that any incoming fill from the broker on a frozen order, will not be accepted.
The Clear
event deletes frozen executions from the system. The execution will be updated with isDeleted: true
, signaling its removal inside the OEMS.
Positions
Parameter | Values |
---|---|
service | positions |
The positions service provides information on the positions inside the system. The authenticated client can perform the position actions detailed bellow:
- subscribe: the client is ready to receive updates on the positions that match the subscription filter
- unsubscribe: the client stops receiving updates on the positions that match the subscription filter
Positions are computed by a service in the back-end based on the provided subscription params.
Imagine you have a bunch of fields holding information, and you want to consolidate that based on some criteria: {key1: "a1", key2: "b1", value: 5} {key1: "a1", key2: "b2", value: 10} {key1: "a1", key2: "b1", value: 15}
If you subscribe with groupBy=["key1"], you will receive an update having the following data: [{key1: "a", value: 30}], but if you subscribe with groupBy=["key1", "key2"], you will receive the following data:[{key1: "a1", key2: "b1", value: 20},{key1: "a1", key2: "b2", value: 10}].
Position Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "positions",
"action": "subscribe",
"params": {
"subscriptionId": "test position subscription",
"symbolType": "tora",
"groupBy": [..]
}
});
The initial positions image is retrieved:
// First message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "positions",
"event": "update",
"params": {
"subscriptionId": "test position subscription"
},
"data": {
"positions": [...]
}
}
// Last message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "positions",
"event": "update",
"params": {
"subscriptionId": "test position subscription"
},
"data": {
"positions": [...],
"isComplete": "true"
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates on the positions that are present in the system, grouped according to the groupBy
specifications
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora , forex ; if missing, defaults to tora |
groupBy | list | - | Holds a list of values representing the criteria on which the positions will be aggregated; the values are: product , exchange , country , displayCode , ricCode , bbgCode , owner , broker , brokerAccount , internalAccount , tradebook , allocated , syntheticsFlag , tag |
Position subscriptions can be organized by grouping and splitting positions according to shared criteria with the groupBy
parameter provided in the subscription. Multiple groupings are allowed.
Option | Description |
---|---|
product | This is the default position grouping |
exchange | Receive position data further split out into one record per exchange |
country | Receive position data further split out into one record per country |
displayCode | Receive position data further split out into one record per display code |
ricCode | Receive position data further split out into one record per Reuters code |
bbgCode | Receive position data further split out into one record per Bloomberg code |
owner | Receive position data further split out into one record per order owner |
broker | Receive position data further split out into one record per broker |
brokerAccount | Receive position data further split out into one record per broker account |
internalAccount | Receive position data further split out into one record per internal account |
tradebook | Receive position data further split out into one record per trade book |
syntheticsFlag | Receive position data further split out into one record per synthetic flag |
tag | Receive position data further split out into one record per tag |
allocated | Receive position data further split out based on the assigned allocation methods. Please note that positions must also be grouped by the account identifier to which allocation methods are mapped (e.g. Broker Account, Internal Account, etc.) |
Subscription Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "positions",
"event": "subscribe",
"params": {
"subscriptionId": "test position subscription",
"symbolType": "tora",
"groupBy": [..]
},
"status": {
"code": 0,
"message": "Subscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "positions",
"event": "subscribe",
"params": {
"subscriptionId": "test position subscription",
"symbolType": "tora",
"groupBy": [..]
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Position Updates
The initial position image is retrieved:
// The initial image
{
"messageId": "bb60e356-b325-4ef3-bc5d-c75eb95697ef",
"service": "positions",
"event": "update",
"params": {
"subscriptionId": "test position subscription"
},
"data": {
"positions": [{
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"brokerAccount": "ARDITI",
"internalAccount": "hoarding",
"longPosition": 24000,
"realizedPL": 18546300.87,
"longPendingPosition": 300
},
{
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"brokerAccount": "ARDITI",
"internalAccount": "spending",
"shortPosition": 2500,
"realizedPL": 5180653.29,
"shortPendingPosition": 0
}
],
"isComplete": "true"
}
}
{
"messageId": "39ebb84c-e7c5-4c70-9c80-ce7c7b0cd242",
"service": "positions",
"event": "update",
"params": {
"subscriptionId": "test position subscribe"
},
"data": {
"positions": [{
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"brokerAccount": "DECIMA",
"internalAccount": "assault",
"longPosition": 24100,
"realizedPL": 18552501.73,
},
{
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"brokerAccount": "DECIMA",
"internalAccount": "amber",
"longPendingPosition": 200
}],
"isComplete": "true"
}
}
// Subsequent update
{
"messageId": "23388ad9-7600-4126-b49d-964149b9dfa5",
"service": "positions",
"event": "update",
"params": {
"subscriptionId": "test position subscribe"
},
"data": {
"positions": [{
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"brokerAccount": "DECIMA",
"internalAccount": "assault",
"longPosition": 24200,
"realizedPL": 18558801.31
}]
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.positions | The list of positions that were updated |
data.isComplete | Is set, and the value is true when the initial position image transfer is complete |
Position Fields
Parameter | Type | Format | Description | GUI Fields |
---|---|---|---|---|
allocated | string | - | Indicated the specified allocation method this position is grouped on; can be either the predefined allocation method name, or it can be a custom allocation string | |
broker | string | - | Position execution broker | Broker |
brokerAccount | string | - | Indicates the specified account at the broker this position is grouped on | BrokerAccount |
exchange | string | - | Position exchange | Ex |
internalAccount | string | - | Indicates the internal account this position is grouped on | Internal Account |
owner | string | - | Position owner | |
symbol | string | - | Instrument symbol this position is traded | |
syntheticsFlag | string | - | Provides the synthetic instrument code. Possible values are SWAP , CFD or empty . |
Synth Flag |
tag | string | - | Position custom tag | Tag |
tradeBook | string | - | Indicates the specified trade book this position is grouped on | Trade book |
borrowExecuted | number | DEC | Intra-day borrow position | BW Pos |
borrowSod | number | DEC | Start of day borrow position | BW SOD |
borrowEod | number | DEC | End of day borrow position, which is calculated as follows: borrowSod + borrowExecuted |
BW EOD |
borrowPending | number | DEC | Pending borrow position | BW Pend |
btcQuantity | number | DEC | Buy to cover quantity | |
pendingBtcPosition | number | DEC | The buy to cover pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
pendingBtcPositionComplete | number | DEC | The buy to cover pending position for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
longPosition | number | DEC | The long intra-day position, including buy to cover | Position |
shortPosition | number | DEC | The short intra-day position, including short sell | Position |
netPosition | number | DEC | The net value of the intra-day position, which is calculated as follows: longPosition - shortPosition |
Position |
startOfDayPosition | number | DEC | The position as of the start of day | SOD Position |
startOfDayNotionalUsd | number | DEC | The startOfDayPosition value in USD |
|
eodOfDayPosition | number | DEC | The end of day Position, which is calculated as follows: startOfDayPosition + netPosition |
EOD Position |
shortSellQuantity | number | DEC | The short sell position | |
btcQuantity | number | DEC | The buy to cover position | |
netValue | number | DEC | The net value of this position, which is calculated as follows: grossValue + cost |
|
longNotional | number | DEC | The value of the longPosition , which is calculated as follows: longPosition * longAvgPx |
Long Notional |
shortNotional | number | DEC | The value of the shortPosition , which is calculated as follows: shortPosition * shortAvgPx |
Short Notional |
realizedPL | number | DEC | The sum of next values: value resulted from offsetting startOfDayPosition against netPosition using SOD Price (if there is no SODPrice, the BasePrice is used; if there is no BasePrice either, the ClosePrice is used) and using dayAvgPx (Long AVG or Short AVG, depends on the SOD, if it is Short or Long); value resulted from offsetting positions longPosition against shortPosition (what was left from offsetting SOD) using Day ShortAVGprice and Day LongAVGprice; value of Cost |
Realized P&L |
totalPL | number | DEC | The sum of next values: value resulted from closing position longPosition (with Long Avg Price) at current LastPx; value resulted from closing position shortPosition (with Short Avg Price) at current LastPx; value resulted from closing position SOD (with SOD Price or LastClosePx if not provided by user) at current LastPx. |
Total P&L |
unrealizedPL | number | DEC | The value computed as follows: totalPL - realizedPL |
Unrealized P&L |
closePrice | number | DEC | The close price for the traded product | ClosePx |
buyPosition | number | DEC | The intra-day buy position, computed as follows: longPosition - btcQuantity |
|
buyPendingPosition | number | DEC | The buy (excluding buy to cover) pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
buyPendingValue | number | DEC | The buyPendingPosition value |
|
sellPosition | number | DEC | The intra-day sell position, computed as follows: shortPosition - shortSellQuantity |
|
sellPendingPosition | number | DEC | The sell (excluding short sell) pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
sellPendingValue | number | DEC | The sellPendingPosition value |
|
navPercent | number | DEC | The value for the position that is calculated according to the allocation method. The value displayed is calculated as MarketValue/(fund1_nav + fund2_nav + ...) | NAV % |
intraDayPL | number | DEC | The P&L for the intra-day position, which does not include the SOD. IntradayP&L = (LongPosition * (longAvgPx - LastPx) * Multiplier) + (ShortPosition * (LastPx - ShortAvgPx) * Multiplier) + Cost | Intraday P&L |
longPendingPosition | number | DEC | The buy (including BTC) pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
longPendingPositionComplete | number | DEC | The buy (including BTC) pending position for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
longPendingValue | number | DEC | The value of the longPendingPosition for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
longPendingValueComplete | number | DEC | The value of the longPendingPosition for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
shortPendingPosition | number | DEC | The sell (including short sell) pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
shortPendingPositionComplete | number | DEC | The sell (including short sell) pending position for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
shortPendingValue | number | DEC | The value of the shortPendingPosition for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
shortPendingValueComplete | number | DEC | The value of the shortPendingPosition for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
shortSellPendingPosition | number | DEC | The short sell pending position for orders at exchange (SENT , PSEN , PAMD , PCAN ) |
|
shortSellPendingPositionComplete | number | DEC | The short sell pending position for all orders (SENT , PSEN , PAMD , PCAN , REDG ) |
|
longCostValue | number | DEC | Commission resulted from building the longPosition . Calculated as sum for each trade: trade_shares * CostPerShare + trade_value * BpsCost |
Cost |
shortCostValue | number | DEC | Commission resulted from building the shortPosition . Calculated as sum for each trade: trade_shares * CostPerShare + trade_value * BpsCost |
Cost |
multiplier | number | DEC | Multiplier for the instrument of the position | |
usdValue | number | DEC | The value of this position in USD | |
cfdSod | number | DEC | CFD for the start of day | |
cfdEod | number | DEC | CFD for the end of day | |
settledQty | number | DEC | SOD position which has been settled intra-day | settledpos |
lastPrice | number | DEC | The last price of the symbol on which the order was created | LastPx |
Analytics
Parameter | Values |
---|---|
service | analytics |
The analytics service provides information on the execution performance for the orders inside the system. The authenticated client can perform the execution actions detailed bellow:
- subscribe: the client is ready to receive updates on the analytical data that matches the subscription filter
- unsubscribe: the client stops receiving updates on the analytical data that matches the subscription filter
Analytics Subscription
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates with analytical data computed for the orders that are present in the system.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters - Symbol Based
// Subscribe for analytical data based on symbol and time interval
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "analytics",
"action": "subscribe",
"params": {
"subscriptionId": "test analytics subscription - symbol",
"symbolType": "tora"
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"startTime": "2019-01-06T16:34:41.000Z",
"endTime": "2019-01-07T03:15:22.000Z"
}
});
// Reply
{
"messageId": "351010c3-bc38-4b40-8ff2-d6f669399cd5",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "analytics",
"event": "subscribe",
"params": {
"subscriptionId": "test analytics subscription - symbol",
"symbolType": "tora"
"symbol": "CS.NULL.JAPAN.SP.JPY.1449",
"startTime": "2019-01-06T16:34:41.000Z",
"endTime": "2019-01-07T03:15:22.000Z"
},
"status": {
"code": 200,
"message": "Subscribe OK."
}
}
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora ; if missing, defaults to tora |
symbol | string | - | Instructs the orders service to return all the executions that match this filter |
startTime | string | TIMESTAMP | Instructs the analytics service to provide data computed for an interval that begins with this timestamp |
endTime | string | TIMESTAMP | Instructs the analytics service to provide data computed for an interval that ends with this timestamp; this parameter is not required, and if it is not present, the analytics data will be updated each time a new trade occurs |
Subscription Parameters - Order Based
// Subscribe for analytical data based on order
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "analytics",
"action": "subscribe",
"params": {
"subscriptionId": "test analytics subscription - order",
"orderId": "..."
"useRegisterTime": true,
//"useAlgoStartTime": true,
"untilClose": true,
"includeOTCTrades": "false"
}
});
// Reply
{
"messageId": "351010c3-bc38-4b40-8ff2-d6f669399cd5",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "analytics",
"event": "subscribe",
"params": {
"subscriptionId": "test analytics subscription - order",
"orderId": "..."
"useRegisterTime": true,
//"useAlgoStartTime": true,
"untilClose": true,
"includeOTCTrades": "false"
},
"status": {
"code": 200,
"message": "Subscribe OK."
}
}
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
orderId | string | - | The order id for which we subscribe for analytics data |
userRegisterTime | boolean | - | Start computing analytics data starting from the moment the order was Registered in the system; if this property is missing and any other options are missing, this is defaulted to true |
userAlgoStartTime | boolean | - | Instructs the analytics service to provide data computed for an interval that begins with the algo start time which was set on the order |
untilClose | boolean | - | Instructs the analytics service to provide data computed for an interval that ends with the market close time; this parameter is not required, and if it is not present, the analytics data will be computed for as long as the order is live |
includeOTCTrades | boolean | - | Instructs the analytics service to include in the computed data the orders that were traded on OTC instruments. If this property is missing, it will be considered false |
Analytics Updates
{
"messageId": "351010c3-bc38-4b40-8ff2-d6f669399cd5",
"messageReferenceId": "9817706c-c941-4d04-97dd-df77f1a4aecb",
"service": "analytics",
"event": "update",
"params": {
"subscriptionId": "test analytics subscribe"
},
"data": {
"vwap": 5820.35,
"accumulated": 656543435
}
}
{
"messageId": "107864dc-92fa-4c0d-aff3-c605a85bfa73",
"messageReferenceId": "9817706c-c941-4d04-97dd-df77f1a4aecb",
"service": "analytics",
"event": "update",
"params": {
"subscriptionId": "test analytics subscribe"
},
"data": {
"vwap": 5820.38,
"accumulated": 656546835
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.vwap | The volume weighted average price (VWAP), representing a trading benchmark used to validate the performance of the trade |
data.accumulated | Represents the accumulated volume and holds the total volume traded for the symbol during the time specified in the parameters |
Trading Capabilities
Parameter | Values |
---|---|
service | tradingcapabilities |
The trading capabilities service provides information on the user valid actions. The authenticated client can query the capabilities:
- subscribe: the client is ready to receive the available trading capabilities
- unsubscribe: the client stops receiving updates on the available trading capabilities
Capabilities Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "tradingcapabilities",
"action": "subscribe",
"params": {
"subscriptionId": "test capabilities subscription"
}
});
Request is successful, the returned JSON is similar to:
{
"messageId": "a45a5ecf-b0ac-4d37-a0e6-386d10b6dbf2",
"service": "tradingcapabilities",
"event": "update",
"params": {
"subscriptionId": "6"
},
"data": {
"tradingcapabilities": [
{
"group": "BDornean",
"user": "bdornean",
"brokerCountryModeling": {
"markets": [
"CS.NULL.HKG.*.*"
],
"flows": [
"DMA"
],
"brokers": [
"phill",
"unspec"
],
"filters": [
{
"field": "MARKET",
"values": [
"CS.NULL.HKG.*.*"
],
"allowed": [
{
"field": "FLOW",
"values": [
"DMA"
],
"allowed": [
{
"field": "BROKER",
"values": [
"phill",
"unspec"
],
"allowed": [
{
"field": "BROKER_FLAGS",
"values": [
"prg", "aut"
],
"defaultValue": "prg",
"mandatory": true
},
{
"field": "SYNTH_FLAGS",
"values": [
"cfd", "swp"
],
"defaultValue": "swp",
"mandatory": false
},
{
"field": "OPEN_CLOSE",
"values": [
"OPEN", "CLOSE"
],
"defaultValue": ""
}
]
}
]
}
]
}
]
},
"accountModel": {
"brokerAccounts": [
"QII_Main",
],
"tradebooks": [
"trdx",
"trdy",
"tb1",
],
"internalAccounts": [
"acc2",
"acc1",
],
"filters": [
{
"field": "MARKET",
"values": [
"CS.NULL.HKG.*.*"
],
"allowed": [
{
"field": "INTERNAL_ACCOUNT",
"values": [
"IA1",
"IA2"
],
"allowed": [
{
"field": "TRADEBOOK",
"values": [
"TB1"
],
"allowed": [
{
"field": "ALLOCATION_METHOD",
"values": [
"AM1"
],
"allowed": [
{
"field": "BROKER_ACCOUNT",
"values": [
"BA1"
],
"allowed": [
{
"field": "BROKER",
"values": [
"msdw",
"gs",
"ml"
],
"defaultValue": "ml"
}
]
}
]
}
]
}
]
}
]
}
]
},
"allocationInfo": {
"allocationMethods": [
{
"code": "N100",
"exportId": "n100",
"Description": "100% to nomu",
"Definition": "!!%A00(!!%D00)"
},
{
"code": "N-G50-50",
"exportId": "ng5050",
"Description": "50% to gs, 50% to nomu",
"Definition": "!!%A00(!!%D50C50)"
},
{
"code": "G100",
"exportId": "g100",
"Description": "100% to gs",
"Definition": "!!%A00(!!%D00)"
}
]
},
"tradingRights": {
"register": false,
"send": false,
"amend": false,
"cancel": false
}
}
]
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "tradingcapabilities",
"event": "subscribe",
"params": {
"subscriptionId": "test capabilities subscription"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive the available trading capabilities
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
Subscription Reply
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Capability Data
Parameter | Type | Format | Description |
---|---|---|---|
tradingcapabilities | list | - | Holds the list of tradingcapability objects, the returned results matching the specified parameters. |
tradingcapabilities[].tradingcapability | object | - | The object holding trading capability data. |
tradingcapability.group | string | - | The group this trading capability object refers to |
tradingcapability.user | string | - | The user this trading capability object refers to |
tradingcapability.brokerModeling | object | - | The object holding data regarding the brokers, markes, flows the user has access |
brokerModeling.markets[] | list | - | Holds the full list of markets current user has access to |
brokerModeling.flows[] | list | - | Holds the full list of flows current user has access to |
brokerModeling.brokers[] | list | - | Holds the full list of brokers current user has access to |
brokerModeling.filters[] | list | - | Holds the list of filters which limit the availability of flows and brokers for a certain market |
brokerModeling.filters[].filter | object | - | Holds the broker/market/flow filtering information |
filter.field | string | - | Holds the field for which this filter applies to. Allowed values are: MARKET , FLOW , BROKER , BROKER_FLAGS , SYNTH_FLAGS , OPEN_CLOSE |
brokerModeling.filters[].filter.values | list | - | Holds the list of values in the field for which the filter applies |
brokerModeling.filters[].filter.allowed | list | - | Holds the list of objects of type filter by which values for other fields can be filtered in case the value selected for current field matches the values from the list brokerModeling.filters[].filter.values |
tradingcapability.accountModel | object | - | The object holding data regarding the broker accounts, tradebooks, internal accounts the user has access |
accountModel.brokerAccounts[] | list | - | Holds the full list of broker accounts current user has access to |
accountModel.tradebooks[] | list | - | Holds the full list of tradebooks current user has access to |
accountModel.internalAccounts[] | list | - | Holds the full list of internal accounts current user has access to |
accountModel.filters[] | list | - | Holds the list of filters which limit the availability of flows and brokers for a certain market |
accountModel.filters[].filter | object | - | Holds the broker/market/flow/brokerAccount/internalaccount/tradebook filtering information |
accountModel.filters[].filter.field | string | - | Holds the filed for which this fielter applies to. Allowed values are: BROKER_ACCOUNT , INTERNAL_ACCOUNT , TRADEBOOK , BROKER , MARKET , ALLOCATION_METHOD , FLOW |
accountModel.filters[].filter.values | list | - | Holds the list of values in the field for which the filter applies |
accountModel.filters[].filter.allowed | list | - | Holds the list of objects of type filter by which values for other fields can be filtered in case the value selected for current field matches the values from the list .brokerModeling.Filters[].filter.values |
tradingcapability.allocationInfo | object | - | The object holding data regarding the allocation info |
allocationInfo.allocationMethods[] | list | - | Holds the full list of allocation method that current user has access to. |
tradingRights | object | - | Holds the trading rights for current user |
Products
Parameter | Values |
---|---|
service | product |
The product service provides information on the products.
Get Product Details
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "product",
"action": "get-product-details",
"params": {
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"symbolType": "tora"
}
});
Request is successful, the returned JSON is similar to:
{
"messageId": "f1d8d3f6-7511-4ef3-a0cc-b8987cfc7aea",
"service": "product",
"event": "get-product-details",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"data": {
"ISINCode": "JP3990600003",
"OLDSECTION": "1",
"averageVolume": {
"5WD": "49860.0",
"5_10WD": "32300.0",
"100WD": "35194.0",
"6M": "35692.0",
"3M": "40973.4375",
"10WD": "41080.0",
"20WD": "47115.0",
"30WD": "46840.0",
"90WD": "35798.88888888889"
},
"bbgCode": "6298 JT Equity",
"closePrice": {
"YTD": "35692.0",
"3M": "35798.88888888889",
"12M": "35692.0",
"1M": "46840.0",
"6M": "35692.0"
},
"code": "6298",
"country": "JPN",
"crtTradeMarket": "CS.NULL.JAPAN.T.JPY",
"currency": "JPY",
"displayCode": "6298",
"gics": "45301010",
"highPrice": {
"YTD": "35692.0",
"3M": "35798.88888888889",
"1M": "46840.0",
"12M": "35692.0",
"6M": "35692.0"
},
"isShortSell": "F",
"lastPrice": "0.0",
"lastTouch": "1567646711162",
"lotSize": "100",
"lowPrice": {
"YTD": "35692.0",
"3M": "35798.88888888889",
"12M": "35692.0",
"1M": "46840.0",
"6M": "35692.0"
},
"market": "CS.NULL.JAPAN.T.JPY",
"marketCap": "1.000695663167022E9",
"multiplier": "1",
"name": "L T D LTD",
"nativeLanguage": "JP%7C%3F%3F%3F%3F%3F%3F%28%3F%29",
"primaryExchange": "CS.NULL.JAPAN.T.JPY",
"reutersCode": "6298.T",
"section": "Tokyo SE 1st Section",
"sedolCode": "6984454",
"settlementDateOffset": "2",
"sharesOutstanding": "1132521.0",
"tickRule": ",3000.0,1.0;,5000.0,5.0;,30000.0,10.0;,50000.0,50.0;,300000.0,100.0;,500000.0,500.0;,3000000.0,1000.0;,5000000.0,5000.0;,30000000,10000.0;,50000000,50000.0;,,100000.0;",
"tradingMarkets": [
"CS.NULL.JAPAN.CLP.JPY",
"CS.NULL.JAPAN.INJ.JPY",
"CS.NULL.JAPAN.JPC.JPY",
"CS.NULL.JAPAN.T.JPY",
"CS.NULL.JAPAN.JNX.JPY"
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
Parameter | Values |
---|---|
action | get-product-details |
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Get Product Details Parameters
Parameter | Type | Format | Description |
---|---|---|---|
symbol | string | - | The code of the product that you want the details. |
symbolType | string | - | The type of the symbol used for search. Possible values: caspian , bloomberg , reuters , tora ; |
Get Product Details Reply
Parameter | Type | Format | Description |
---|---|---|---|
product details | Object | - | Holds the properties of the product matching the specified parameters. |
Compliance
Parameter | Values |
---|---|
service | compliances |
The compliances service provides information on the compliance status for the orders:
- subscribe: the client is ready to receive compliance notifications
- unsubscribe: the client stops receiving compliance notifications
- approval decision: the client sends approval decision
- approval response: the client sends approval response
Compliance Subscription
socket.send({
"messageId": "2018-12-20_2",
"service": "compliances",
"action": "subscribe",
"params": {
"subscriptionId": "s_1",
"symbolType": "tora"
}
});
Subscription reply
{
"messageId": "f80216bd-a6d2-43b0-8950-4f7fdde1455b",
"service": "compliances",
"event": "subscribe",
"messageReferenceId": "2018-12-20_2",
"params": {
"subscriptionId": "s_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
// Receiving initial update
{
"messageId": "c68d828c-14fc-42b3-9a5c-f652151f5d8f",
"service": "compliances",
"event": "update",
"params": {
"subscriptionId": "s_1"
},
"data": {
"complianceViolations": [...]
},
"isComplete": true
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive the compliance notifications
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Compliance Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: bloomberg , reuters , tora ; if missing, defaults to tora |
Subscription Reply
Request is successful, the returned JSON is similar to:
Received: {
"messageId": "aac7043b-4c4f-4ecc-984f-a4d0abd51d5e",
"service": "compliances",
"event": "subscribe",
"messageReferenceId": "2018-12-18_2",
"params": {
"subscriptionId": "s_1"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "compliances",
"event": "subscribe",
"params": {
"subscriptionId": "s_1"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Notification Data
{
"messageId": "c68d828c-14fc-42b3-9a5c-f652151f5d8f",
"service": "compliances",
"event": "update",
"params": {
"subscriptionId": "s_1"
},
"data": {
"complianceViolations": [
{
"complianceViolationId": "AAAF51wcrtwAAAFC",
"state": "pending response",
"initiatorUser": "illyes",
"complianceViolatingOrders": [
{
"orderId": "UA0M9Fwcr1wAAFgn",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6758",
"quantity": 300,
"action": "Amend",
"violatedComplianceGroup": {
"protocol": "Warning",
"violatedCompliances": [
{
"limitName": "NettingExpressionBasedLimit",
"limitTemplateName": "Expression Based 1",
"message": "No Limit",
"extraLabels": [
{
"label": "Order",
"value": "300.00 shs Fund1"
},
{
"label": "Limit",
"value": "100.00 shs Fund1"
}
],
"suggestions": [
{
"field": "QUANTITY",
"oldValue": "300.0",
"newValue": "100.0"
}
]
}
]
},
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-21T09:27:12.327000Z",
"status": "approved"
}
}
]
},
{
"complianceViolationId": "AAAF51wbsxUAAAM+",
"state": "pending decision",
"initiatorUser": "TestUser3",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHAb",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6383",
"quantity": 1700,
"action": "Amend",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
}
}
]
},
{
"complianceViolationId": "AAAF51wbsxUAAANO",
"state": "pending response",
"initiatorUser": "illyes",
"complianceViolatingOrders": [
{
"orderId": "TDPN41wbsyMAAF69",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6758",
"quantity": 2100,
"action": "Send",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
},
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-20T15:48:49.974000Z",
"status": "approved"
}
}
]
},
{
"complianceViolationId": "AAAF51wbsxUAAAJA",
"state": "history",
"initiatorUser": "TestUser3",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAGtg",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6383",
"quantity": 2100,
"action": "Register",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
},
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-20T15:39:17.515000Z",
"status": "approved"
}
}
]
},
"isComplete": true
}
}
Subsequent updates:
{
"messageId": "f0726632-bdcc-43fb-bf53-e38d77415fa1",
"service": "compliances",
"event": "update",
"params": {
"subscriptionId": "s_1"
},
"data": {
"complianceViolations": [
{
"complianceViolationId": "AAAF51wbsxUAAAOW",
"state": "pending decision",
"initiatorUser": "TestUser3",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHDM",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6383",
"quantity": 1900,
"action": "Amend",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
}
}
]
}
]
}
}
Parameter | Type | Format | Description |
---|---|---|---|
complianceViolations[] | list | - | Holds a list of compliance violation objects |
complianceViolations[].complianceViolation | object | - | The object holding compliance violation data |
complianceViolation.complianceViolationId | string | - | Compliance violation identifier used inside the OEMS |
complianceViolation.userComment | string | - | User comment set on approval response |
complianceViolation.seniorComment | string | - | User comment set by approval user on approval decision / approval response |
complianceViolation.state | string | ENUM | The state of the compliance violation. Supported values: pending decision , pending response , history |
complianceViolation.initiatorUser | string | - | User that initiated the action which caused the compliance violation |
complianceViolation.complianceViolatingOrders[] | list | - | Array of orders that are violating compliances along with the decision taken by the user |
complianceViolatingOrders[].complianceViolatingOrder | object | - | Details of an order that violdated some compliances along with the decision taken by the user |
complianceViolatingOrder.orderId | string | - | Order identifier used inside the OEMS |
complianceViolatingOrder.broker | string | - | The broker assigned to this order |
complianceViolatingOrder.exchange | string | - | The exchange assigned to this order |
complianceViolatingOrder.side | string | ENUM | The side of the order: BUY , SELL |
complianceViolatingOrder.symbol | string | - | The symbol on which the order was created; tora , bloomberg , reuters symbol types are currently supported |
complianceViolatingOrder.quantity | number | DEC | The order quantity |
complianceViolatingOrder.price | number | DEC | The order price |
complianceViolatingOrder.action | string | - | The action on order that triggered the compliance violation (e.g. Register, Amend, Send) |
complianceViolatingOrder.violatedComplianceGroup | object | - | The list of violated compliances and their general protocol |
violatedComplianceGroup.protocol | string | ENUM | The general protocol of the compliance violation: Warning , Approval , Reject |
violatedComplianceGroup.violatedCompliances[] | list | - | The list of violated compliances |
violatedCompliances[].violatedCompliance | object | - | Details about the compliance violated: limitName, limitTemplateName, etc |
violatedCompliance.limitName | string | - | The name of the limit that was breached |
violatedCompliance.limitTemplateName | string | - | The name of the template in which the limit is defined |
violatedCompliance.message | string | - | A message for the user explaining the limit breach |
violatedCompliance.details | string | - | More details about the limit breach. By default this message shouldn’t be displayed. The user should have the posibility to expand and see the details. |
violatedCompliance.extraLabels[] | list | - | Additional information about the limit breach. To be displayed as label:value pairs |
extraLabels[].extraLabel | object | - | Pair of label and value with additional information about the limit breach |
extraLabel.label | string | - | The label of the extra info |
extraLabel.value | string | - | The value of the extra info |
violatedCompliance.suggestions[] | list | - | Amend suggestions to be displayed for the user |
suggestions[].suggestion | object | - | Suggestion to amend a given field |
suggestion.field | string | - | The name of the field to for which the amend suggestion is displayed |
suggestion.oldValue | string | - | The old value of the field to for which the amend suggestion is displayed |
suggestion.newValue | string | - | The new value of the field to for which the amend suggestion is displayed |
complianceViolatingOrder.decision | object | - | Decision taken by the user for the compliance violation |
complianceViolatingOrder.decision.decisionMaker | string | - | The user that made the decision |
complianceViolatingOrder.decision.decisionTime | string | TIMESTAMP | The time when the decision was made |
complianceViolatingOrder.decision.status | string | ENUM | The status of the taken decision: approved , denied |
Approval decision
socket.send({
"messageId": "2018-12-20_2",
"service": "compliances",
"action": "approval decision",
"params": {
"complianceViolation": {
"complianceViolationId": "AAAF51wbsxUAAAOW",
"seniorComment": "senior approval decision comment",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHDM",
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-18T08:38:20.947111Z",
"status": "approved"
}
}
]
}
}
});
This generates the following update:
{
"messageId": "6899ec7c-94ec-420e-826e-01cf12dad18d",
"service": "compliances",
"event": "update",
"params": {
"subscriptionId": "s_1"
},
"data": {
"complianceViolations": [
{
"complianceViolationId": "AAAF51wbsxUAAAOW",
"state": "pending response",
"status": "pending response",
"initiatorUser": "TestUser3",
"seniorComment": "senior approval decision comment",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHDM",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6383",
"quantity": 1900,
"action": "Send",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
},
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-18T08:38:20.947000Z",
"status": "approved"
}
}
]
}
]
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10000 |
1 hour | 20000 |
1 day | 20000 |
If a hard limit is triggered, the originating user is notified to either cancel the order or to add the order to the Compliance Queue to await a decision from an approval user.
The approval user can set a status to approved
or denied
and also add a comment on the approval decision (seniorComment).
Approval response
socket.send({
"messageId": "2018-12-20_3",
"service": "compliances",
"action": "approval response",
"params": {
"complianceViolation": {
"complianceViolationId": "AAAF51wbsxUAAAOW",
"userComment": "user approval response comment",
"seniorComment": "senior approval decision comment",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHDM",
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-18T08:38:20.947111Z",
"status": "approved"
}
}
]
}
}
});
This generates the following update:
{
"messageId": "9696daa5-3b8f-4a72-92fc-29322c68410e",
"service": "compliances",
"event": "update",
"params": {
"subscriptionId": "s_1"
},
"data": {
"complianceViolations": [
{
"complianceViolationId": "AAAF51wbsxUAAAOW",
"state": "history",
"status":"history",
"initiatorUser": "TestUser3",
"userComment": "user approval response comment",
"seniorComment": "senior approval decision comment",
"complianceViolatingOrders": [
{
"orderId": "TDbljlwbs+4AAHDM",
"broker": "daiwa",
"exchange": "T",
"side": "BUY",
"symbol": "CS.NULL.JAPAN.T.JPY.6383",
"quantity": 1900,
"action": "Send",
"violatedComplianceGroup": {
"protocol": "Approval",
"violatedCompliances": [
{
"limitName": "Quantity",
"message": "The order quantity exceeds the maximum number of lots."
}
]
},
"decision": {
"decisionMaker": "illyes",
"decisionTime": "2018-12-18T08:38:20.947000Z",
"status": "approved"
}
}
]
}
]
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10000 |
1 hour | 20000 |
1 day | 20000 |
In the latter case, the approval user is notified and can then Approve or Deny a compliance limit violation. The original user can also Cancel the pending request at any time before an approval user makes a decision, thereby canceling the order and the approval request. On the approval response the user can set a comment (userComment). Here we can have both the seniorComment and the userComment (if the user does not have the auto approve rights).
In this example, the decisionMaker approved this compliance violation and the order will change to state APPR
and will be registered
, sent
or amended
Note: In case a limit is triggered with REJECT protocol - the Limit Server sets the reject message on the seniorComment.
Borrow
Parameter | Values |
---|---|
service | borrow |
The borrow service provides information on the borrow orders inside the system. The authenticated client can perform the following borrow orders actions
- subscribe : the client is ready to receive updates on the borrow orders that match the subscription filter
- unsubscribe : the client stops receiving updates on the borrow orders that match the subscription filter
- create: create a borrow order and send it to broker
Borrow Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "borrow",
"action": "subscribe",
"params": {
"subscriptionId": "test_borrow_subscription",
"symbolType": "tora"
}
});
The initial borrow order image is retrieved:
// First message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"data": {
"orders": [...]
}
}
// Last message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"data": {
"orders": [...],
"isComplete": "true"
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates on the borrow orders that are present in the system.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
symbolType | string | ENUM | Specifies the listing symbol used for this subscription. Possible values: caspian , bloomberg , reuters , tora ; if missing, defaults to tora |
filter | object | - | Instructs the borrow service to return all the orders that match this filter |
Subscription Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "borrow",
"event": "subscribe",
"params": {
"subscriptionId": "test_borrow_subscription",
"symbolType": "tora"
},
"status": {
"code": 0,
"message": "Subscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "borrow",
"event": "subscribe",
"params": {
"subscriptionId": "test_borrow_subscription",
"symbolType": "tora"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Borrow Unsubscribe
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "borrow",
"action": "unsubscribe",
"params": {
"subscriptionId": "test_borrow_subscription"
}
});
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "borrow",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"status": {
"code": 0,
"message": "Unsubscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "borrow",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"status": {
"code": 201,
"message": "Invalid unsubscribe request: <reason>."
}
}
Parameter | Values |
---|---|
action | unsubscribe |
params.subscriptionId | The subscription id for which the client doesn't need to receive any more updates |
The client requests not to receive any more updates for the specified subscription.
Borrow Updates
The initial borrow order image is retrieved:
// The initial image
{
"messageId": "bb60e356-b325-4ef3-bc5d-c75eb95697ef",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"data": {
"orders": [{
"orderId": "Ww0Y42Fe/TIAABKk",
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"exchange": "T",
"currency": "JPY",
"state": "NEW",
"brokerAccount": "C1",
"internalAccount": "S1",
"tradeBook": "F1",
"broker": "ubs",
"primeBroker": "gs",
"originator": "user1",
"userNote": "user+note",
"requestedQuantity": 800,
"rate": 0.7,
"value": 691200,
"lastModifiedTime": "2021-10-07T14:11:02.757000Z",
"timestamp": "2021-10-07T14:11:02.757000Z"
}
],
"isComplete": "true"
}
}
// Subsequent update
{
"messageId": "db744fdb-596c-4b52-b759-16e6f291b5e4",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription"
},
"data": {
"orders": [{
"orderId": "Ww0Y42Fe/TIAABKk",
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"exchange": "T",
"currency": "JPY",
"state": "APPROVED",
"brokerAccount": "C1",
"internalAccount": "S1",
"tradeBook": "F1",
"broker": "ubs",
"primeBroker": "gs",
"originator": "user1",
"userNote": "user+note",
"requestedQuantity": 800,
"rate": 0.7,
"value": 691200,
"lastModifiedTime": "2021-10-07T14:11:02.757000Z",
"timestamp": "2021-10-07T14:11:02.757000Z"
}
]
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.orders | The list of borrow orders that were updated |
data.isComplete | Is set, and the value is true when the initial borrow orders image transfer is complete |
Borrow Order Fields
Parameter | Type | Format | Description |
---|---|---|---|
orderId | string | UUID | Order identifier for the borrow order |
clientOrderId | string | - | The client order identifier |
symbol | string | - | Instrument symbol for the borrow order |
exchange | string | - | Provides the borrow order exchange |
currency | string | - | Provides the order currency |
state | string | ENUM | Provides the order state : NEW , PENDING , APPROVED , REJECTED , APPROVED_QUANTITY_CHANGED , APPROVED_PRICE_CHANGED , CANCELLED , PENDING_CANCEL |
orderType | string | ENUM | Type of this order: NORMAL , AUTO-APPROVE , UNSOLICITED , MANUAL |
requestedQuantity | number | DEC | Requested borrow quantity |
approvedQuantity | number | DEC | Approved borrow quantity |
rate | number | DEC | Borrow rate |
value | number | DEC | Borrow value |
brokerAccount | string | - | Indicates the specified account a client has at a certain broker |
internalAccount | string | - | Indicates the internal account selected for this order |
tradeBook | string | - | Indicates the specified tradebook for this order |
broker | string | - | Provides the order broker |
primeBroker | string | - | Provides the order prime broker |
originator | string | - | Provides the originator |
decider | string | - | Provides the decider |
brokerNote | string | - | Provides the broker note |
userNote | string | - | Provides the user note |
allocationMethod | string | - | Specified allocation method for this order; can be either the predefined allocation method name, or it can be a custom allocation string |
groupingId | string | - | Grouping identifier for orders that are part of a group |
groupingType | string | - | Grouping type for orders that are part of a group; possible values: PAIR , CROSS , AGGREGATION |
syntheticsFlag | string | Provides synthetic flag | |
extraFields | object | - | Extra information for this borrow order |
timestamp | string | TIMESTAMP | Borrow order timestamp |
executionTimestamp | string | TIMESTAMP | Execution time |
lastModifiedTime | string | TIMESTAMP | Last modified time |
isDeleted | boolean | - | Indicated whether this borrow was removed from the system |
Subscription filters
Subscribe for all borrow orders:
socket.send({
"messageId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "borrow",
"action": "subscribe",
"params": {
"subscriptionId": "test_borrow_subscription - all orders",
"symbolType": "tora"
}
});
All borrow orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription - all orders"
},
"data": {
"orders": [...]
}
}
Subscribe for specific order:
socket.send({
"messageId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "borrow",
"action": "subscribe",
"params": {
"subscriptionId": "test_borrow_subscription - specific borrow orders",
"symbolType": "tora",
"filter": {
"orderId": "someOrderId"
}
}
});
All orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "borrow",
"event": "update",
"params": {
"subscriptionId": "test_borrow_subscription - specific borrow orders"
},
"data": {
"orders": [...]
}
}
Filter Parameter | Values |
---|---|
orderId | Instructs the borrow service to return specific order |
Borrow Create
Use the
create
action and specify the required borrow order fields
socket.send({
"messageId": "2021-11-28_1",
"service": "borrow",
"action": "create",
"params": {
"order": {
"clientOrderId": "order_2021-11-28_1",
"symbol": "CS.NULL.JAPAN.T.JPY.6758",
"symbolType": "tora",
"requestedQuantity": 2000,
"broker": "bnp",
"brokerAccount": "LongShort"
}
}
});
The borrow order is created and sent
{
"messageId": "ba72e7e5-eced-4ad5-827f-f57f5469c129",
"service": "borrow",
"event": "create",
"messageReferenceId": "2021-11-28_1",
"data": {
"orderId": "AAEWu1vsKJYAAABY"
},
"status": {
"code": 0,
"message": "Ok"
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Parameter | Values |
---|---|
action | create |
params.clientOrderId | Client specified order ID, useful for identifying the order on the client side (mandatory) |
params.symbol | Instrument symbol this order (mandatory) |
params.symbolType | Specifies the listing symbol used (mandatory) |
params.requestedQuantity | The amount of shares to borrow (mandatory) |
params.broker | The borrow broker to send the order to (mandatory) |
params.primeBroker | The prime broker (mandatory) |
params.brokerAccount | The account used (mandatory) |
params.internalAccount | The account used (optional) |
params.tradeBook | The account used (optional) |
params.rate | The requested borrow rate in bps (optional) |
params.userNote | User comment (optional) |
params.manual | Indicate to create a manual order (boolean, optional) |
Strategies
Parameter | Values |
---|---|
service | order-strategy |
The order-strategy service provides information on the strategy of orders inside the system. The authenticated client can perform the following strategy orders actions
- subscribe : the client is ready to receive updates on the strategy of orders that match the subscription filter
- unsubscribe : the client stops receiving updates on the strategy of orders that match the subscription filter
The updates sent by order-strategy services can be joined with the updates from orders services using the following fields from strategy status updates: orderId, parentId and clientOrderId.
Strategy Subscription
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "order-strategy",
"action": "subscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
}
});
The initial strategy of order image is retrieved:
// First message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"data": {
"strategies": [...]
}
}
// Last message in the initial image
{
"messageId": "...",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"data": {
"strategies": [...],
"isComplete": "true"
}
}
Parameter | Values |
---|---|
action | subscribe |
The client is ready to receive updates on the strategy of orders that are present in the system.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | Identifier for the subscription. Based on this information, a subscription can be updated or removed |
Subscription Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "order-strategy",
"event": "subscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"status": {
"code": 0,
"message": "Subscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0fece",
"service": "order-strategy",
"event": "subscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Strategy Unsubscribe
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "order-strategy",
"action": "unsubscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
}
});
Request is successful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "order-strategy",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"status": {
"code": 0,
"message": "Unsubscribe OK."
}
}
Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "order-strategy",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"status": {
"code": 201,
"message": "Invalid unsubscribe request: <reason>."
}
}
Parameter | Values |
---|---|
action | unsubscribe |
params.subscriptionId | The subscription id for which the client doesn't need to receive any more updates |
The client requests not to receive any more updates for the specified subscription.
Strategy Status Updates
The initial strategy status of order image is retrieved:
// The initial image
{
"messageId": "bb60e356-b325-4ef3-bc5d-c75eb95697ef",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"data": {
"strategies": [{
"orderId": "Rmrzd2GbPi4AABWC",
"clientOrderId": "externalID_1",
"parentId": "Fmrzd3GbOl4AACWD",
"name": "TIMED_ORDER",
"state": "SCHEDULED"
}
],
"isComplete": "true"
}
}
// Subsequent update
{
"messageId": "db744fdb-596c-4b52-b759-16e6f291b5e4",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription"
},
"data": {
"strategies": [{
"orderId": "Rmrzd2GbPi4AABWC",
"clientOrderId": "externalID_1",
"parentId": "Fmrzd3GbOl4AACWD",
"name": "TIMED_ORDER",
"state": "EXECUTED"
}
]
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.strategies | The list of strategy status that were updated |
data.isComplete | Is set, and the value is true when the initial strategy status image transfer is complete |
Strategy Status Fields
Parameter | Type | Format | Description |
---|---|---|---|
orderId | string | UUID | Order identifier. It is always sent on strategy status updates. |
clientOrderId | string | - | The client order identifier |
parentId | string | UUID | If the order is a child order, this will hold the parent order identifier. It is sent only when the strategy is from a child order. |
name | string | - | Provides the name of the strategy |
details | string | - | Provides the reason message when a strategy failed. |
state | string | ENUM | Provides the state of strategy : SCHEDULED , IN_PROGRESS , EXECUTED , EXECUTED_REPEATING , FAILED , CANCELED |
Subscription filters
Subscribe for the status of all strategies from all orders:
socket.send({
"messageId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "order-strategy",
"action": "subscribe",
"params": {
"subscriptionId": "test_strategy_subscription - all strategies"
}
});
The status of all strategies from all orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "7e4bcc3c-8018-4f70-b6fa-f5a94fb077c3",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription - all strategies"
},
"data": {
"strategies": [...]
}
}
Subscribe a strategy status for a specific order:
socket.send({
"messageId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "order-strategy",
"action": "subscribe",
"params": {
"subscriptionId": "test_strategy_subscription - specific strategy orders",
"symbolType": "tora",
"filter": {
"orderId": "someOrderId"
}
}
});
All orders are retrieved:
{
"messageId": "...",
"messageReferenceId": "4f4cc9ac-94f4-48b4-a2e2-ccad8cc8cbbb",
"service": "order-strategy",
"event": "update",
"params": {
"subscriptionId": "test_strategy_subscription - specific strategy orders"
},
"data": {
"strategies": [...]
}
}
Filter Parameter | Values |
---|---|
orderId | Instructs the order-strategy service to return the strategy status of a specific order |
Algo Definitions
Parameter | Values |
---|---|
service | algo |
The algo service provides information about the definitions of algo strategies, exactly as it is given in the FIXatdl file provided by the broker. The authenticated client can perform the algo actions detailed below:
- algo strategies search: the client wants to receive all algo strategies that match the specified parameters
- algo details search: the client wants to receive details regarding the algo strategy and/or parameter that match the specified parameters
Additionally, a step-by-step guide showing how an algo order can be created through the API using the information received by querying the algo service can be found in the Algo order creation section.
Algo Strategies Search
Parameter | Values |
---|---|
action | get-algo-strategies |
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Algo Strategies Search Parameters
socket.send({
"messageId": "825254c2-b89b-4c80-96c7-54ab4d98egfd",
"service": "algo",
"action": "get-algo-strategies",
"params": {
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"symbolType": "tora",
"broker": "brkName"
}
});
Parameter | Type | Format | Description |
---|---|---|---|
symbol | string | - | Instructs the algo service to use this symbol for the algo strategies lookup. |
symbolType | string | - | Specifies the listing symbol used for this action. Possible values: caspian, bloomberg, reuters, tora; if missing, defaults to tora |
broker | string | - | Instructs the algo service to use this broker for the algo strategies lookup. |
Algo Strategies Search Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "675a3226-c820-4d08-8dcf-87fbfa93cfd7",
"service": "algo",
"event": "get-algo-strategies",
"messageReferenceId": "825254c2-b89b-4c80-96c7-54ab4d98egfd",
"data": {
"strategies": [
"CLICK",
"CLOSE",
"CUSTOM",
"ICEBERG",
"IS",
"PARTICIPATE",
"STOPLOSS",
"TWAP",
"VWAP"
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
Parameter | Type | Format | Description |
---|---|---|---|
strategies | list | - | The list of algo strategies available for the client. |
Algo Details Search
Parameter | Values |
---|---|
action | get-algo-details |
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 2500 |
1 hour | 5000 |
1 day | 5000 |
Algo Details Search Parameters
socket.send({
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98egfd",
"service": "algo",
"action": "get-algo-details",
"params": {
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"symbolType": "tora",
"broker": "brkName",
"algoStrategy": "AQUA"
}
});
Parameter | Type | Format | Description |
---|---|---|---|
symbol | string | - | Instructs the algo service to use this symbol for the algo strategies lookup. |
symbolType | string | - | Specifies the listing symbol used for this action. Possible values: caspian , bloomberg , reuters , tora ; if missing, defaults to tora |
broker | string | - | Instructs the algo service to use this broker for the algo strategies lookup. |
algoStrategy | string | - | The name of the algo strategy that you want details for. If missing, details regarding all algo strategies will be returned. (optional) |
algoField | string | - | The name of the algo field that you want details for. If missing, details regarding all algo fields will be returned. (optional) |
Algo Details Search Reply
Request is successful, the returned JSON is similar to:
{
"messageId": "bd07285c-a8e3-49de-9bcd-ae05941d30d2",
"service": "algo",
"event": "get-algo-details",
"messageReferenceId": "825254c2-b89b-4c80-96c7-74ab4d98egfd",
"data": {
"strategyTag": 8031,
"strategies": [
{
"algoStrategy": "AQUA",
"algoStrategyFilters": {
"regions": {
"included": [
{
"region": "AsiaPacificJapan",
"included": [
"JP",
"HK"
],
"excluded": []
}
],
"excluded": []
},
"securityTypes": {
"included": [
"CS"
],
"excluded": []
}
},
"algoFields": [
{
"algoField": "Visibility",
"fixTag": "8141",
"type": "number",
"valueMappings": [
{
"value": "{NULL}",
"uiValue": ""
},
{
"value": "2",
"uiValue": "Visible"
},
{
"value": "1",
"uiValue": "Not Visible"
}
],
"required": false,
"immutableOnExchangeSide": true
},
{
"algoField": "DeliverToLocationID",
"fixTag": "145",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"constantValue": 101
},
{
"algoField": "StartTime",
"fixTag": "168",
"type": "string",
"required": false,
"immutableOnExchangeSide": false
},
{
"algoField": "OffsetLast",
"fixTag": "8215",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"minValue": 0,
"maxValue": 5
},
{
"algoField": "DeliverToLocationID",
"fixTag": "145",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"constantValue": 101
}
]
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
Parameter | Type | Format | Description |
---|---|---|---|
strategyTag | number | INT | The fix tag by which the algo strategies can be identified. |
strategies | list | - | The list of algo strategies details. |
algoStrategy | string | - | The name of the algo strategy. |
algoStrategyFilters | object | - | The filters of an algo strategy. |
regions | object | - | Locations as defined by the provider. Used to declare the regions where the algo strategy is supported. The absence of any regions implies that the strategy is valid for all regions. Possible values for region elements (under include/exclude fields): TheAmericas , EuropeMiddleEastAfrica , AsiaPacificJapan . |
securityTypes | object | - | Valid security types of algo strategy. The absence of any security types implies that the strategy is valid for all markets. Possible values of security type element (under include / exclude fields): CS , FUT , OPT , SPR , FX , FWD , SWP , IDX , CB , WAR , PS , FI , OTC , CCY , PSW , MRG , BKT . |
included | list | - | An array of included regions / country codes (ISO 3166-1 alpha-2 code for the countries) / securityTypes. |
excluded | list | - | An array of excluded regions / country codes (ISO 3166-1 alpha-2 code for the countries) / securityTypes. |
algoFields | list | - | A list of algo parameters defined on that algo strategy. The timezone of timestamp parameters is GMT. |
algoField | string | - | The name of the algo parameter. |
fixTag | string | - | The FIX tag of the algo parameter. |
type | string | ENUM | The type of the algo parameter. Possible values: string , number , boolean . |
required | boolean | - | A flag that marks whether the algo parameter is mandatory or not. |
immutableOnExchangeSide | boolean | - | A flag that marks whether the value of the algo parameter can be changed or not after it is sent to the exchange. |
constantValue | - | - | The constant value of the algo parameter; can be of any type. |
minValue | - | - | The minimum value of the algo parameter; can be of any type. |
maxValue | - | - | The maximum value of the algo parameter; can be of any type. |
valueMappings | list | - | The mappings between the value of the algo parameter and the corresponding UI value. |
value | string | - | The value of the algo parameter. |
uiValue | string | - | The UI value of algo parameter. |
timezone | string | - | Used to specify the time zone of an algo parameter with type date. |
format | string | - | Used to specify the time format of an algo parameter with type date. |
precision | number | INT | The number of digits to the right of the decimal point of an algo parameter. |
Algo Order Creation
In order to create an algo order through the API, you need to determine the algo parameters for the order and pass this information to the service responsible for creating orders. This can be achieved by building and setting the broker specific ATDL string on the workBrkSpecATDL field on the JSON order which is sent to the order service.
Given that you have selected a product and a broker, the following steps show the procedure of creating an algo order:
- Request the set of available algo strategies for the required product and broker by querying the algo service, using the get-algo-strategies action.
- Select a strategy from the list of available algo strategies given in the response of the request from the previous step.
- Request the information regarding the algo parameters defined for the selected strategy by querying the algo service, using the get-algo-details action.
- Select the relevant algo parameters defined for that strategy (mandatory parameters and parameters that are relevant for your order) and assign values to them, keeping in mind their constraints (min. value, max. value, increment, format, etc.).
- Build the broker specific ATDL string using the information determined at the previous step.
This string can be built in the following way:
- for each algo field that you have selected, create a string having the format fixTag:value, where fixTag is the value of the fixTag field for the current algo field specified in the response of the get-algo-details request, and the value is the value that you have assigned to it;
- similar to the previous step, create a string having the same format by using the value from the strategyTag field as the fixTag and the name of the strategy as the value;
- create a string by joining all of the strings determined above using a semicolon, and also end the string with a semicolon.
Finally, you can create an order using the order service and pass the previously built string on the workBrkSpecATDL field, as well as the chosen algo strategy on the algoStrategy field.
Example
To make this procedure clearer, we'll demonstrate the above algorithm by presenting a concrete example of placing an algo order. We'll assume that the client is already authenticated and has selected a product and a broker to which the order should be sent.
1. Get the available algo strategies
The first step is to query the available algo strategies for the product and broker combination, so we need to send a request using the get-algo-strategies action. More details regarding this action can be found in its own section.
Request sent through the API to query for available strategies:
{
"messageId": "id_2",
"service": "algo",
"action": "get-algo-strategies",
"params": {
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"symbolType": "tora",
"broker": "baml"
}
}
The API will return the list of available strategies for the given product and broker combination, for example:
{
"messageId": "0957d7e3-bcb4-4210-ab11-30e6bff6f4ca",
"service": "algo",
"event": "get-algo-strategies",
"messageReferenceId": "id_2",
"data": {
"strategies": [
"BLOCKSEEKER",
"CUSTOM1",
"CUSTOM2",
"CUSTOM3",
"CUSTOM4",
"DMA",
"DYNAMIC",
"GETDONE",
"INSTINCT",
"IS",
"MOSAICALGO",
"POV",
"PiAlgo",
"QMOC",
"SMA",
"TAGALGO",
"TWAP",
"VWAP"
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
2. Select a strategy and get its algo fields definitions
The next thing that we have to do is choose one of the previously received strategies and query the details regarding its defined algo parameters using the get-algo-details action. More details regarding this action can be found in its own section.
In this example, we'll pick the
VWAP
strategy and query its details using the request below:
{
"messageId": "id_3",
"service": "algo",
"action": "get-algo-details",
"params": {
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"symbolType": "tora",
"broker": "baml",
"algoStrategy": "VWAP"
}
}
The API will return the list of defined parameters along with their details for the given strategy. In this example, the API sent the following response:
{
"messageId": "9a81a45b-672b-4594-92db-579d28e13233",
"service": "algo",
"event": "get-algo-details",
"messageReferenceId": "id_3",
"data": {
"strategyTag": 6401,
"strategies": [
{
"algoStrategy": "VWAP",
"algoStrategyFilters": {
"regions": {
"included": [
{
"region": "AsiaPacificJapan"
}
]
},
"securityTypes": {
"included": [
"CS"
]
}
},
"algoFields": [
{
"algoField": "TargetSubID",
"fixTag": "57",
"type": "string",
"required": true,
"immutableOnExchangeSide": true,
"constantValue": "ALGO"
},
{
"algoField": "StartTime",
"fixTag": "6168",
"type": "string",
"required": false,
"immutableOnExchangeSide": false,
"formats": [
"yyyyMMdd-HH:mm:ss",
"yyyyMMdd-HH:mm:ss.SSS"
]
},
{
"algoField": "SpeedPrice",
"fixTag": "6410",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"precision": 2,
"minValue": 0.01,
"maxValue": 99999999.9999
},
{
"algoField": "Custom",
"fixTag": "6960",
"type": "string",
"required": false,
"immutableOnExchangeSide": false
},
{
"algoField": "AuctionParticipation",
"fixTag": "6412",
"type": "string",
"valueMappings": [
{
"value": "B",
"uiValue": "AM Open"
},
{
"value": "A",
"uiValue": "PM Close"
},
{
"value": "{NULL}",
"uiValue": "Both"
},
{
"value": "AB",
"uiValue": "None"
}
],
"required": false,
"immutableOnExchangeSide": false
},
{
"algoField": "SpeedUpToOrderPct",
"fixTag": "6511",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"minValue": 1,
"maxValue": 100
},
{
"algoField": "GetDonePrice",
"fixTag": "6961",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"precision": 4,
"minValue": 0
},
{
"algoField": "SpeedUpTargetPct",
"fixTag": "6411",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"minValue": 1,
"maxValue": 100
},
{
"algoField": "BlockEligible",
"fixTag": "8131",
"type": "number",
"valueMappings": [
{
"value": "{NULL}",
"uiValue": "unchecked"
},
{
"value": "100",
"uiValue": "checked"
}
],
"required": false,
"immutableOnExchangeSide": false
},
{
"algoField": "EndTime",
"fixTag": "126",
"type": "string",
"required": false,
"immutableOnExchangeSide": false,
"formats": [
"yyyyMMdd-HH:mm:ss",
"yyyyMMdd-HH:mm:ss.SSS"
]
},
{
"algoField": "MaxPctVol",
"fixTag": "6403",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"minValue": 1,
"maxValue": 100
},
{
"algoField": "ShowHT",
"fixTag": "8208",
"type": "string",
"valueMappings": [
{
"value": "{NULL}",
"uiValue": "unchecked"
},
{
"value": "HT",
"uiValue": "checked"
}
],
"required": false,
"immutableOnExchangeSide": false
},
{
"algoField": "GetDonePct",
"fixTag": "6967",
"type": "number",
"required": false,
"immutableOnExchangeSide": false,
"minValue": 1,
"maxValue": 100
},
{
"algoField": "Urgency",
"fixTag": "6408",
"type": "string",
"valueMappings": [
{
"value": "L",
"uiValue": "Low"
},
{
"value": "M",
"uiValue": "Medium"
},
{
"value": "H",
"uiValue": "High"
}
],
"required": true,
"immutableOnExchangeSide": false
}
]
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
3. Select the algo fields and assign values to them
The next step is to pick the fields which are relevant for our use case and assign values to them, keeping in mind their restrictions. For example:
- StartTime and EndTime have a set of possible formats.
- For fields which contain valueMappings, we should use the value when building the broker specific ATDL string, since the uiValue is just the associated value shown in a UI.
For this example, we'll consider the following field assignments:
- GetDonePrice (fixTag 6961): 1900.0
- StartTime (fixTag 6168): 20230214-16:31:23 (we'll use the
yyyyMMdd-HH:mm:ss
format) - EndTime (fixTag 126): 20230214-18:31:23 (we'll use the
yyyyMMdd-HH:mm:ss
format) - Urgency (fixtag 6408): M (Mediium:M, High: H and Low:L)
4. Build the workBrkSpecATDL
string
Now that we have the fields which we want to set on the algo order as well as their fixTags and values, we can build the broker specific ATDL. First we need to concatenate each fixTag with its assigned value, so we have:
- 6961:1900.0
- 6168:20230215-13:31:23
- 126:20230215-14:31:23
- 6408:M
Then, we have to do the same for the strategyTag and name of the strategy, so we'll have 6401:VWAP.
The last step in building the ATDL string is to join all of these values together with semicolons and also end the string with a semicolon, and in this case the result will be: 8031:STOPLOSS;8099:25.0;168:20221110-16:31:23;11007:0;
.
5. Send the algo order
Finally, we have reached the point where we can actually send the order to the API using the order service. What we need to do beside the usual information is pass the ATDL string onto the workBrkSpecATDL field on the JSON message and the chosen strategy on the algoStrategy field, and we'll have an order register message similar to the one below:
{
"messageId": "id_6",
"service": "orders",
"action": "register",
"params": {
"order": {
"clientOrderId": "clOrdId_6",
"symbol": "7203.T",
"symbolType": "reuters",
"quantity": 2000,
"side": "BUY",
"limitPrice": "0.0",
"brokerAccount": "TestAccount1",
"broker": "baml",
"orderType": "BAML_ATDL",
"workBrkSpecATDL": "6401:1;6408:M;6168:20230215-13:31:23;126:20230215-14:31:23;6961:1900.0",
"algoStrategy": "VWAP",
"condition": "WORKED"
}
}
}
In order to check that the order has been correctly sent to the system, we may subscribe for order updates, in which case we'll receive an update regarding the order that we've just registered.
Among the fields sent in the update message for the broker, we can specifically look at workATDLDescription and workBrkSpecATDL:
- "workATDLDescription": "Strategy:VWAP;Version:4.3.8BA-3.7;Urgency:Medium;StartTime:20230215-22:31:23;EndTime:20230215-23:31:23;GetDonePrice:1900.0"
- "workBrkSpecATDL": "6401:1;9682:4.3.8BA-3.7;57:ALGO;6408:M;6168:20230215-13:31:23;126:20230215-14:31:23;6961:1900.0;"
We can see that these strings contain all the fields that we've manually set, as well as the constant value fields.
Quotes
Parameter | Values |
---|---|
service | quotes |
The quotes service enables users to stay updated on RFQs (Request for Quotes) within the system. It also provides the ability to request or cancel RFQs. Authenticated clients can perform the following actions related to quotes:
- subscribe: Clients can subscribe to updates on quotes that match the subscription filter.
- unsubscribe: Clients can stop receiving updates on quotes that match the subscription filter.
Quotes Subscription
socket.send({
"messageId": "246e9661e880-24f40-186fcd5a312-2690",
"service": "quotes",
"action": "subscribe",
"params": {
"subscriptionId":"test_quotes_subscription"
}
});
// Clients will receive any available updates on quotes requested by other means as well.
// Initial ack to subscription
{
"messageId": "1398340c-ec9d-4768-a01d-77f57c4a223f",
"service": "quotes",
"event": "subscribe",
"messageReferenceId": "246e9661e880-24f40-186fcd5a312-2690",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"status": {
"code": 0,
"message": "Ok"
}
}
// First message in the initial image
{
"messageId": "23efc6b6-cef0-4d49-b7d6-1a749074bc29",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [...]
}
}
// Last message in the initial image
{
"messageId": "23efc6b6-cef0-4d49-b7d6-1a749074bc29",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [...],
"isComplete": "true"
}
}
Clients can receive updates on RFQs by subscribing to the quotes service:
Parameter | Values |
---|---|
action | subscribe |
By setting the action parameter to "subscribe", the client is indicating that it's ready to receive updates on requested quotes or active quotes.
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 10 |
1 hour | 20 |
1 day | 40 |
- The maximum number of active subscriptions at any given moment that a client can have is 10.
Quotes Subscription Parameters
Parameter | Type | Format | Description |
---|---|---|---|
subscriptionId | string | - | An identifier for the subscription. This ID can be used to update or remove the subscription. |
filter | object | - | This filter instructs the quotes service to return only those quotes that match the specified criteria. |
Subscription filters
Subscribe for all Quotes, no filter:
socket.send({
"messageId": "246e9661e880-24f40-186fcd5a312-2690",
"service": "quotes",
"action": "subscribe",
"params": {
"subscriptionId":"test_quotes_subscription"
}
});
Updates on all RFQ requested are retrieved, even those requested outside WebsSocket API:
{
"messageId": "23efc6b6-cef0-4d49-b7d6-1a749074bc29",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [...]
}
}
Subscribe for specific clientRequestId:
socket.send({
"messageId": "246e9661e880-24f40-186fcd5a312-2690",
"service": "quotes",
"action": "subscribe",
"params": {
"subscriptionId":"test_quotes_subscription",
"filter": {
"clientRequestId": "specificClientRequestId"
}
}
});
Updates on the specific client request id specified by the filter are received
{
"messageId": "...",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [
{
"clientRequestId": "specificClientRequestId",
"requestId": "...",
"offerQuoteID": "..",
"bidQuoteID": "..",
"timestamp": ..,
"tradedCCY": "..",
"broker": "..",
"isCancel": false,
"isTradable": false
}
]
}
}
Filter Parameter | Values |
---|---|
clientRequestId | Instructs the quote service to receive updates on specific quotes that match the specified clientRequestId. |
Quotes Subscription Reply
If the subscription request is successful, the JSON response will be similar to:
// Request is successful, the returned JSON is similar to:
{
"messageId": "1398340c-ec9d-4768-a01d-77f57c4a223f",
"service": "quotes",
"event": "subscribe",
"messageReferenceId": "246e9661e880-24f40-186fcd5a312-2690",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"status": {
"code": 0,
"message": "Ok"
},
"filter": {
"clientRequestId": "clientRequestId"
}
}
// Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "1398340c-ec9d-4768-a01d-77f57c4a223f",
"service": "quotes",
"event": "subscribe",
"messageReferenceId": "246e9661e880-24f40-186fcd5a312-2690",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"status": {
"code": 201,
"message": "Invalid subscription: <reason>."
}
}
Parameter | Values |
---|---|
event | subscribe |
params | The client subscription parameters |
status | The status of this subscription |
Quotes unsubscribe
socket.send({
"messageId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "quotes",
"action": "unsubscribe",
"params": {
"subscriptionId": "test_quotes_subscription"
}
});
// If the unsubscribe request is successful, the JSON response will be similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "quotes",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"status": {
"code": 0,
"message": "Unsubscribe OK."
}
}
// Request is unsuccessful, the returned JSON is similar to:
{
"messageId": "825254c2-b89b-4c80-96c7-74ab4d98effd",
"messageReferenceId": "6b25450f-1421-4cef-b6c4-9ebed1f0lece",
"service": "quotes",
"event": "unsubscribe",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"status": {
"code": 201,
"message": "Invalid unsubscribe request: <reason>."
}
}
Parameter | Values |
---|---|
action | unsubscribe |
params.subscriptionId | The subscription ID for which the client no longer wishes to receive updates. |
By setting the action parameter to "unsubscribe" and providing the appropriate subscription ID in the params
object, the client requests to stop receiving updates for the specified subscription.
Quote Updates
First update will retrieve the initial quote image.
// The initial image
{
"messageId": "23efc6b6-cef0-4d49-b7d6-1a749074bc29",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [
{
"messageId": "3620ec49-fc66-4e28-b734-cf65c0e56329",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [
{
"dealerName": "ZBBI",
"requestId": "AAABKWQPWSYAABQR",
"offerQuoteID": "1166200000000820001-65339872071|1166200000000820001|KEYTDOBG63268411996502403",
"bidQuoteID": "1166200000000820001-65339872071|1166200000000820001|KEYTDOBG63268411996502403",
"timestamp": 1678730939,
"provider": "ZBBI",
"tradedCCY": "CZK",
"validUntilTime": 1678731060,
"broker": "ebs",
"isCancel": false,
"isTradable": true,
"quantity": 10000,
"settlementDate": "20230314",
"bidPrice": 23.75229,
"bidSize": 10000,
"bidSpotRate": 23.7585,
"bidForwardPoints": -0.00621,
"offerPrice": 23.80685,
"offerSize": 10000,
"offerSpotRate": 23.8065,
"offerForwardPoints": 0.00035
}
]
}
}],
"isComplete": true
}
}
// Subsequent update
{
"messageId": "db744fdb-596c-4b52-b759-16e6f291b5e4",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "test_quotes_subscription"
},
"data": {
"quotes": [
{
"dealerName": "ZBBI",
"requestId": "AAABKWQPWSYAABQR",
"offerQuoteID": "1166200000000820001-65339872071|1166200000000820001|KEYTDOBG63268411996502403",
"bidQuoteID": "1166200000000820001-65339872071|1166200000000820001|KEYTDOBG63268411996502403",
"timestamp": 1678730939,
"provider": "ZBBI",
"tradedCCY": "CZK",
"validUntilTime": 1678731060,
"broker": "ebs",
"isCancel": false,
"isTradable": true,
"quantity": 10000,
"settlementDate": "20230314",
"bidPrice": 23.75229,
"bidSize": 10000,
"bidSpotRate": 23.7585,
"bidForwardPoints": -0.00621,
"offerPrice": 23.80685,
"offerSize": 10000,
"offerSpotRate": 23.8065,
"offerForwardPoints": 0.00035
}
]
}
}
// Quote Expiry Update
{
"messageId": "...",
"service": "quotes",
"event": "update",
"params": {
"subscriptionId": "..."
},
"data": {
"quotes": [
{
"clientRequestId": "...",
"requestId": "...",
"offerQuoteID": "*",
"bidQuoteID": "*",
"timestamp": 1682385956,
"tradedCCY": "AUD",
"broker": "ebs",
"isCancel": true,
"isTradable": true
}
]
}
}
Parameter | Values |
---|---|
event | update |
params | The client subscription parameters |
data.quotes | The updated quotes |
data.isComplete | This value is set to true when the initial quotes are complete. |
When there are any updates to the subscribed quotes, an update
event will be triggered.
The data
object will contain the updated quotes, and the data.isComplete
value will be set to true
when the initial quotes have been retrieved.
Quote Fields
Parameter | Type | Format | Description |
---|---|---|---|
clientRequestId | string | string | Same as the one specified in quote request, present if request created from websocket |
rejectCode | number | - | Reject code in case request was rejected. |
rejectReason | string | - | Reject reason for a rejected request. |
dealerName | string | - | The dealer from which the quote was recieved. |
requestId | string | - | Internal request id corresponding to the quote request. |
offerQuoteID | string | string | The id to use while executing the order at the offer. |
bidQuoteID | string | string | The id to use while executing the order at the bid. |
listId | string | string | Parameter for list quotes. |
orderId | string | string | OrderId corresponding to quote. |
aggregationId | string | string | Aggregation id corresponding to quote request. |
timestamp | long | TIMESTAMP | Epoch timestamp when the quote was created |
priceType | string | - | Quote in price type format |
provider | string | - | The provider from whom the quote was recieved. |
tradedCCY | string | - | The traded curency in the initial quote request. |
validFromTime | long | TIMESTAMP | Time in UTC from where quote request is valid. |
validUntilTime | long | TIMESTAMP | Time in UTC untill which the quote request is valid. |
broker | string | string | Broker for which quote request was created. |
isCancel | boolean | boolean | If true quote specifies the expiry of the quote. |
isTradable | boolean | boolean | Is the quote tradable. |
estimatedPrice | string | number | Estimated price. |
estimatedGSpread | string | number | Estimated G-spread for bond. |
estimatedYield | string | number | Estimated yield for the bond. |
inquiryState | string | string | The inquiry state. |
commissionType | string | enum | The commision type PRIME_BROKER_COMMISSION , NON_PRIME_BROKER_COMMISSION , MISSING_COMMISSION , NO_COMMISSION |
tenor | string | - | The tenor code. |
bidSwapPoints | string | number | Swap points calculated from bid. |
offerSwapPoints | string | number | Swap points calculated from ask. |
offerNetSpreadPoints | string | number | Offer Net Spread points calculated from commision's file. |
bidNetSpreadPoints | string | number | Bid Net Spread points calculated from commision's file. |
quantity | string | number | The corresponding leg Quantity. |
legs | list | - | Holds a list of leg based info for swaps. |
settlementDate | date | yyyyMMdd | SettlementDate for the asset. |
bidPrice | string | number | The bid for the asset. |
bidSize | string | number | The bid size for the asset. |
bidSpotRate | string | number | The bid spot rate for the asset. |
bidForwardPoints | string | number | The bid forward points for the asset. |
offerPrice | string | number | The offer price for the asset. |
offerSize | string | number | The offer size for the asset. |
offerSpotRate | string | number | The offer spot rate for the asset. |
offerForwardPoints | string | number | The offer forward points for the asset. |
legs[].name | string | - | Near Leg has near and Far Leg has far |
legs[].quantity | string | number | The corrsponding leg Quantity. |
legs[].bidPrice | string | number | The bid corresponding to the leg. |
legs[].bidSize | string | number | The bid size corresponding to the leg. |
legs[].bidSpotRate | string | number | The bid Spot rate corresponding to |
legs[].bidForwardPoints | string | number | The forward points corresponding to the leg. |
legs[].offerPrice | string | number | The offer price corresponding to the leg. |
legs[].offerSize | string | number | The offer size corresponding to the leg. |
legs[].offerSpotRate | string | number | The offer spot rate corresponding to the leg. |
legs[].offerForwardPoints | string | number | The offer forward points corresponding to the leg. |
Pairs
Parameter | Values |
---|---|
service | pairs |
The pairs service enables users to manage TORA Pairs orders for different Pairs strategies. It allows users to register, send, amend and cancel a pair. Authenticated clients can perform the following actions:
- register: Stages a new pairs order inside the system, but doesn't send it to the exchange/engine.
- send: Sends a registered pairs order to the exchange/engine for execution.
- registerAndSend: Registers and immediately sends a pairs order to the exchange/engine.
- amend: Modifies the details of an existing pairs order.
- cancel: Cancels a previously sent pairs order.
- pairsUp: Link and Pair Up two independently registered single parent orders.
Pairs Fields
Parameter | Type | Format | Description |
---|---|---|---|
broker | string | string | The broker corresponding to the pair. |
algoId | string | string | A unique ID used to identify the pair. |
strategy | string | string | The strategy to use for the pairs order. (Merger, Pairs, Rights, etc.) |
algoFields | object | object | Algo parameters/fields specific to the actual algo, will depend on the Strategy and ATDL version in use. The format of the parameters is the same as the one from the file used for Pairs upload in GUI. |
orders[] | * | * | Order-level details for each leg of the pair, which are defined in this section. |
orders[].legName | string | string | Identifies the current leg as either 'leg1' or 'leg2', used for referencing parameters in algoFields. |
orders[].clientOrderId | string | string | A unique identifier for each leg of the pair. |
Pairs register
Use the register
action and specify the corresponding pairs fields to register a pair. Similar to an order register, this will not send the pair to the exchange/engine.
socket.send({
"messageId": "pairs-register",
"service": "pairs",
"action": "register",
"params": {
"broker": "tpairs",
"algoId": "XNG8NGXqtKcAAAAY",
"strategy": "Merger",
"algoFields": {
"target_ratio": "1.6",
"leg1_slippage": "0.0",
"pairs_ord_status": "ACTIVE",
"leg2_primary": "N",
"target_spread": "0.0",
"leg2_slice_manual": "1000.0",
"slippage_percent_type": "Y",
"Version": "1",
"continuous": "N",
"leg2_threshold": "10.0",
"pairs_alert_action_type": "CROSS",
"cash": "0.0",
"leg2_executing_broker": "ml",
"conversion": "NONE",
"leg1_concurrency": "1",
"leg_strategy": "AD_FLOAT_FLOAT",
"leg1_threshold": "10.0",
"leg1_slice_manual": "10000.0",
"leg2_execution_style": "AGGRESSIVE",
"leg2_concurrency": "1",
"leg1_executing_broker": "ml",
"leg1_primary": "Y",
"Strategy": "Merger",
"spread_percent_type": "N",
"leg1_execution_style": "AGGRESSIVE",
"leg2_slippage": "0.0"
},
"orders": [{
"clientOrderId": "XNG8NGXqtKcAAAAj",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000,
"side": "BUY",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1"
}, {
"clientOrderId": "XNG8NGXqtKcAAAAk",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000,
"side": "SELL",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2"
}]
}
});
The pairs order is registered.
{
"messageId": "aed02754-8fff-4d02-a379-59ded993204b",
"service": "pairs",
"event": "register",
"messageReferenceId": "pairs-register",
"data": {
"algoId": "XNG8NGXqtKcAAAAY",
"orders": [
{
"clientOrderId": "XNG8NGXqtKcAAAAj",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000.0,
"side": "BUY",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1",
"broker": "tpairs",
"orderId": "AAAJYWXqtacAAACg",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
},
{
"clientOrderId": "XNG8NGXqtKcAAAAk",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000.0,
"side": "SELL",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2",
"broker": "tpairs",
"orderId": "AAAJYWXqtacAAACi",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the order could not be registered.
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc48411",
"service": "pairs",
"event": "register",
"messageReferenceId": "pairs-register",
"status": {
"code": "...",
"message": "..."
}
}
If an order subscription is active, updates will be received on the individual orders.
{
"messageId": "9265a3f7-cf69-4df0-8e1c-4a9942762a7c",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "XNG8NGXqtKcAAAAi"
},
"data": {
"orders": [
{
"orderId": "AAAJYWXqtacAAACi",
"clientOrderId": "XNG8NGXqtKcAAAAk",
"isParent": true,
"symbol": "CS.NULL.JAPAN.T.JPY.6298",
"exchange": "T",
"broker": "tpairs",
"side": "SELL",
"quantity": 100000.0,
"limitPrice": 0.0,
"owner": "TestUser3",
"flowType": "ALGO",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2024-03-08T06:54:25.816000Z",
"lastUpdateTime": "2024-03-08T06:54:25.816000Z",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"condition": "WORKED",
"orderType": "TPAIRS_ATDL",
"algoStrategy": "Merger",
"algoFields": {
"Leg1Instrument": "6293.T",
"SpreadIsPercentType": "N",
"Cash": "0.0",
"Leg1IsPrimary": "Y",
"TargetSpread": "0.0",
"PairIsHung": "N/A",
"Conversion": "NONE",
"ActiveCoverCount": "N/A",
"TargetRatio": "1.0",
"ShareRatio": "1.0"
},
"externalId": "XNG8NGXqtKcAAAAk",
"groupingId": "XNG8NGXqtKcAAAAY:AAAJYWXqtacAAACf",
"groupingType": "PAIR",
"lastUpdateOwner": "TestUser3",
"limitRequestId": "UNKNOWN",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workATDLDescription": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;",
"workBrkSpecATDL": "8500:Merger;7621:4.3.7;8052:N;6004:0.0;6115:N;6015:Y;6067:Y;8178:N/A;8078:N/A;8076:N/A;8075:N/A;8043:N/A;8042:N/A;8041:N/A;6101:6298.T;6001:6293.T;6068:N;6109:10.0;6009:10.0;6000:AD_FLOAT_FLOAT;6108:0.0;6008:0.0;6014:Y;8051:0.0;6003:1.0;8107:N;6111:1;6011:1;6028:N;6107:1000.0;6007:10000.0;6197:N;6199:N;6097:N;6099:N;6196:NONE;6096:NONE;6041:ACTIVE;8056:N;6005:NONE;6110:AGGRESSIVE;6010:AGGRESSIVE;6117:ml;6017:ml;8057:N;8053:N;6040:CROSS;",
"workBrkSpecStrategy": "Merger",
"workType": "TPAIRS_ATDL",
"originator": "TestUser3",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
The algoId is the first token of the groupingId, in the below case: "groupingId": "XNG8NGXqtKcAAAAY:AAAJYWXqtacAAACf".
{
"messageId": "55683210-5ac1-43f0-bd3c-1bf095b98096",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "XNG8NGXqtKcAAAAi"
},
"data": {
"orders": [
{
"orderId": "AAAJYWXqtacAAACg",
"clientOrderId": "XNG8NGXqtKcAAAAj",
"isParent": true,
"symbol": "CS.NULL.JAPAN.T.JPY.6293",
"exchange": "T",
"broker": "tpairs",
"side": "BUY",
"quantity": 200000.0,
"limitPrice": 0.0,
"owner": "TestUser3",
"flowType": "ALGO",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2024-03-08T06:54:25.814000Z",
"lastUpdateTime": "2024-03-08T06:54:25.814000Z",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"condition": "WORKED",
"orderType": "TPAIRS_ATDL",
"algoStrategy": "Merger",
"algoFields": {
"Leg1Instrument": "6293.T",
"SpreadIsPercentType": "N",
"Cash": "0.0",
"Leg1IsPrimary": "Y",
"TargetSpread": "0.0",
"PairIsHung": "N/A",
"Conversion": "NONE",
"ActiveCoverCount": "N/A",
"TargetRatio": "1.0",
"ShareRatio": "1.0"
},
"externalId": "XNG8NGXqtKcAAAAj",
"groupingId": "XNG8NGXqtKcAAAAY:AAAJYWXqtacAAACf",
"groupingType": "PAIR",
"lastUpdateOwner": "TestUser3",
"limitRequestId": "UNKNOWN",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workATDLDescription": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;",
"workBrkSpecATDL": "8500:Merger;7621:4.3.7;8052:N;6004:0.0;6115:N;6015:Y;6067:Y;8178:N/A;8078:N/A;8076:N/A;8075:N/A;8043:N/A;8042:N/A;8041:N/A;6101:6298.T;6001:6293.T;6068:N;6109:10.0;6009:10.0;6000:AD_FLOAT_FLOAT;6108:0.0;6008:0.0;6014:Y;8051:0.0;6003:1.0;8107:N;6111:1;6011:1;6028:N;6107:1000.0;6007:10000.0;6197:N;6199:N;6097:N;6099:N;6196:NONE;6096:NONE;6041:ACTIVE;8056:N;6005:NONE;6110:AGGRESSIVE;6010:AGGRESSIVE;6117:ml;6017:ml;8057:N;8053:N;6040:CROSS;",
"workBrkSpecStrategy": "Merger",
"workType": "TPAIRS_ATDL",
"originator": "TestUser3",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 250 |
1 hour | 1500 |
1 day | 1500 |
Pairs send
Use the send
action with the already registered pairs order to send out the pair to the exchange/engine. The legName
parameter and either of orderId
/ clientOrderId
are required for the identification of each leg.
socket.send({
"messageId": "pairs-send",
"service": "pairs",
"action": "send",
"params": {
"orders": [
{
"orderId": "AAAJYWXqtacAAACg",
"legName": "leg1"
},
{
"orderId": "AAAJYWXqtacAAACi",
"legName": "leg2"
}
]
}
});
The pairs order is sent to exchange/engine.
{
"messageId": "11d42a90-d552-4501-a059-5e9ffeb4739d",
"service": "pairs",
"event": "send",
"messageReferenceId": "pairs-send",
"data": {
"algoId": "XNG8NGXqtKcAAAAY",
"orders": [
{
"orderId": "AAAJYWXqtacAAACg",
"legName": "leg1",
"broker": "tpairs",
"side": "BUY",
"quantity": 200000.0,
"limitPrice": 0.0,
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:PASSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
},
{
"orderId": "AAAJYWXqtacAAACi",
"legName": "leg2",
"broker": "tpairs",
"side": "SELL",
"quantity": 100000.0,
"limitPrice": 0.0,
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;cash:0.0;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Merger;spread_percent_type:N;leg1_execution_style:PASSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the order could not be sent.
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc48412",
"service": "pairs",
"event": "send",
"messageReferenceId": "pairs-send",
"status": {
"code": "...",
"message": "..."
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 250 |
1 hour | 1500 |
1 day | 1500 |
Pairs Register and Send
Use the registerAndSend
action and specify the corresponding pairs fields to register and immediately send a pair to the exchange/engine.
socket.send({
"messageId": "pairs-reg-and-send",
"service": "pairs",
"action": "registerAndSend",
"params": {
"broker": "tpairs",
"algoId": "XNG8NGXqtKcAAAC8",
"strategy": "Pairs",
"algoFields": {
"target_ratio": "1.6",
"leg1_slippage": "0.0",
"pairs_ord_status": "ACTIVE",
"leg2_primary": "N",
"target_spread": "0.0",
"leg2_slice_manual": "1000.0",
"slippage_percent_type": "Y",
"Version": "1",
"continuous": "N",
"leg2_threshold": "10.0",
"pairs_alert_action_type": "CROSS",
"leg2_executing_broker": "ml",
"conversion": "NONE",
"leg1_concurrency": "1",
"leg_strategy": "AD_FLOAT_FLOAT",
"leg1_threshold": "10.0",
"leg1_slice_manual": "10000.0",
"leg2_execution_style": "AGGRESSIVE",
"leg2_concurrency": "1",
"leg1_executing_broker": "ml",
"leg1_primary": "Y",
"Strategy": "Pairs",
"leg1_execution_style": "AGGRESSIVE",
"leg2_slippage": "0.0"
},
"orders": [{
"clientOrderId": "XNG8NGXqtKcAAADD",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000,
"side": "BUY",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1"
}, {
"clientOrderId": "XNG8NGXqtKcAAADE",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000,
"side": "SELL",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2"
}]
}
});
The pairs order is registered and sent to the exchange/engine.
{
"messageId": "db19892c-a202-4c20-8d9b-7e09ac8779bc",
"service": "pairs",
"event": "registerAndSend",
"messageReferenceId": "pairs-reg-and-send",
"data": {
"algoId": "XNG8NGXqtKcAAAC8",
"orders": [
{
"clientOrderId": "XNG8NGXqtKcAAADD",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000.0,
"side": "BUY",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1",
"broker": "tpairs",
"orderId": "AAAJYWXqtacAAAKT",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
},
{
"clientOrderId": "XNG8NGXqtKcAAADE",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000.0,
"side": "SELL",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2",
"broker": "tpairs",
"orderId": "AAAJYWXqtacAAAKU",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:NONE;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the order could not be registered and sent.
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc48413",
"service": "pairs",
"event": "registerAndSend",
"messageReferenceId": "pairs-reg-and-send",
"status": {
"code": "...",
"message": "..."
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 250 |
1 hour | 1500 |
1 day | 1500 |
Pairs amend
Use the amend
action to modify amendable pairs and order parameters on an existing pairs order.
socket.send({
"messageId": "pairs-amend",
"service": "pairs",
"action": "amend",
"params": {
"broker": "tpairs",
"algoId": "XNG8NGXqtKcAAACi",
"strategy": "Pairs",
"algoFields": {
"target_ratio": "1.6",
"leg1_slippage": "0.0",
"pairs_ord_status": "ACTIVE",
"leg2_primary": "N",
"target_spread": "0.0",
"leg2_slice_manual": "1000.0",
"slippage_percent_type": "Y",
"Version": "1",
"continuous": "N",
"leg2_threshold": "10.0",
"pairs_alert_action_type": "CROSS",
"leg2_executing_broker": "ml",
"conversion": "CURRENCY",
"leg1_concurrency": "1",
"leg_strategy": "AD_FLOAT_FLOAT",
"leg1_threshold": "10.0",
"leg1_slice_manual": "10000.0",
"leg2_execution_style": "AGGRESSIVE",
"leg2_concurrency": "1",
"leg1_executing_broker": "ml",
"leg1_primary": "Y",
"Strategy": "Pairs",
"leg1_execution_style": "AGGRESSIVE",
"leg2_slippage": "0.0"
},
"orders": [{
"clientOrderId": "XNG8NGXqtKcAAACz",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": "200000",
"side": "BUY",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1"
}, {
"clientOrderId": "XNG8NGXqtKcAAAC0",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": "100000",
"side": "SELL",
"limitPrice": "0",
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2"
}]
}
});
The amend action is sent to exchange/engine.
{
"messageId": "301cad75-19e3-418e-980b-67bafcc87e79",
"service": "pairs",
"event": "amend",
"messageReferenceId": "pairs-amend",
"data": {
"algoId": "XNG8NGXqtKcAAACi",
"orders": [
{
"clientOrderId": "XNG8NGXqtKcAAACz",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000.0,
"side": "BUY",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1",
"orderId": "AAAJYWXqtacAAAJk",
"broker": "tpairs",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:CURRENCY;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
},
{
"clientOrderId": "XNG8NGXqtKcAAAC0",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000.0,
"side": "SELL",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2",
"orderId": "AAAJYWXqtacAAAJl",
"broker": "tpairs",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:CURRENCY;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the order could not be amended.
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc48414",
"service": "pairs",
"event": "amend",
"messageReferenceId": "pairs-amend",
"status": {
"code": "...",
"message": "..."
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 500 |
1 hour | 6000 |
1 day | 6000 |
Pairs cancel
Use the cancel
action to cancel a pairs order. Similar to send, legName
and either of orderId
/ clientOrderId
are required for the identification of each leg.
socket.send({
"messageId": "pairs-cancel",
"service": "pairs",
"action": "cancel",
"params": {
"orders": [
{
"orderId": "AAAJYWXqtacAAAJk",
"legName": "leg1"
},
{
"orderId": "AAAJYWXqtacAAAJl",
"legName": "leg2"
}
]
}
});
The cancel action is sent to exchange/engine.
{
"messageId": "301cad75-19e3-418e-980b-67bafcc87e79",
"service": "pairs",
"event": "cancel",
"messageReferenceId": "pairs-cancel",
"data": {
"algoId": "XNG8NGXqtKcAAACi",
"orders": [
{
"clientOrderId": "XNG8NGXqtKcAAACz",
"symbol": "6293.T",
"symbolType": "reuters",
"quantity": 200000.0,
"side": "BUY",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg1",
"orderId": "AAAJYWXqtacAAAJk",
"broker": "tpairs",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:CURRENCY;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
},
{
"clientOrderId": "XNG8NGXqtKcAAAC0",
"symbol": "6298.T",
"symbolType": "reuters",
"quantity": 100000.0,
"side": "SELL",
"limitPrice": 0.0,
"brokerAccount": "LongShort",
"internalAccount": "acc1",
"tradeBook": "trdx",
"legName": "leg2",
"orderId": "AAAJYWXqtacAAAJl",
"broker": "tpairs",
"workBrkSpecATDL": "target_ratio:1.6;leg1_slippage:0.0;pairs_ord_status:ACTIVE;leg2_primary:N;target_spread:0.0;leg2_slice_manual:1000.0;slippage_percent_type:Y;Version:1;continuous:N;leg2_threshold:10.0;pairs_alert_action_type:CROSS;leg2_executing_broker:ml;conversion:CURRENCY;leg1_concurrency:1;leg_strategy:AD_FLOAT_FLOAT;leg1_threshold:10.0;leg1_slice_manual:10000.0;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;leg1_executing_broker:ml;leg1_primary:Y;Strategy:Pairs;leg1_execution_style:AGGRESSIVE;leg2_slippage:0.0;leg1_instrument:6293.T;leg2_instrument:6298.T;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the order could not be cancelled.
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc4841",
"service": "pairs",
"event": "cancel",
"messageReferenceId": "pairs-cancel",
"status": {
"code": "...",
"message": "..."
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 500 |
1 hour | 9000 |
1 day | 9000 |
Pairs Pair Up
Use the pairUp
action to link and pair two already registered single Parent orders, including the pairs fields that define how the algorithm will trade. This action will not transmit the pair to the exchange/engine.
If the action fails validation, the orders will not pair up. If it succeeds, the two orders will link together as a pair in the registered state.
orderId or clientOrderId from the registered parent orders can be used to identify the already registered orders.
Best Practices:
- After performing
pairUp
action do the send action only after ensuring that the pair up is successful and complete with no errors.
This can be achieved by ensuring orders reflect their new paired up state via the Order Subscription updates on the orders used in thepairUp
action.
This can be confirmed by making sure the paired up orders have the same groupingId field for both the orders part of the pair and algoId match.
The algoId is the first token of the groupingId, in the case if groupingId is XNG8NGXqtKcAAAAY:AAAJYWXqtacAAACf algoId is XNG8NGXqtKcAAAAY - If PairUp fails consider the reason for failure before attempting again with the same parameters.
- Avoid duplicates before the call to
pairUp
action, in case of a multiplepairUp
actions, ensure each order is included in only one leg of the pair. - Ensure the order is not already included in a pair. Can be achieved by checking if groupingId exists in the order image.
- Avoid Operations from multiple API connections to the server on the exact same orders.
socket.send({
"messageId": "pair-up-test",
"service": "pairs",
"action": "pairUp",
"params": {
"strategy": "Pairs",
"broker": "tpairs",
"algoId": "9265a8c2051e-c7b-19472e63c43-3",
"algoFields": {
"target_ratio": "15.65",
"pairs_ord_status": "INACTIVE",
"target_spread": 0.0,
"conversion": "None",
"pairs_alert_action_type": "CROSS",
"leg1_threshold": 0.01,
"leg2_threshold": 0.01,
"leg1_slippage": 0,
"leg2_slippage": 0,
"leg1_concurrency": 1,
"leg2_concurrency": 1,
"leg1_slice_manual": 100,
"leg2_slice_manual": 100,
"leg_strategy": "AD_FLOAT_FIX",
"leg1_primary": "Y",
"leg2_primary": "N",
"leg1_pov_type": "ALL",
"leg2_pov_type": "ALL",
"leg1_execution_style": "AGGRESSIVE",
"leg2_execution_style": "AGGRESSIVE",
"leg1_pov": 10,
"leg2_pov": 10,
"leg1_executing_broker": "broker",
"leg2_executing_broker": "broker"
},
"orders": [
{
"legName": "leg1",
"orderId": "Ukbg4meJzIAAAgMK"
},
{
"legName": "leg2",
"orderId": "Ukbg4meJzIAAAgVX"
}
]
}
});
The pairUp action succeeds.
{
"messageId": "66374851-0bcd-4316-8184-e687774985ef",
"service": "pairs",
"event": "pairUp",
"messageReferenceId": "pair-up-test",
"data": {
"algoId": "9265a8c2051e-c7b-19472e63c43-3",
"orders": [
{
"legName": "leg1",
"orderId": "Ukbg4meJzIAAAgMK",
"symbol": "9432.T",
"symbolType": "REUTERS",
"exchange": "T",
"brokerAccount": "BROKER_ACCOUNT",
"side": "BUY",
"quantity": 10000.0,
"limitPrice": 0.0,
"broker": "tpairs",
"workBrkSpecATDL": "leg1_slippage:0.0;leg1_pov_type:All;enable_slices:false;leg1_pov:10.0;slippage_percent_type:false;leg2_slice_manual:100.0;active_cover_count:N/A;Version:4.4.0;leg1_instrument:9432.T;continuous:false;pair_session_info_tag:N/A;pairs_is_hung:N/A;pairs_alert_action_type:CROSS;leg2_instrument:6501.T;leg_strategy:AD_FLOAT_FIX;leg1_threshold:0.01;leg1_slice_manual:100.0;leg1_executing_broker:gs;pair_executed_conversion_rate:N/A;leg1_primary:true;leg1_execution_style:AGGRESSIVE;primary_avg_price:N/A;leg2_slippage:0.0;target_ratio:15.65;incremental_float:false;pairs_ord_status:INACTIVE;leg2_primary:false;target_spread:0.0;tgtbt_check:true;enable_i_would_ratio:false;leg2_threshold:0.01;enable_i_would_spread:false;leg2_executing_broker:gs;leg2_pov_type:All;conversion:None;pair_error_reason:N/A;leg2_enable_pov:true;leg1_concurrency:1;leg2_enable_passive_pov:false;leg1_enable_passive_pov:false;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;secondary_avg_price:N/A;leg1_enable_pov:true;leg2_pov:10.0;Strategy:Pairs;enable_too_good_to_be_true:false;check_available_liquidity:false;enable_flexible_slice_sizes:false;"
},
{
"orderId": "Ukbg4meJzIAAAgVX",
"legName": "leg2",
"symbol": "0001.HK",
"symbolType": "REUTERS",
"exchange": "HK",
"brokerAccount": "BROKER_ACCOUNT",
"side": "SELL",
"quantity": 5000.0,
"limitPrice": 0.0,
"broker": "tpairs",
"workBrkSpecATDL": "leg1_slippage:0.0;leg1_pov_type:All;enable_slices:false;leg1_pov:10.0;slippage_percent_type:false;leg2_slice_manual:100.0;active_cover_count:N/A;Version:4.4.0;leg1_instrument:9432.T;continuous:false;pair_session_info_tag:N/A;pairs_is_hung:N/A;pairs_alert_action_type:CROSS;leg2_instrument:6501.T;leg_strategy:AD_FLOAT_FIX;leg1_threshold:0.01;leg1_slice_manual:100.0;leg1_executing_broker:gs;pair_executed_conversion_rate:N/A;leg1_primary:true;leg1_execution_style:AGGRESSIVE;primary_avg_price:N/A;leg2_slippage:0.0;target_ratio:15.65;incremental_float:false;pairs_ord_status:INACTIVE;leg2_primary:false;target_spread:0.0;tgtbt_check:true;enable_i_would_ratio:false;leg2_threshold:0.01;enable_i_would_spread:false;leg2_executing_broker:gs;leg2_pov_type:All;conversion:None;pair_error_reason:N/A;leg2_enable_pov:true;leg1_concurrency:1;leg2_enable_passive_pov:false;leg1_enable_passive_pov:false;leg2_execution_style:AGGRESSIVE;leg2_concurrency:1;secondary_avg_price:N/A;leg1_enable_pov:true;leg2_pov:10.0;Strategy:Pairs;enable_too_good_to_be_true:false;check_available_liquidity:false;enable_flexible_slice_sizes:false;"
}
]
},
"status": {
"code": 0,
"message": "Ok"
}
}
An error will be received in case the pairUp action fails. The orders will not be paired up in this case. And can be paired up again if validation fails
{
"messageId": "486ad365-2d91-464d-9e20-cfe438bc4841",
"service": "pairs",
"event": "pairUp",
"messageReferenceId": "pair-up-test",
"status": {
"code": "...",
"message": "..."
}
}
Rate limits
Time Interval | Max. Requests |
---|---|
1 minute | 250 |
1 hour | 1500 |
1 day | 1500 |
MDATA
End points
Environment | REST | WEBSOCKET |
---|---|---|
UAT | https://api.uat.toradev.net/dev | wss://api.uat.toradev.net/dev/mdata |
PROD | https://api-a.toratrading.net/v1 | wss://api-a.toratrading.net/v1/mdata |
POEMS AMER | Not available | wss://api-amer.macpoems.refinitiv.com/mdata/v1 |
POEMS EMEA | Not available | wss://api-emea.macpoems.refinitiv.com/mdata/v1 |
POEMS APAC | Not available | wss://api-apac.macpoems.refinitiv.com/mdata/v1 |
Authentication
An access token is required in order to interact with the market data APIs. This can be obtained by sending an HTTP request as described below. Access tokens expire after 24 hours.
Authentication request example
curl -X POST
-H "Content-Type: application/json"
-d '{
"type":"Key",
"payload":{
"accessKeyID":"<yourAccessKey>",
"secretAccessKey":"<yourSecretAccessKey>"
}
}'
$REST_ENDPOINT/auth/authenticate
Parameter | Values |
---|---|
type | The authentication type - may be "Key" or "Credentials". Only "Key" is supported at the moment. |
payload | The accessKeyID and secretAccesKey. Request one from your sales representative |
Authentication successful response example
{
"accessToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJWMVFIVFFQSjAxOTIxQzNNREZIWSIsImlzcyI6IkNhc3BpYW4gVGVjaCIsImV4cCI6MTY0ODg4NzI1N30.MmJ7ZTr9mSK-bsgNif5HyjU8Z9__WGTN_oGvUxdZ3XI",
"expiration":"2022-04-02T08:14:17.818000"
}
Available Exchanges
Exchanges request example:
curl -X POST
-H "Authorization: <yourSecretAccessKey>"
$REST_ENDPOINT/refdata/exchanges
Exchanges response example:
[
{
"name": "CS.NULL.JAPAN.FU.JPY",
"code": "CS.NULL.JAPAN.FU.JPY"
},
{
"name": "CS.NULL.JAPAN.INJ.JPY",
"code": "CS.NULL.JAPAN.INJ.JPY"
},
{
"name": "CS.NULL.JAPAN.JNX.JPY",
"code": "CS.NULL.JAPAN.JNX.JPY"
},
{
"name": "CS.NULL.JAPAN.NG.JPY",
"code": "CS.NULL.JAPAN.NG.JPY"
},
{
"name": "CS.NULL.JAPAN.SP.JPY",
"code": "CS.NULL.JAPAN.SP.JPY"
},
{
"name": "CS.NULL.JAPAN.T.JPY",
"code": "CS.NULL.JAPAN.T.JPY"
}
]
An endpoint to return all available exchanges.
Field | Description |
---|---|
name | The name for this market |
code | The code used for this market |
Exchange Products
Products request example:
curl -X POST
-H "Content-Type: application/json"
-H "Authorization: <yourSecretAccessKey>"
-d '{
"exchanges":["CS.NULL.JAPAN.SP.JPY"]
}'
$REST_ENDPOINT/refdata/products
Products response example:
[
{
"lotSize": "100",
"section": "MAIN",
"displayCode": "3544",
"primaryExchange": "T",
"clientAlias": "",
"name": "SATUDORA HOLDINGS CO LTD",
"gics": "30101010",
"sharesOutstanding": "4742000",
"ric": "3544",
"bbgBase": "3544",
"reutersCode": "3544.SP",
"bbgCode": "3544 JS Equity",
"ISINCode": "JP3319750000",
"sedolCode": "BD9F750",
"nativeCode": "3544",
"IDCCode": "E:S3544:TKY",
"bbgComp": "3544 JP Equity",
"sharesFloat": "2.7358",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.3544",
"prevEarningsDate": "2016-09-29",
"toraMarket": "CS.NULL.JAPAN.SP.JPY",
"toraCode": "CS.NULL.JAPAN.SP.JPY.3544"
},
{
"lotSize": "100",
"lastPrice": "2090",
"closingDate": "2019-01-25T00:00:00.000000",
"basePrice": "2090",
"section": "AMBITIOUS",
"displayCode": "3987",
"primaryExchange": "T",
"clientAlias": "",
"name": "ECOMOTT INC",
"gics": "45102010",
"sharesOutstanding": "4530800",
"marketcap": "9469372000",
"ric": "3987",
"bbgBase": "3987",
"isMother": "M",
"reutersCode": "3987.SP",
"bbgCode": "3987 JS Equity",
"ISINCode": "JP3161290006",
"sedolCode": "BF2MKX1",
"nativeCode": "3987",
"IDCCode": "E:S3987:TKY",
"bbgComp": "3987 JP Equity",
"sharesFloat": "1.6374",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.3987",
"toraMarket": "CS.NULL.JAPAN.SP.JPY",
"toraCode": "CS.NULL.JAPAN.SP.JPY.3987"
}
]
An endpoint to return all products of a certain exchange.
Parameter | Description |
---|---|
exchanges | List of exchanges for which to retrieve the product information |
Product Details
Product Details request example:
curl -X GET
-H "Authorization: <yourSecretAccessKey>"
$REST_ENDPOINT/refdata/product/CS.NULL.JAPAN.SP.JPY.8524
Product Details response example:
[
{
"lotSize": "100",
"lastPrice": "287",
"closingDate": "2018-12-20T00:00:00.000000",
"basePrice": "287",
"section": "MAIN",
"displayCode": "8524",
"primaryExchange": "T",
"clientAlias": "",
"name": "NORTH PACIFIC BANK LTD",
"gics": "40101015",
"sharesOutstanding": "399060179",
"marketcap": "114530271373",
"ric": "8524",
"bbgBase": "8524",
"reutersCode": "8524.SP",
"bbgCode": "8524 JS Equity",
"ISINCode": "JP3843400007",
"sedolCode": "B7VKZP7",
"nativeCode": "8524",
"IDCCode": "E:S8524:TKY",
"bbgComp": "8524 JP Equity",
"sharesFloat": "351.6631",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.8524",
"prevEarningsDate": "2016-11-11",
"toraMarket": "CS.NULL.JAPAN.SP.JPY",
"toraCode": "CS.NULL.JAPAN.SP.JPY.8524"
}
]
An endpoint to get the details of a certain product.
Parameter | Decription |
---|---|
product_code | The product code for the retrieved product |
Each product can have a subset of the following fields populated, according to its asset type.
Parameter | Type | Format | Description |
---|---|---|---|
avgVol5D | string | - | Average traded volume in the last 5 working days |
avgVol10D | string | - | Average traded volume in the last 10 working days |
avgVol20D | string | - | Average traded volume in the last 20 working days |
avgVol30D | string | - | Average traded volume in the last 30 working days |
avgVol60D | string | - | Average traded volume in the last 60 working days |
avgVol90D | string | - | Average traded volume in the last 90 working days |
avgVol100D | string | - | Average traded volume in the last 100 working days |
avgVol3M | string | - | Average traded volume in the last 3 months |
avgVol6M | string | - | Average traded volume in the last 6 months |
basePrice | string | - | The base price |
bbgBase | string | - | Bloomberg Base code for a specic instrument |
bbgCode | string | - | Corresponding Bloomberg code for this security |
bbgComp | string | - | Bloomberg Composite code |
beta | string | - | Coefficient describing the activity of a security's returns responding to swings in the market |
caspianCode | string | - | The code for a crypto security used inside the Caspian system |
ccyFrom | string | - | FX pair base currency |
ccyTo | string | - | FX pair quote currency |
clientAlias | |||
closingDate | string | DATE | Closing date for a derivative |
cm1 | string | DATE | Currency from (applicable for FX pairs) |
cm2 | string | DATE | Currency to (applicable for FX pairs) |
contractYearMonth | string | - | Contract year month |
currency | string | - | Currency this product is being traded in |
currentDate | string | - | |
cusipCode | string | - | CUSIP code for this security |
displayCode | string | - | Code used internally by Compass. It uniquely defines codes inside a TORA market family |
earningsDate | |||
exdivident | |||
expireDate | string | DATE | Date when a future / spread / option expires |
externalID | |||
faceValue | string | - | A stock's face value is the initial cost of the stock, as indicated on the certificate of the stock in question; a bond's face value is the dollar figure due to be paid to the investor, once the bond reaches maturity. |
fixingDate | string | - | The fixing date is the date at which the difference between the prevailing spot market rate and the agreed-upon rate is calculated. |
gics | string | - | Global Industry Classification Standard (GICS) code |
giveupBroker | string | - | Give up is a procedure in securities or commodities trading where an executing broker places a trade on behalf of another broke |
IDCCode | string | - | IDC Code |
IPODate | string | - | Date of the IPO for the specified symbol |
isAuction | string | - | Signals whether the symbol represents an auction |
isExceptShortSell | |||
isExpired | - | - | Signals whether the instrument is a future/ spread/ option that is no longer tradeable |
ISINCode | string | - | The corresponding ISIN Code of the specified symbol |
isMother | |||
idNDF | - | - | Non disclosure forward |
isShortSell | |||
issue | |||
issuer | string | - | The entity creating the security/ symbol |
lastPrice | string | - | Value representing the last price the security was traded at. Not all instruments have this field populated |
lotSize | string | - | Lot size of the instrument |
marginFlag | |||
market | - | - | The Tora Market family of this specific instrument: Format: INSTRUMENTTYE.INSTRUMENTSUBTYPE.COUNTRY |
marketcap | string | - | Market capitalization |
minSize | - | - | Minimum size for an order |
multiplier | |||
name | string | - | Description of the symbol |
nativeCode | string | - | The code used by the exchange to refer to it |
nativeLanguage | - | - | The language of the exchange where the instrument was listed |
optionType | |||
prevEarningsDate | string | - | Previous earning date |
primaryExchange | string | - | The primary exchange were the instrument is listed |
putCall | |||
reutersCode | string | - | Reuters code for the symbol |
ric | string | - | The Reuters code without the exchange suffix |
section | string | - | The exchange section to which the symbol belongs to |
sectionMIC | string | - | Section MIC code |
sedolCode | string | - | SEDOL code for the symbol |
settlementDate | |||
settlementDateOffset | |||
sharesFloat | |||
sharesOutstanding | |||
sicc | string | - | SICC code for the symbol |
significantDecimal | |||
significantIntegers | |||
spreadType | |||
strike | string | - | The strike of the spread |
subtype | |||
tenor | |||
tickRule | string | - | The tick rule definition of the symbol |
triggerPrice | |||
type | string | - | Type of instrument, for example: "FX", "CS", "FWD" |
underlyingToraCode | string | - | Underlying Tora code for the symbol (only applicable for futures, spreads and options) |
Product Search
Search for instruments where either the "name" or "ric" contains the text "PACIFIC"
curl -X POST
-H "Content-Type: application/json"
-H "Authorization: <yourSecretAccessKey>"
-d '{
"conditions":[{"anyOf": ["name", "ric"], "contains": "PACIFIC"}],
"limit": "1000"
}'
$REST_ENDPOINT/refdata/search-products
Search response example:
[
{
"lotSize": "100",
"displayCode": "7532",
"primaryExchange": "T",
"clientAlias": "",
"name": "PAN PACIFIC INTERNATIONAL HO",
"gics": "25503020",
"sharesOutstanding": "158299060",
"ric": "7532",
"reutersCode": "7532.INJ",
"ISINCode": "JP3639650005",
"sedolCode": "6269861",
"settlementDateOffset": "3",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.7532",
"prevEarningsDate": "2019-05-08",
"toraMarket": "CS.NULL.JAPAN.INJ.JPY",
"toraCode": "CS.NULL.JAPAN.INJ.JPY.7532"
},
{
"lotSize": "100",
"displayCode": "5541",
"primaryExchange": "T",
"clientAlias": "",
"name": "PACIFIC METALS CO LTD",
"gics": "15104020",
"sharesOutstanding": "19577071",
"ric": "5541",
"reutersCode": "5541.INJ",
"ISINCode": "JP3448000004",
"sedolCode": "6666343",
"settlementDateOffset": "3",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.5541",
"prevEarningsDate": "2019-05-10",
"toraMarket": "CS.NULL.JAPAN.INJ.JPY",
"toraCode": "CS.NULL.JAPAN.INJ.JPY.5541"
}
]
Search for instruments named "PACIFIC METALS CO LTD" which have "toraMarket" as "JAPAN" and for which the "displayCode" matches the pattern "5541.*"
curl -X POST
-H "Content-Type: application/json"
-H "Authorization: <yourSecretAccessKey>"
-d '{
"conditions":[
{"anyOf":["name"], "isEqualTo": "PACIFIC METALS CO LTD"},
{"anyOf":["toraMarket"], "contains": "JAPAN"},
{"anyOf":["displayCode"], "matches": "5541.*"}
],
"limit": "5"
}'
$REST_ENDPOINT/refdata/search-products
Search response example:
[
{
"lotSize": "100",
"displayCode": "5541",
"primaryExchange": "T",
"clientAlias": "",
"name": "PACIFIC METALS CO LTD",
"gics": "15104020",
"sharesOutstanding": "19577071",
"ric": "5541",
"reutersCode": "5541.INJ",
"ISINCode": "JP3448000004",
"sedolCode": "6666343",
"settlementDateOffset": "3",
"subtype": "ORD",
"issuer": "CS.NULL.JAPAN.T.JPY.5541",
"prevEarningsDate": "2019-05-10",
"toraMarket": "CS.NULL.JAPAN.INJ.JPY",
"toraCode": "CS.NULL.JAPAN.INJ.JPY.5541"
}
]
An endpoint to get products based on given conditions.
Parameter | Description |
---|---|
conditions | A list of search conditions, joined by the AND operator |
conditions[].anyOf | One or more fields on which this filter is being applied |
conditions[].contains | A filter that checks whether the anyOf fields contain a given value |
conditions[].isEqualTo | A filter that checks whether the anyOf fields are equal to a given value |
conditions[].matches | A filter that checks whether the anyOf fields match the given regex expression |
limit | The maximum number of results to return |
Realtime Market Data
The following section describes the interaction between a client application and the Real-time Data service, using web socket technology. In order to use this service, a token must first be obtained, as described in the authentication section.
Please be aware that Realtime Data service can be used only for FX live prices.
1. Connection initialization
A connection initialization example in javascript:
var socket = new WebSocket('$WEBSOCKET_ENDPOINT/realtime/stream?access_token=<yourAccessToken>');
When establishing the websocket connection, the user must supply the access token via one of the following ways:
- By setting the HTTP header Authorization and connecting to $WEBSOCKET_ENDPOINT/realtime/stream
Authorization: access_token
- By adding the access_token parameter in the URL $WEBSOCKET_ENDPOINT/realtime/stream?access_token=<yourAccessToken>
If the token is not specified or if it's invalid/expired, the websocket connection will be closed by the server with one of the following reasons mentioned in the CloseState (see RFC 6455 on protocol details):
- 3000 - Access token not found
- 3001 - Supplied token is not valid
- 3002 - Token has expired
Once the connection is established successfully, the user can proceed with sending requests to the service. The connection will be closed by the service when the token expires. In order to keep the old connection alive, the user must generate a new valid token and make a Token Refresh request as described in Token Refresh section. The Token Refresh request will replace the token used for the current connection with the newly generated one. If the Token Refresh request succeeds the connection lifetime will be extended in accordance to the new token lifetime.
2. Messages format
Both outbound and inbound messages are formatted using JSON standard like below:
{
"requestId": string,
"type": string,
"payload": object
}
where:
-
requestId
- A string to uniquely identify the request -
type
- The message type -
payload
- An object to hold additional data, based on the message type
For outbound messages, the requestId
value will be the same as the one used in generating the
request (except for the protocol error messages - those are returning the requestId
as "N/A").
3. Inbound messages
By inbound messages, we are referring to messages sent by the client to the server.
Real-time subscription example:
socket.send({
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "Subscribe",
"payload": {
"symbol": "EURUSD=EBS",
"symbolType": "Reuters",
"type": "Level1"
}
});
Subscription OK response:
{
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "SubscribeResponse",
"payload": {
"code": 200,
"message": "All OK"
}
}
Subscription with
extraParams
example:
{
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "Subscribe",
"payload": {
"symbol": "EURUSD=EBS",
"symbolType": "Reuters",
"type": "Level2",
"conflation": "1s",
"numberOfLevels": 10,
"extraParams": {
"fx": {
"type": "full-amount",
"quantity": 10000,
"liquidity-providers": ["LP1", "LP2"]
}
}
}
}
3.1 Subscription requests
Subscriptions are used for requesting streaming data for a certain symbol.
Parameter | Type | Format | Description |
---|---|---|---|
requestId | string | - | A unique string identifying the request; it's recommended that UUID is used for populating this field |
type | string | ENUM | The type of message (for subscriptions, must be Subscribe ) |
payload | object | - | An object holding the subscription parameters |
payload.symbol | string | - | The symbol for which market data is requested |
payload.symbolType | string | ENUM | The type of symbol used for this subscription. Possible values: Reuters , Bloomberg , Tora ; if symbol type is not specified, the default (Reuters ) is used |
payload.type | string | ENUM | Market data type; can be Level1 (for trade and quote data) or Level2 (for depth data) |
payload.numberOfLevels | number | INT | The number of depth levels (for Level2 subscriptions). Default value is 20. Max value is 100 |
payload.conflation | string | - | If the conflation value is different than None , updates will be conflated and only sent at the specified time interval. Default value is 330ms. |
payload.extraParams | object | - | An optional object holding extra information regarding the subscription |
payload.extraParams.fx | object | - | An object holding extra information regarding a FX subscription |
payload.extraParams.fx.type | string | ENUM | The type of FX subscription. Possible values: sweepable , full-amount , vwap |
payload.extraParams.fx.quantity | int | - | Quantity of interest. Mandatory for FX types vwap and full-amount . Optional for sweepable |
payload.extraParams.fx.liquidity-providers | object string list | - | List of liquidity providers that should be considered when computing market data. In order to build a valid list, please contact your representative in order to determine valid values |
Possible response codes for subscriptions messages:
Code | Description |
---|---|
200 | All OK |
201 | Duplicated Request ID |
202 | Invalid subscription symbol |
203 | Invalid subscription type |
204 | Another subscription already exists |
205 | Not authorized |
206 | Subscription limit reached |
207 | Invalid symbol type |
208 | Invalid number of levels |
209 | Symbol type not currently supported |
211 | Missing FX quantity. |
212 | Incorrect extra parameters. |
213 | Invalid JSON. |
214 | Missing FX type. |
215 | Invalid FX type. |
216 | Invalid liquidity providers field value. |
218 | Invalid FX quantity. |
500 | Internal server error. |
Real-time unsubscription example:
socket.send({
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "Unsubscribe",
"payload": {
"subscribeRequestId": "96113dcc-734d-42d3-b347-965a4218e0a2"
}
});
Unsubscription response when the request was OK:
{
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "UnsubscribeResponse",
"payload": {
"code": 300,
"message": "All OK"
}
}
Unsubscription response when the
subscribeRequestId
is not found:
{
"requestId": "N/A",
"type": "ProtocolError",
"payload": {
"code": 301,
"message": "Subscription not found"
}
}
3.2 Unsubscription requests
Unsubscriptions are used to terminate an active streaming request, based on the original request ID.
Parameter | Type | Format | Description |
---|---|---|---|
requestId | string | - | A unique string identifying the request |
type | string | ENUM | The message type (for unsubscriptions, must be Unsubscribe ) |
payload | object | - | An object holding the unsubscription parameters |
payload.subscribeRequestId | string | - | The request id for which the unsubscription is done |
Possible response codes for unsubscriptions messages:
Code | Description |
---|---|
300 | All OK |
301 | Subscription not found |
302 | Duplicated requestId |
3.3 Token refresh requests
Token refreshes are used to replace an expiring token with a newly generated one.
Token refresh request example:
socket.send({
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "TokenRefresh",
"payload": {
"accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJSZWFsVGltZUFQSSIsImlzcyI6IkNhc3BpYW4gVGVjaCIsImV4cCI6MTY0MTg5OTE0NH0.0YItnz0Uwc3Gf11IKHAuzeO_c5N1LZb__S51OQwh-NY"
}
});
Parameter | Type | Format | Description |
---|---|---|---|
requestId | string | - | A unique string identifying the request |
type | string | ENUM | The message type (for unsubscriptions, must be Unsubscribe ) |
payload | object | - | An object holding the refresh request details |
payload.accessToken | string | - | The newly obtained access token that will replace the old one |
4. Outbound messages
By outbound messages, we are referring to messages sent by the server to the client.
4.1 Level1 updates
An example of Level1 update:
{
"requestId":"344300cc-734d-42d3-b347-965a4218e0a2",
"type":"Level1",
"payload":
{
"ask":1.06495,
"askSize":1000000,
"bid":1.06493,
"bidSize":1000000,
"tradePrice":1.06494
}
}
As a result of a successful subscribe for Level1, the server will send quote and trade updates to the client.
The updates can contain one or more of the below fields as part of payload
:
Field | Type | Format | Description |
---|---|---|---|
ask | number | DEC | The last ask price |
askSize | number | DEC | The last ask size |
bid | number | DEC | The last bid price |
bidSize | number | DEC | The last bid size |
tradePrice | number | DEC | The last traded price |
tradeSize | number | DEC | The last traded size |
volume | string | - | Traded volume |
percentChange | string | - | Price percentage change as compared to the open price |
vwap | string | - | Volume weighted average price for the day |
tick | string | enum | The market tone, U for up-tick, D for down-tick |
open | string | - | Price at market open |
close | string | - | Price at market close |
high | string | - | Highest recorded price during the market session |
low | string | - | Lowest recorded price during the market session |
4.2 Level2 updates
An example of Level2 update:
{
"requestId": "45953af9-e9fc-4809-8974-fb1badc022ee",
"type": "Level2",
"payload": [
{
"side":"ask",
"price":1.06486,
"size":"11000000"
},
{
"side":"ask",
"price":1.06485,
"size":"5000000"
},
{
"side":"ask",
"price":1.06484,
"size":"1000000"
},
{
"side":"ask",
"price":1.06483,
"size":"0"
},
{
"side":"bid",
"price":1.0648,
"size":"4000000"
},
{
"side":"bid",
"price":1.06479,
"size":"8000000"
},
{
"side":"bid",
"price":1.06478,
"size":"5000000"
},
{
"side":"bid",
"price":1.06477,
"size":"0"
}
]
}
As a result of a successful subscribe for Level2, the server will send depth updates to the client. The very first update will represent the order book snapshot. Subsequent updates will only contain changes to that initial image. To be noted that: * A non-zero size translates to a change of size for a specific price level, for that specific side * A zero size means that the specified price level no longer contains orders
The response will contain the following fields:
Field | Type | Format | Description |
---|---|---|---|
requestId | string | - | A unique string identifying the request |
type | string | ENUM | The message type (in this case Level2 ) |
exchangeTimestamp | string | DATETIME | The time of the last Level2 update (expressed in YYYY-MM-DDTHH:MM:SS.mmmmmm) reported by the exchange. If not available, this field is absent |
caspianTimestamp | string | DATETIME | The time of the last Level2 update (expressed in YYYY-MM-DDTHH:MM:SS.mmmmmm) received by Caspian |
payload[].price | number | DEC | The price level for the array entry |
payload[].size | number | DEC | The size for the array entry |
payload[].side | number | DEC | The side for the array entry; can be ask or bid |
4.3 Token refresh response
A response example for Token refresh
{
"requestId": "96113dcc-734d-42d3-b347-965a4218e0a2",
"type": "TokenRefreshResponse",
"payload": {
"code": 200,
"message": "All OK"
}
}
{
"code": int,
"message": string
}
where:
- code - an integer identifying the error; possible values are:
- 200 - All OK
- 202 - Access Token is invalid.
- 203 - Access Token has expired.
- 204 - Request ID is duplicated.
- message - a descriptive text for the status code
A message sent by the service to confirm the status of a TokenRefresh request.
4.4 General Protocol Errors
A protocol error message for an incorrectly formatted subscription request:
{
"requestId": "N/A", // requestId is always set to N/A for ProtocolError messages
"type": "ProtocolError",
"payload": {
"code": 100,
"message": "Request was not properly formatted as JSON"
}
}
A protocol error is sent by the server when it receives a message that was not properly formatted. The payload of this response will look like this:
{
"code": int,
"message": string
}
where:
- code - an integer identifier for the error having the following possible values:
- 100 - Request not properly formatted.
- 101 -
requestId
not found in the request message. - 102 -
type
not found in the request message. - 103 - Received unknown
type
in the request message. - 104 -
accessToken
not found in the request message. - 105 -
subscribeRequestId
not found in the request message. - message - a descriptive text for the status code
Errors
The TORA API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- Your API key is missing. |
403 | Forbidden -- Your API key is invalid. |
404 | Not Found -- The requested resource could not be found. |
405 | Method Not Allowed -- You tried to access a resource with an invalid HTTP method. |
406 | Not Acceptable -- You requested a format that isn't JSON. |
500 | Internal Server Error -- We had a problem with our server. Please try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
Extra Order Samples
Equities; Index Futures; Stock Futures; Index Options; Stock Options; Calendar Spreads; MultiLeg Instruments
Will be using 2 orders subscriptions:
- orders_sub_1 with symbolType: TORA
- orders_sub_2 with symbolType: reuters
Equities
Register parent order symbolType: tora: cash stock: CS.NULL.JAPAN.T.JPY.7203 Then register and send child order on the parent. Receive fills updates at child level and parent level.
Register Parent order
{
"messageId": "2025-02-06-003",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"broker": "citi",
"side": "BUY",
"quantity": "1000.0",
"limitPrice": "166.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "trdx",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADR",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "c2c9ab18-ceb9-43ae-a9e2-2a84e0f45c18",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACd",
"clientOrderId": "Tt5vhmehgJwAAADR",
"isParent": true,
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 1000.0,
"limitPrice": 166.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "trdx",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T06:42:01.502000Z",
"lastUpdateTime": "2025-02-06T06:42:01.566000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 166000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADR",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAACi",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "1f0e4f0c-573b-4f2d-86bd-46b701492c81",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACd",
"clientOrderId": "Tt5vhmehgJwAAADR",
"isParent": true,
"symbol": "7203.T",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 1000.0,
"limitPrice": 166.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "trdx",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T06:42:01.502000Z",
"lastUpdateTime": "2025-02-06T06:42:01.566000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 166000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADR",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAACi",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-003-1",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"parentId": "AAAS7GekV8gAAACd",
"broker": "citi",
"side": "BUY",
"quantity": "1000.0",
"limitPrice": "150.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADS",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "1ba2434a-ed7e-4321-b4e5-f043e5060364",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACv",
"clientOrderId": "Tt5vhmehgJwAAADS",
"isParent": false,
"parentId": "AAAS7GekV8gAAACd",
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 900.0,
"limitPrice": 150.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADS",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "7203",
"strategyId": "AAAS7GekV8gAAACd",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "babb546f-b74f-4b8e-99b4-e2ac1e575eb0",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACv",
"clientOrderId": "Tt5vhmehgJwAAADS",
"isParent": false,
"parentId": "AAAS7GekV8gAAACd",
"symbol": "7203.T",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 900.0,
"limitPrice": 150.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADS",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "7203",
"strategyId": "AAAS7GekV8gAAACd",
"strategyType": -1,
"isHidden": false
}
]
}
}
Child order level fill, TORA symbolType
{
"messageId": "acdcd854-1f80-40e6-a12b-560a9417e1dd",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [{
"orderId": "AAAS7GekV8gAAACv",
"clientOrderId": "Tt5vhmehgJwAAADS",
"isParent": false,
"parentId": "AAAS7GekV8gAAACd",
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 900.0,
"limitPrice": 150.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "FILD",
"executedQuantity": 900.0,
"creationTime": "2025-02-06T06:48:20.036000Z",
"sendTime": "2025-02-06T06:48:20.091000Z",
"lastUpdateTime": "2025-02-06T06:48:28.231000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 135000.0,
"notionalValue": 135000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "STLMT",
"openClose": "OPEN",
"averagePrice": 150.0,
"dayAvgPx": 150.0,
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADS",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"lastExecutedTime": "2025-02-06 06:48:28.227 GMT 0us",
"workType": "STLMT",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"strategyId": "AAAS7GekV8gAAACd",
"strategyType": -1,
"isHidden": false
}]
}
}
Parent order level fill, TORA symbolType
{
"messageId": "e5e3a204-75f2-4e55-90fd-7e03dd491684",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACd",
"clientOrderId": "Tt5vhmehgJwAAADR",
"isParent": true,
"symbol": "CS.NULL.JAPAN.T.JPY.7203",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 1000.0,
"limitPrice": 166.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "trdx",
"state": "REDG FILD",
"executedQuantity": 900.0,
"creationTime": "2025-02-06T06:42:01.502000Z",
"sendTime": "2025-02-06T06:48:20.091000Z",
"lastUpdateTime": "2025-02-06T06:48:28.231000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 135000.0,
"notionalValue": 151600.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"averagePrice": 150.0,
"dayAvgPx": 150.0,
"externalId": "Tt5vhmehgJwAAADR",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAACi",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"sender": "wsgw_user",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"childQuantity": 900.0
}
]
}
}
Child order level fill, reuters symbolType
{
"messageId": "c0df89c5-9d0b-4b51-901a-d2e1f583c3f9",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACv",
"clientOrderId": "Tt5vhmehgJwAAADS",
"isParent": false,
"parentId": "AAAS7GekV8gAAACd",
"symbol": "7203.T",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 900.0,
"limitPrice": 150.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "FILD",
"executedQuantity": 900.0,
"creationTime": "2025-02-06T06:48:20.036000Z",
"sendTime": "2025-02-06T06:48:20.091000Z",
"lastUpdateTime": "2025-02-06T06:48:28.231000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 135000.0,
"notionalValue": 135000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "STLMT",
"openClose": "OPEN",
"averagePrice": 150.0,
"dayAvgPx": 150.0,
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADS",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"lastExecutedTime": "2025-02-06 06:48:28.227 GMT 0us",
"workType": "STLMT",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"strategyId": "AAAS7GekV8gAAACd",
"strategyType": -1,
"isHidden": false
}
]
}
}
Parent order level fill, reuters symbolType
{
"messageId": "81296212-e396-4b5d-9514-a1428d5e3018",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAACd",
"clientOrderId": "Tt5vhmehgJwAAADR",
"isParent": true,
"symbol": "7203.T",
"exchange": "T",
"broker": "citi",
"side": "BUY",
"quantity": 1000.0,
"limitPrice": 166.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "trdx",
"state": "REDG FILD",
"executedQuantity": 900.0,
"creationTime": "2025-02-06T06:42:01.502000Z",
"sendTime": "2025-02-06T06:48:20.091000Z",
"lastUpdateTime": "2025-02-06T06:48:28.231000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 135000.0,
"notionalValue": 151600.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"averagePrice": 150.0,
"dayAvgPx": 150.0,
"externalId": "Tt5vhmehgJwAAADR",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAACi",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"sender": "wsgw_user",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "7203",
"childQuantity": 900.0
}
]
}
}
Index Futures
Register parent order symbolType: tora: cash stock: FUT.IDX.NK225.OS.JPY.202509 Then register and send child order on the parent.
Register Parent order
{
"messageId": "2025-02-06-004",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "FUT.IDX.NK225.OS.JPY.202509",
"broker": "citi",
"side": "BUY",
"quantity": "3.0",
"limitPrice": "39350.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD2",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "47509f90-e6c1-4043-90d0-1f6aff90e8dc",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAEm",
"clientOrderId": "Tt5vhmehgJwAAAD2",
"isParent": true,
"symbol": "FUT.IDX.NK225.OS.JPY.202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 39350.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T07:12:03.862000Z",
"lastUpdateTime": "2025-02-06T07:12:03.873000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 1.1805E8,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD2",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAEr",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160090018",
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "7f8e7a1c-bf1e-4fb4-a694-76ea5b018706",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAEm",
"clientOrderId": "Tt5vhmehgJwAAAD2",
"isParent": true,
"symbol": "JNIU5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 39350.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T07:12:03.862000Z",
"lastUpdateTime": "2025-02-06T07:12:03.873000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 1.1805E8,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD2",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAEr",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160090018",
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-004-1",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"symbol": "FUT.IDX.NK225.OS.JPY.202509",
"orderId": "AAAS7GekV8gAAAEn",
"parentId": "AAAS7GekV8gAAAEm",
"broker": "citi",
"side": "BUY",
"quantity": "3.0",
"limitPrice": "39340.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "9a4f1a02-8bfe-48cd-91cd-d7f6646122c8",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAE3",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": false,
"parentId": "AAAS7GekV8gAAAEm",
"symbol": "FUT.IDX.NK225.OS.JPY.202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 39340.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "160090018",
"strategyId": "AAAS7GekV8gAAAEm",
"strategyType": -1,
"isHidden": false
}
]
}
Update on reuters symbolType subscription
{
"messageId": "c2e42869-8df9-4dab-9628-23f16652b1dd",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAE3",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": false,
"parentId": "AAAS7GekV8gAAAEm",
"symbol": "JNIU5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 39340.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "160090018",
"strategyId": "AAAS7GekV8gAAAEm",
"strategyType": -1,
"isHidden": false
}
]
}
}
Stock Futures
Register parent order symbolType: tora: cash stock: FUT.CS.KOREA.KS.KRW.HYD-202503 Then register and send child order on the parent.
Register Parent order
{
"messageId": "2025-02-06-007",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "FUT.CS.KOREA.KS.KRW.HYD-202503",
"broker": "citi",
"side": "BUY",
"quantity": "4.0",
"limitPrice": "77500.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "5e93e137-1d03-40ec-8e20-b13fd28272f4",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAGo",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": true,
"symbol": "FUT.CS.KOREA.KS.KRW.HYD-202503",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 4.0,
"limitPrice": 77500.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:16:15.802000Z",
"lastUpdateTime": "2025-02-06T08:16:15.813000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 3100000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAGt",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "K1FHW3000",
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "4df88e9e-a9ae-430a-919c-d3449f4e7706",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAGo",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": true,
"symbol": "HYDH5:KE",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 4.0,
"limitPrice": 77500.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:16:15.802000Z",
"lastUpdateTime": "2025-02-06T08:16:15.813000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 3100000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAGt",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "K1FHW3000",
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-007-1",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"symbol": "FUT.CS.KOREA.KS.KRW.HYD-202503",
"parentId": "AAAS7GekV8gAAAGo",
"broker": "citi",
"side": "BUY",
"quantity": "3.0",
"limitPrice": "77300.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription, child level
{
"messageId": "490f735d-a073-4f85-9009-ca155be3f308",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAG5",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": false,
"parentId": "AAAS7GekV8gAAAGo",
"symbol": "FUT.CS.KOREA.KS.KRW.HYD-202503",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 77300.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "K1FHW3000",
"strategyId": "AAAS7GekV8gAAAGo",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on Tora symbolType subscription, parent level
{
"messageId": "548fe5ff-d184-4c1c-9297-1d0a15b20f4b",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAGo",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": true,
"symbol": "FUT.CS.KOREA.KS.KRW.HYD-202503",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 4.0,
"limitPrice": 77500.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:16:15.802000Z",
"lastUpdateTime": "2025-02-06T08:20:38.223000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 775000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAGt",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "K1FHW3000",
"childQuantity": 3.0
}
]
}
}
Update on reuters symbolType subscription, child level
{
"messageId": "ffed5dd2-b2a6-4171-908e-28631d63bacc",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAG5",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": false,
"parentId": "AAAS7GekV8gAAAGo",
"symbol": "HYDH5:KE",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 77300.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "K1FHW3000",
"strategyId": "AAAS7GekV8gAAAGo",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription, parent level
{
"messageId": "925f4d95-92b4-4012-bafd-4abf96e18df2",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAGo",
"clientOrderId": "Tt5vhmehgJwAAAD3",
"isParent": true,
"symbol": "HYDH5:KE",
"exchange": "KS",
"broker": "citi",
"side": "BUY",
"quantity": 4.0,
"limitPrice": 77500.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:16:15.802000Z",
"lastUpdateTime": "2025-02-06T08:20:38.223000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 775000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD3",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAGt",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "K1FHW3000",
"childQuantity": 3.0
}
]
}
}
Index Options
Register parent order symbolType: tora: cash stock: OPT.IDX.NK225.OS.JPY.202509C31250 Then register and send child order on the parent. Updates on fills, child and parent level
Register Parent order
{
"messageId": "2025-02-06-008",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"broker": "citi",
"side": "BUY",
"quantity": "5.0",
"limitPrice": "8930.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "b94ca4e9-5b10-4083-811c-5b1af794ebfd",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAH6",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": true,
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 5.0,
"limitPrice": 8930.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:23:08.102000Z",
"lastUpdateTime": "2025-02-06T08:23:08.102000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 4.465E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "92e20eb7-8d7e-444a-bc26-1a064bcacef2",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAH6",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": true,
"symbol": "JNI312I5.OS",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 5.0,
"limitPrice": 8930.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:23:08.102000Z",
"lastUpdateTime": "2025-02-06T08:23:08.102000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 4.465E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-008-1",
"service": "orders",
"action": "registerAndSend",
"params": {
"order": {
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"parentId": "AAAS7GekV8gAAAH6",
"broker": "citi",
"side": "BUY",
"quantity": "3.0",
"limitPrice": "8910.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription - child
{
"messageId": "f1225be1-8ca7-40b8-ab63-5bb076b14ac0",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAIL",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"isParent": false,
"parentId": "AAAS7GekV8gAAAH6",
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 8910.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD9",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAH6",
"strategyType": -1,
"isHidden": false
}
]
}
Update on TORA symbolType subscription - parent
{
"messageId": "e884b916-f533-4e12-bfe8-9bf46bf833fc",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [{
"orderId": "AAAS7GekV8gAAAH6",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": true,
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 5.0,
"limitPrice": 8930.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:23:08.102000Z",
"lastUpdateTime": "2025-02-06T08:26:10.578000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 1.786E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAH/",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 3.0
}]
}
}
Update on reuters symbolType subscription - child
{
"messageId": "1eb6c06e-af7b-4e64-b5d6-dc9370f0adbe",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAIL",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"isParent": false,
"parentId": "AAAS7GekV8gAAAH6",
"symbol": "JNI312I5.OS",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 8910.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD9",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAH6",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription - parent
{
"messageId": "c6aea382-872a-4a4f-abbf-6df451f6c8d6",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAH6",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": true,
"symbol": "JNI312I5.OS",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 5.0,
"limitPrice": 8930.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:23:08.102000Z",
"lastUpdateTime": "2025-02-06T08:26:10.578000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 1.786E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAH/",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 3.0
}
]
}
}
Fill on TORA symbolType subscription - child
{
"messageId": "ec776f8b-7372-4065-a333-cc25149890ba",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAIL",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"isParent": false,
"parentId": "AAAS7GekV8gAAAH6",
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 3.0,
"limitPrice": 8910.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "FILD",
"executedQuantity": 3.0,
"creationTime": "2025-02-06T08:26:10.579000Z",
"sendTime": "2025-02-06T08:26:10.581000Z",
"lastUpdateTime": "2025-02-06T08:26:12.606000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 26730.0,
"notionalValue": 26730.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "STLMT",
"openClose": "OPEN",
"averagePrice": 8910.0,
"dayAvgPx": 8910.0,
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAAD9",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"lastExecutedTime": "2025-02-06 08:26:12.603 GMT 0us",
"workType": "STLMT",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"strategyId": "AAAS7GekV8gAAAH6",
"strategyType": -1,
"isHidden": false
}
]
}
}
Fill on TORA symbolType subscription - parent
{
"messageId": "34d48b63-652f-4264-a68e-e38ce627b9b1",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAH6",
"clientOrderId": "Tt5vhmehgJwAAAD8",
"isParent": true,
"symbol": "OPT.IDX.NK225.OS.JPY.202509C31250",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 5.0,
"limitPrice": 8930.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG FILD",
"executedQuantity": 3.0,
"creationTime": "2025-02-06T08:23:08.102000Z",
"sendTime": "2025-02-06T08:26:10.581000Z",
"lastUpdateTime": "2025-02-06T08:26:12.606000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 26730.0,
"notionalValue": 1.788673E7,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"averagePrice": 8910.0,
"dayAvgPx": 8910.0,
"externalId": "Tt5vhmehgJwAAAD8",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAH/",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"sender": "wsgw_user",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 3.0
}
]
}
}
Stock Options
Register parent order symbolType: tora: cash stock: OPT.CS.JAPAN.OS.JPY.7201-202506P350 Then register and send child order on the parent.
Register Parent order
{
"messageId": "2025-02-06-009",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "OPT.CS.JAPAN.OS.JPY.7201-202506P350",
"broker": "citi",
"side": "BUY",
"quantity": "6.0",
"limitPrice": "200.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
Update on reuters symbolType subscription
{
"messageId": "ebe02e2d-b335-4d0c-ad10-a36c192afe77",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [{
"orderId": "AAAS7GekV8gAAAJM",
"clientOrderId": "Tt5vhmehgJwAAAD9",
"isParent": true,
"symbol": "OPT.CS.JAPAN.OS.JPY.7201-202506P350",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 200.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:40:12.026000Z",
"lastUpdateTime": "2025-02-06T08:40:12.026000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 120000.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAAD9",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-009-2",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "OPT.CS.JAPAN.OS.JPY.7201-202506P350",
"parentId": "AAAS7GekV8gAAAJM",
"broker": "citi",
"side": "BUY",
"quantity": "6.0",
"limitPrice": "200.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADB",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "3501e3c9-98b8-4eca-96f9-91a812802a56",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJl",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJM",
"symbol": "OPT.CS.JAPAN.OS.JPY.7201-202506P350",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 200.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAJM",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "d10a2f8d-296b-4f83-bb7c-f4700cfe4d48",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJl",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJM",
"symbol": "7201Y350R5.OS",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 200.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAJM",
"strategyType": -1,
"isHidden": false
}
]
}
}
Calendar Spreads
Register parent order symbolType: tora: cash stock: SPR.FUT.NK225.OS.JPY.202503-202509 Then register and send child order on the parent. Receive fills updates at child level and parent level.
Register Parent order
{
"messageId": "2025-02-06-010",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"broker": "citi",
"side": "BUY",
"quantity": "6.0",
"limitPrice": "0.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADB",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "19128889-34cd-4b69-b888-6f5dc2503f18",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:51:20.186000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "866d6afd-7f11-4fec-b42a-eed677961cfa",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "JNIH5-U5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:51:20.186000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-010-2",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"parentId": "AAAS7GekV8gAAAJ/",
"broker": "citi",
"side": "BUY",
"quantity": "6.0",
"limitPrice": "0.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADC",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription - child level
{
"messageId": "d21bd7c4-480c-4129-8984-a0e1bf718638",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKQ",
"clientOrderId": "Tt5vhmehgJwAAADC",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJ/",
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADC",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "160030218",
"strategyId": "AAAS7GekV8gAAAJ/",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on TORA symbolType subscription - parent level
{
"messageId": "d72fc4d7-1026-4f76-a146-90d196a11f38",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:53:52.674000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKE",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 6.0
}
]
}
}
Update on reuters symbolType subscription - child level
{
"messageId": "0e617a19-121a-487b-a6e2-d017622dd691",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKQ",
"clientOrderId": "Tt5vhmehgJwAAADC",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJ/",
"symbol": "JNIH5-U5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADC",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"productNativeCode": "160030218",
"strategyId": "AAAS7GekV8gAAAJ/",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription - parent level
{
"messageId": "d42880e6-25bd-400c-9ee3-f872e7b2ea6a",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "JNIH5-U5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:53:52.674000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKE",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 6.0
}
]
}
}
Fill update on TORA symbolType subscription - child level
{
"messageId": "0a98310c-24bf-4b7a-a038-92d0de8e42e6",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKQ",
"clientOrderId": "Tt5vhmehgJwAAADC",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJ/",
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:53:52.682000Z",
"lastUpdateTime": "2025-02-06T08:53:52.688000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADC",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"strategyId": "AAAS7GekV8gAAAJ/",
"strategyType": -1,
"isHidden": false
}
]
}
}
Fill update on TORA symbolType subscription - parent level
{
"messageId": "73ef80ea-8a79-455d-93c1-3496879e3fa5",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "SPR.FUT.NK225.OS.JPY.202503-202509",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:53:52.682000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKE",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 6.0
}
]
}
}
Fill update on reuters symbolType subscription - child level
{
"messageId": "97ed70ba-4917-413f-8f6d-70c3dabd6d45",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKQ",
"clientOrderId": "Tt5vhmehgJwAAADC",
"isParent": false,
"parentId": "AAAS7GekV8gAAAJ/",
"symbol": "JNIH5-U5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:53:52.682000Z",
"lastUpdateTime": "2025-02-06T08:53:52.688000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADC",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"strategyId": "AAAS7GekV8gAAAJ/",
"strategyType": -1,
"isHidden": false
}
]
}
}
Fill update on reuters symbolType subscription - parent level
{
"messageId": "33c47769-dde9-4a23-b32c-a01ff09cf566",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAJ/",
"clientOrderId": "Tt5vhmehgJwAAADB",
"isParent": true,
"symbol": "JNIH5-U5",
"exchange": "OS",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:51:20.186000Z",
"lastUpdateTime": "2025-02-06T08:53:52.682000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADB",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKE",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"productNativeCode": "160030218",
"childQuantity": 6.0
}
]
}
}
MultiLeg Instruments
Register parent order symbolType: tora: cash stock: SPR.FUT.WTCLLCO.ICE.USD.202509-202509 Then register and send child order on the parent. Receive fills updates at child level and parent level.
Register Parent order
{
"messageId": "2025-02-06-011",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"broker": "citi",
"side": "BUY",
"quantity": "11.0",
"limitPrice": "0.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADM",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription
{
"messageId": "625b00f6-b861-4c6a-8128-53b5d3c3e281",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T08:58:47.706000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
Update on reuters symbolType subscription
{
"messageId": "1036a3ed-3af8-4ddc-8386-d2882a504621",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "WTCL-LCOU5",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T08:58:47.706000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "UNKNOWN",
"limitStatus": "PLIM",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 0.0
}
]
}
}
Register and send Child on the Parent order
{
"messageId": "2025-02-06-011-3",
"service": "orders",
"action": "register",
"params": {
"order": {
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"parentId": "AAAS7GekV8gAAAKq",
"broker": "citi",
"side": "BUY",
"quantity": "6.0",
"limitPrice": "0.0",
"flowType": "DMA",
"brokerAccount": "TestAcc1",
"allocationMethod": "METHOD_1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"tag": "forA",
"synthType": "swp",
"openClose": "OPEN",
"condition": "WORKED",
"orderType": "CD",
"skipLimitChecks": "false",
"clientOrderId": "Tt5vhmehgJwAAADG",
"symbolType": "TORA"
}
}
}
Update on TORA symbolType subscription - child level
{
"messageId": "fc4bff35-2b6d-4db3-8b97-814ef188f5c0",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAALA",
"clientOrderId": "Tt5vhmehgJwAAADG",
"isParent": false,
"parentId": "AAAS7GekV8gAAAKq",
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADG",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAKq",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on TORA symbolType subscription - parent level
{
"messageId": "564ae409-0610-42ce-85e3-dc5f273d4057",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T09:03:06.645000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKv",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 6.0
}
]
}
}
Update on reuters symbolType subscription - child level
{
"messageId": "15142a6d-db0d-4738-a277-989079118a78",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAALA",
"clientOrderId": "Tt5vhmehgJwAAADG",
"isParent": false,
"parentId": "AAAS7GekV8gAAAKq",
"symbol": "WTCL-LCOU5",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"lastUpdateTime": "",
"allocationMethod": "METHOD_1",
"tag": "forA",
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADG",
"lastUpdateOwner": "wsgw_user",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"strategyId": "AAAS7GekV8gAAAKq",
"strategyType": -1,
"isHidden": false
}
]
}
}
Update on reuters symbolType subscription - parent level
{
"messageId": "bad2b00a-c287-4d45-ae3a-af21ee1220dd",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "WTCL-LCOU5",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T09:03:06.645000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKv",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 6.0
}
]
}
}
Fill update on TORA symbolType subscription - child level
{
"messageId": "f9b7b334-a986-47c4-aa0b-51db0348e9c6",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAALA",
"clientOrderId": "Tt5vhmehgJwAAADG",
"isParent": false,
"parentId": "AAAS7GekV8gAAAKq",
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T09:03:06.667000Z",
"lastUpdateTime": "2025-02-06T09:03:06.724000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADG",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"strategyId": "AAAS7GekV8gAAAKq",
"strategyType": -1,
"isHidden": false
}
]
}
}
Fill update on TORA symbolType subscription - parent level
{
"messageId": "bf9bbc2e-5e4b-4348-a3fa-7586ca02762e",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG:2",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T09:03:06.667000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKv",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 6.0
}
]
}
}
Fill update on reuters symbolType subscription - child level
{
"messageId": "f9b7b334-a986-47c4-aa0b-51db0348e9c6",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_1"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAALA",
"clientOrderId": "Tt5vhmehgJwAAADG",
"isParent": false,
"parentId": "AAAS7GekV8gAAAKq",
"symbol": "SPR.FUT.WTCLLCO.ICE.USD.202509-202509",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 6.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB2",
"state": "REDG",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T09:03:06.667000Z",
"lastUpdateTime": "2025-02-06T09:03:06.724000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"currentMarginFlag": "None",
"externalId": "Tt5vhmehgJwAAADG",
"lastUpdateOwner": "wsgw_user",
"limitStatus": "APPR",
"manualExecution": "N",
"margin": "None",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"strategyId": "AAAS7GekV8gAAAKq",
"strategyType": -1,
"isHidden": false
}
]
}
}
Fill update on reuters symbolType subscription - parent level
{
"messageId": "75fa0328-c94c-46fc-a539-4a1bfa5a0e11",
"service": "orders",
"event": "update",
"params": {
"subscriptionId": "orders_sub_2"
},
"data": {
"orders": [
{
"orderId": "AAAS7GekV8gAAAKq",
"clientOrderId": "Tt5vhmehgJwAAADM",
"isParent": true,
"symbol": "WTCL-LCOU5",
"exchange": "ICE",
"broker": "citi",
"side": "BUY",
"quantity": 11.0,
"limitPrice": 0.0,
"owner": "wsgw_user",
"flowType": "WORKED",
"brokerAccount": "TestAcc1",
"internalAccount": "IA1",
"tradeBook": "TB1",
"state": "REDG:2",
"executedQuantity": 0.0,
"creationTime": "2025-02-06T08:58:47.706000Z",
"lastUpdateTime": "2025-02-06T09:03:06.667000Z",
"allocationMethod": "METHOD_1",
"tag": "forA",
"status": "OK",
"executedValue": 0.0,
"notionalValue": 0.0,
"previousExecutedQuantity": 0.0,
"previousExecutedValue": 0.0,
"synthType": "swp",
"condition": "WORKED",
"orderType": "CD",
"openClose": "OPEN",
"externalId": "Tt5vhmehgJwAAADM",
"lastUpdateOwner": "wsgw_user",
"limitRequestId": "AAAS7GekV8gAAAKv",
"limitStatus": "APPR",
"manualExecution": "N",
"creatorComponent": "WSGW",
"workType": "CD",
"originator": "wsgw_user",
"pendingQuantity": 0.0,
"childQuantity": 6.0
}
]
}
}