Cancellations and Corrections
This page explains how to apply cancellations and corrections data.
Cancellations and corrections data is stored in the date partitioned CanCor table.
The getTicks API can be prompted to apply cancellation and correction data to an original transaction data table by passing in the boolean-type parameter `applyCanCor e.g.:
args: (!) . flip (
(`table; `Trade );
(`startTS; 2023.07.28D09:00:00.000000000 );
(`endTS; 2023.07.28D10:00:00.000000000 );
(`idList; `AMD );
(`applyCanCor; 1b )
);
last gw(`getTicks;args;`callback;()!())
(where gw is a handle to the service gateway)
To illustrate how the cancellations and corrections data is applied, consider these raw data subselections from the Trade and CanCor tables:
Trade
| eventTimestamp | instrumentID | price | volume |
|---|---|---|---|
| 2023.07.28D09:00:00.000000000 | AMD | 116.97 | 55919 |
| 2023.07.28D09:05:00.000000000 | AMD | 119 | 62883 |
| 2023.07.28D09:10:00.000000000 | AMD | 119.27 | 91811 |
| 2023.07.28D09:15:00.000000000 | AMD | 112.28 | 63351 |
| 2023.07.28D09:20:00.000000000 | AMD | 119.81 | 64018 |
| 2023.07.28D09:25:00.000000000 | AMD | 119.05 | 35807 |
| 2023.07.28D09:30:00.000000000 | AMD | 114.79 | 39626 |
| 2023.07.28D09:35:00.000000000 | AMD | 111.59 | 42477 |
| 2023.07.28D09:40:00.000000000 | AMD | 117.47 | 56430 |
| 2023.07.28D09:45:00.000000000 | AMD | 116.63 | 7099 |
| 2023.07.28D09:50:00.000000000 | AMD | 116.67 | 43449 |
| 2023.07.28D09:55:00.000000000 | AMD | 110.93 | 90812 |
| 2023.07.28D10:00:00.000000000 | AMD | 114.19 | 84985 |
CanCor
| eventTimestamp | instrumentID | canCorType | origPrice | origVolume | newPrice | newVolume |
|---|---|---|---|---|---|---|
| 2023.07.28D09:05:00.000000000 | AMD | Correction | 119 | 62883 | 112.15 | 61935 |
| 2023.07.28D09:15:00.000000000 | AMD | Correction | 112.28 | 63351 | 111.42 | 98573 |
| 2023.07.28D09:30:00.000000000 | AMD | Correction | 114.79 | 39626 | 113.95 | 36492 |
| 2023.07.28D09:50:00.000000000 | AMD | Cancellation | 116.67 | 43449 | ||
| 2023.07.28D09:55:00.000000000 | AMD | Cancellation | 110.93 | 90812 |
There are three corrections. getTicks overwrites the price and volume of the raw Trade data using newPrice and newVolume in the CanCor data and returns the amended data to the caller. There are two cancellations. getTicks removes the matching rows before returning the amended data to the caller.
The returned result is:
| eventTimestamp | instrumentID | price | volume | sequenceNumber |
|---|---|---|---|---|
| 2023.07.28D09:00:00.000000000 | AMD | 116.97 | 55919 | 1109 |
| 2023.07.28D09:05:00.000000000 | AMD | 112.15 | 61935 | 1110 |
| 2023.07.28D09:10:00.000000000 | AMD | 119.27 | 91811 | 1111 |
| 2023.07.28D09:15:00.000000000 | AMD | 111.42 | 98573 | 1112 |
| 2023.07.28D09:20:00.000000000 | AMD | 119.81 | 64018 | 1113 |
| 2023.07.28D09:25:00.000000000 | AMD | 119.05 | 35807 | 1114 |
| 2023.07.28D09:30:00.000000000 | AMD | 113.95 | 36492 | 1115 |
| 2023.07.28D09:35:00.000000000 | AMD | 111.59 | 42477 | 1116 |
| 2023.07.28D09:40:00.000000000 | AMD | 117.47 | 56430 | 1117 |
| 2023.07.28D09:45:00.000000000 | AMD | 116.63 | 7099 | 1118 |
| 2023.07.28D10:00:00.000000000 | AMD | 114.19 | 84985 | 1121 |
To clarify, the two trades at 09:50 and 09:55 have been removed and the price and volume cell values for the three trades at 09:05, 09:15 and 09:30 have been updated.
- The columns to match
CanCordata to any type of transaction data are defined in config.api.cfg.cancorSettings, which is defined inapi.config.qscript. For example:
| table | canCorTable | columnsToMatchCancelsTo | columnsToMatchCorrectionsTo | columnsToCorrectWith |
|---|---|---|---|---|
| Trade | CanCor | `eventTimestamp`instrumentID`origPrice`origVolume | `eventTimestamp`instrumentID`origPrice`origVolume | `newPrice`newVolume |
-
The default match columns in the FX accelerator packages are `eventTimestamp, `instrumentID, `origPrice, `origVolume, however, they may be changed depending on user preference. If any of `origPrice and/or `origVolume are used to match with, they are matched to `price and/or `volume respectively.
-
To match cancels, we find the rows with equal match column values with the
?(search) function and remove those rows from the aggregated DAP results. -
To match corrections, in addition to the columns to match on, we set the columns to correct in the config
.api.cfg.cancorSettings. Altogether, we left join on theCanCordata to the main transaction data using the match cols and overwrite the cols to correct. If any of `newPrice and/or `newVolume are used to correct, they overwrite `price and/or `volume respectively. -
The
CanCordata is selected in the DAPs alongside the main transaction data being queried (the table argument togetTicks) and only applied to that data in the aggregator. It is subject to the exact same `startTS/`endTS restraints as the main transaction data is. It is selected in the DAPs by the call of.api.cancor.getCancorinsidegetTicksand temporarily stored in theargsparameter. -
The
CanCordata is then extracted from theargsparameter in the aggregator by the call of.api.join.extractRefTabsinside.api.join.apis. It is then applied to the main transaction data by the call of.api.join.applyCanCorinside.api.join.apis. -
The
CanCordata is then dropped in the aggregator, as are all values in theargsparameter, as only data is returned from.api.join.apis. However, if a user wants to queryCanCordata directly, eithergetTicksorgetDatacan be called in the gateway directly with `table=`CanCor.