Skip to content

FX Functionality in getTicks

fxBookType

FX specific functionality is specified via the fxBookType argument. Further releases will provide functionality to construct an FX price book in various ways.

The fxBookType option rawBook constructs a book without any mathematical operation on the FX market data on a per tick basis. The numLevels option is an integer input to construct a book for those levels where the data is available. In the below example we set numLevels value to be 3 but the Liquidity Provider was only providing pricing for level 0 at this time. In addition, filtering functionality available as part of getTicks can be used in conjunction with the FX asset specific functionality. This is demonstrated in the example below with the columns parameter to select only the columns of interest.

The scope argument is required to allow the correct routing. The value provided in the examples below is correct for the KX Flow Accelerator.

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          2023.07.21D00:00:00);
    (`endTS;            2023.07.22D00:00:00);
    (`columns;          `instrumentID`src`baseCcy`level`bidPrice`askPrice`bidSize`askSize);
    (`numLevels;        3i);
    (`fxBookType;       `rawBook)
    );

last gw(`getTicks;args;`callback;()!())

eventTimestamp                instrumentID src          baseCcy level bidPrice  askPrice  bidSize  askSize
-----------------------------------------------------------------------------------------------------------
2023.07.21D13:50:03.261611000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:50:07.363004000 EUR/USD      LP2      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:29.260346000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:32.656842000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:36.265531000 EUR/USD      LP2      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:48.758550000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:48.859182000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:52.854453000 EUR/USD      LP2      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:52:57.158072000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:53:01.204271000 EUR/USD      LP1      EUR     0     1.1132    1.1133    1000000  1000000
2023.07.21D13:53:05.055614000 EUR/USD      LP2      EUR     0     1.1132    1.1133    1000000  1000000

The fxBookType option VWAP constructs a volume-weighted average price from the quote data. The vwap calculations are done by liquidity provider (src). The band(s) are input via the vwapSize parameter

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          2023.08.22D08:00:00);
    (`endTS;            2023.08.22D08:15:00);
    (`idList;           `A);
    (`fxBookType;       `VWAP);
    (`vwapSize;         (1000000i;3000000i;5000000i))
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice
--------------------------------------------------------------------------------
A            2023.08.22D08:13:46.517000000 A   1000000 1.27     1000000 1.3
A            2023.08.22D08:13:46.517000000 A   3000000 1.27     3000000 1.313
A            2023.08.22D08:13:46.517000000 A   5000000 1.266    5000000 1.316
A            2023.08.22D08:13:46.517000000 B   1000000 1.28     1000000 1.3
A            2023.08.22D08:13:46.517000000 B   3000000 1.28     3000000 1.3
A            2023.08.22D08:13:46.517000000 B   5000000 1.28     5000000 1.3

Similarly, for periods where one sided rates are streaming from the liquidity provider, the vwap will be calculated on the liquidity of the available side while the other side's price and size columns will remain null. For example,

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          2023.08.22D08:20:00);
    (`endTS;            2023.08.22D08:25:00);
    (`idList;           `A);
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i)
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice
--------------------------------------------------------------------------------
A            2023.08.22D08:24:28.967000000 A   4000000 1.25
A            2023.08.22D08:24:28.967000000 B   4000000 1.28

The book building logic also works with the other features of getTicks, for example the column filter. In the below example, only the specified columns are returned

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `A);
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`columns;          `eventTimestamp`instrumentID`src`bidPrice`bidSize)
    );

last gw(`getTicks;args;`callback;()!())

eventTimestamp                instrumentID src bidPrice bidSize
----------------------------------------------------------------
2023.08.24D10:23:47.702000000 A            A   1.25     4000000
2023.08.24D10:23:47.702000000 A            B   1.28     4000000

To select particular LPs to perform a VWAP on, the filter functionality can be used to select one or many LPs.

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `A);
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`filter;           ("=";`src;`A))
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice  askSize askPrice
---------------------------------------------------------------------------------
A            2023.08.28D09:54:15.273000000 A   4000000 1.25      4000000 1.32
args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `A);
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`filter;           ("in";`src;`A`B))
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice
--------------------------------------------------------------------------------
A            2023.08.28D09:54:15.273000000 A   4000000 1.25     4000000 1.32
A            2023.08.28D09:54:15.273000000 B   4000000 1.28     4000000 1.3

