Skip to content

Cancellations and Corrections

Cancellations and Corrections data are 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:


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


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 CanCor data to any type of transaction data are definied in config .api.cfg.cancorSettings, which is defined in api.config.q script. 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 the CanCor data 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 CanCor data is selected in the DAPs alongside the main transaction data being queried (the table argument to getTicks) 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.getCancor inside getTicks and temporarily stored in the args parameter.

  • The CanCor data is then extracted from the args parameter in the aggregator by the call of .api.join.extractRefTabs inside .api.join.apis. It is then applied to the main transaction data by the call of .api.join.applyCanCor inside .api.join.apis.

  • The CanCor data is then dropped in the aggregator, as are all values in the args parameter, as only data is returned from .api.join.apis. However, if a user wants to query CanCor data directly, either getTicks or getData can be called in the gateway directly with `table=`CanCor.