The disableRounding optional boolean parameter can be used as part of the VWAP book building functionality within getTicks. By default when constructing a VWAP book, rounding will be applied to the output of the VWAP calculations based on the reference data that is held for the currency pair. If there is no reference data defined for a particular pair, the un-rounded values are returned, or alternatively, should an un-rounded value be preferable, the disableRounding parameter can be explicitly set to true.

In the first example the disableRounding option is set to true, so un-rounded values are returned

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `$("EUR/USD";"AUD/USD"));
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`filter;           ("in";`src;`A`B));
    (`disableRounding;  1b)
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice tenor
--------------------------------------------------------------------------------------
AUD/USD      2023.09.25D13:00:49.979000000 A   4000000 1.25779  4000000 1.32     Spot
EUR/USD      2023.09.25D13:00:49.979000000 B   4000000 1.281485 4000000 1.3      Spot

The disableRounding parameter can be explicitly set to false as follows

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `$("EUR/USD";"AUD/USD"));
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`filter;           ("in";`src;`A`B));
    (`disableRounding;  0b)
    );


last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice tenor
--------------------------------------------------------------------------------------
AUD/USD      2023.09.25D13:00:49.979000000 A   4000000 1.25     4000000 1.32     Spot
EUR/USD      2023.09.25D13:00:49.979000000 B   4000000 1.28     4000000 1.3      Spot

By default the output is rounded to the reference data settings, if the disableRounding option is not part of the input arguments of getTicks

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `$("EUR/USD";"AUD/USD"));
    (`fxBookType;       `VWAP);
    (`vwapSize;         4000000i);
    (`filter;           ("in";`src;`A`B))
    );

last gw(`getTicks;args;`callback;()!())

instrumentID eventTimestamp                src bidSize bidPrice askSize askPrice tenor
--------------------------------------------------------------------------------------
AUD/USD      2023.09.25D13:00:49.979000000 A   4000000 1.25     4000000 1.32     Spot
EUR/USD      2023.09.25D13:00:49.979000000 B   4000000 1.28     4000000 1.3      Spot

The fxBookType option fullAmount constructs a full amount price book for a given set of bands based on a full amount (FOK) price book. The bands can be input to the function using the fullAmountSize option.

args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `A);
    (`fxBookType;       `fullAmount);
    (`fullAmountSize;   4000000i);
    (`columns;          `eventTimestamp`instrumentID`src`pool`bidPrice`bidSize`askPrice`askSize)
    );

last gw(`getTicks;args;`callback;()!())

eventTimestamp                instrumentID src pool  bidPrice bidSize askPrice askSize
--------------------------------------------------------------------------------------
2023.09.25D16:38:10.531000000 A            A   PoolA 1.25     4000000 1.32     4000000
2023.09.25D16:38:10.531000000 A            B   PoolB 1.28     4000000 1.3      4000000
args: (!) . flip (
    (`table;            `Quote);
    (`scope;            (enlist`assembly)!(enlist `$"fsi-app-kx-flow"));
    (`startTS;          .z.d+00:00:00);
    (`endTS;            .z.d+23:59:59);
    (`idList;           `A);
    (`fxBookType;       `fullAmount);
    (`fullAmountSize;   (1000000i;4000000i));
    (`columns;          `eventTimestamp`instrumentID`src`bidPrice`bidSize`askPrice`askSize)
    );

last gw(`getTicks;args;`callback;()!())

eventTimestamp                instrumentID src  bidPrice  bidSize askPrice askSize
---------------------------------------------------------------------------------------
2023.09.25D16:38:10.531000000 A            A    1.23      1000000 1.3      1000000
2023.09.25D16:38:10.531000000 A            A    1.25      4000000 1.32     4000000
2023.09.25D16:38:10.531000000 A            B    1.24      1000000 1.31     1000000
2023.09.25D16:38:10.531000000 A            B    1.28      4000000 1.3      4000000