Versions Compared

Key

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

Table of Contents

Is B2BITS ICE Trade Capture Solution certified by ICE?

Yes, B2BITS ICE Trade Capture Solution is a certified software. You can find us among ICE Trade Capture Vendors listed on the ICE website - https://www.theice.com/connectivity/trade-capture-vendors.

How to deploy the package and make it work

Follow the step-by-step instruction below:

...

Create a database itself. ‘ICE_Trades’ is suggested as the default name.

...

  1. Add a security definition subscription name to the list in the ICESession.SecurityDefinitionSubscriptions property
  2. Specify SecurityID and CFICode for added security definition subscription as described in the property file comments

...

Table of Contents

Is B2BITS ICE Trade Capture Solution certified by ICE?

Yes, B2BITS ICE Trade Capture Solution is certified software. You can find us among ICE Trade Capture Vendors listed on the ICE website - https://www.theice.com/connectivity/trade-capture-vendors.

How to deploy the package and make it work

Follow the step-by-step instruction below:

  1. Install FIXEdge using the guide.

  2. Create a database for ICE trades storing:
    1. Create a database itself. ‘ICE_Trades’ is suggested as the default name.

      Info

      Make sure that the Server authentication parameter of the SQL Server Database Engine is set to SQL Server and Windows Authentication mode.
      Change it, if necessary. For more information please refer to SQL Server technical manual.

    2. Create user login, database user and database tables using the ‘MSSQL_ICE_database.sql’ script – adjust it if necessary (database name, user, etc).
    3. Execute 'MSSQL_ICETrdCapt.sql', 'MSSQL_ICEStrategies.sql', and 'MSSQL_ICESecDef.sql' scripts against the database to create stored procedures (adjust or change the database name if necessary). 
    4. Add ODBC data source for the database on the server with installed FIXEdge.

  3. Adjust FIXEdge configuration (typically located here ‘C:/B2BITS/FIXEdge/FIXEdge1/conf/’).

    Multiexcerpt
    MultiExcerptNameICE TC Adjust FIXEdge configuration
    1. ICEProperties.properties file:
      1. Specify a SenderCompID (Tag 49) for the ICESession.SenderCompID property.
      2. If connecting to multiple FIX sessions, specify SenderSubIDs (Tag 50) for the ICESession.SenderSubID property.
      3. Add Security Definitions subscriptions to the necessary markets using provided examples in the "Security Definition Subscriptions" section: 
        1. Add a security definition subscription name to the list in the ICESession.SecurityDefinitionSubscriptions property.
        2. Specify SecurityID and CFICode for added security definition subscription as described in the property file comments.
          Please refer to the document for codes of ICE markets.
      4. Add Define Strategy (UDS) subscriptions to the necessary markets using provided examples in the "Security Definition Subscriptions" section:
        1. Add a security definition subscription name to the list in the ICESession.UDSSubscriptions property.
        2. Specify SecurityID  for added defined strategy subscription as described in the instruction below:
          ICESession.UDSSubscriptions.<Subscription_Name>.SecurityID = ice_market_type_idPlease refer to the document for codes of ICE markets.

          Defined Strategy (35=UDS) messages support is implemented in the ICE Trade Capture Solution (with DB Stored Procedures) based on FIXEdge 6.7.1.

      5. Specify an appropriate value of the ICESession.SecurityDefinitionaSubscriptions.RequestMode property. 
        1. Two request modes are available: SecDefFirst and TradesFirst:
          1. SecDefFirst (default) = Security Definition subscriptions are processed first. Trades processing follows once Security Definition processing is complete.
          2. TradesFirst = trades are processed first, and if configured, Security Definition subscription processing is executed simultaneously. 
        2. If you wish to receive SecurityDefinitions and UDS from p.iii only once a day, set ICESession.SecurityDefinitionaSubscriptions.RequestMode = OnceADay.
        3. If you wish to receive SecurityDefinitions and UDS from p.iii at each logon, set ICESession.SecurityDefinitionaSubscriptions.RequestMode = EachLogon.
        4. If you wish to receive SecurityDefinitions and UDS from p.iii on a scheduled basis, set ICESession.SecurityDefinitionaSubscriptions.RequestMode = Schedule.
      6. Specify a correct path in the ICESession.StorageFileName property.
    2. BL_Config.xml file:
      1. Make sure that all <History> entities point to the correct DSN, also adjust username and password if they are different from the default ones.
      2. Specify the correct SenderCompID in the rule "Launch ICE Handler" at the line: <MatchMessage Value=".*PLACE YOUR SENDER COMP ID HERE.*" />.
        E.g., if your SenderCompID is 1234, the rule will look like: <MatchMessage Value=".*1234.*" />.
      3. Specify condition in the rules that should be executed for a session with a specific SenderSubID. If SenderSubID is 987, the condition will look like: <EqualField Field="57" Value="987" />.
  4. Start FIXEdge via FIX Integrated Control Center (FIXICC).

How to set up the qualified ICE session

Info
titleAvailability

The qualified ICE sessions are available starting from the FIXEdge 6.11.0 version.

When ICE provides several connections to the same sender, these connections are distinguished by means of SenderSubID. It should be specified as follows: 

  1. For each qualified session, you need to declare the separate ICE Handler in the BL_Config.xml:

    Info

    The separate config file must be specified for each ICE Handler.

    Code Block
    languagexml
    titleBL_Config.xml
    linenumberstrue
    ..........
    <DllHandlers>
        <Handler Name="ICEHandler"
            Description="ICE Handler"
            DllName="libICEHandler-MD-x64.so"
            VerifyHandlersVersion="true"
            ConfigFile="../FIXEdge1/conf/Separate_ICEProperties.properties" />
        ..........
    </DllHandlers>
    ..........
  2. In the ICE Handler property file (ICEProperties.properties):

    Code Block
    languagebash
    titleICEProperties.properties
    linenumberstrue
    # ============ YOU NEED TO FILL SENDER COMP ID IN THE FOLLOWING PROPERTIES: START =============
    #ICE Session SenderCompID
    ICESession.SenderCompID =  ***as supplied by ICE***
    #ICE Session SenderSubID (session qualifier)
    # This parameter is optional and to be used when ICE provides more than one connection for one Sender
    ICESession.SenderSubID = ***as supplied by ICE***
    # ============= YOU NEED TO FILL SENDER COMP ID IN THE FOLLOWING PROPERTIES: END ==============

How to subscribe to the particular ICE market

ICE markets ICE Trade Capture Solution will subscribe to are specified in the ICEProperties.properties configuration file.

In order to subscribe to the particular ICE market, follow the step-by-step instruction below:

Security Definition Subscriptions

  1. Review the document and find the ICE Market Type ID you are interested in.
  2. Come up with the name for the subscription and specify it in the ICESession.SecurityDefinitionSubscriptions property (it supports several values delimited by a comma).
  3. Add subscription details in the following format:
    ICESession.SecurityDefinitionSubscriptions.<Subscription_Name>.SecurityID = ice_market_type_id.
    ICESession.SecurityDefinitionSubscriptions.<Subscription_Name>.CFICode = FXXXXX (for Futures) or OXXXXX (for Options) or OXXFXX (for Unique Option market IDs).

Info

Parameter values SecurityDefinitionSubscriptions and UDSSubscriptions must be unique. Names of subscriptions should not be the same for receiving Security Definition response (35=d) and Defined Strategies (35=UDS) messages.

Below is an example of the subscription to some ICE market type #1. The Market ID is 123. Let's say we are interested in options and the subscription name is SecDefSubscription1:

Code Block
languagebash
titleSnippet from ICEProperties.properties
linenumberstrue
ICESession.SecurityDefinitionSubscriptions = SecDefSubscription1
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.SecurityID = 123
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.CFICode = OXXXXX

To add a new ICE market, just repeat steps 1-3 and update the ICEProperties.properties configuration fileLet's say we are interested in some ICE market type #2 (Market ID is 133) and the subscription name is the SecDefSubscription2:

Code Block
languagebash
titleSnippet from ICEProperties.properties
linenumberstrue
ICESession.SecurityDefinitionSubscriptions = SecDefSubscription1, SecDefSubscription2
# SecDefSubscription1
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.SecurityID = 123
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.CFICode = OXXXXX
# SecDefSubscription2
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription2.SecurityID = 133
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription2.CFICode = FXXXXX

Defined Strategies Subscriptions

Defined Strategy (35=UDS) messages support is implemented in the ICE Trade Capture Solution (with DB Stored Procedures) based on FIXEdge 6.7.1.  Receiving UDS messages is possible only when switching to the New Security Definition interface. Make sure that the values for StrategyPreference(9006) tag are equal to "1" in the Logon (35=A) message for New Security Definition messages support. Also recommended specifying the PublishMktCreationRealtime (9010) tag equal to "1" in the Logon (35=A) message for receiving in real-time the created defined strategies during the trading session.

Info

See custom Logon in ICETC_Logon.msg file (typically located here ‘C:/B2BITS/FIXEdge/FIXEdge1/conf/’).

  1. Review the document and find the ICE Market Type ID you are interested in according to the How to identify ICE Market Type for ICE Product instruction.
  2. Come up with the name for the subscription and specify it in the ICESession.UDSSubscriptions property (it supports several values delimited by a comma).
  3. Add subscription details in the following format: ICESession.UDSSubscriptions.<Subscription_Name>.SecurityID = ice_market_type_id

    Codes of ICE markets can be found at: https://www.theice.com/publicdocs/technology/Supported_Market_Types_on_ICE_API.pdf

    Info

    Defined Strategy (35=UDS) messages support is implemented in the ICE Trade Capture Solution (with DB Stored Procedures) based on FIXEdge 6.7.1

  4. Specify an appropriate value of the ICESession.SecurityDefinitionSubscriptions.RequestMode property 
    1. Two request modes are available: SecDefFirst and TradesFirst
      1. SecDefFirst (default) = Security Definition subscriptions are processed first. Trades processing follows once Security Definition processing is complete.
      2. TradesFirst = trades are processed first, and if configured, Security Definition subscription processing is executed simultaneously. 
    2. If you wish to receive SecurityDefinitions and UDS from p.iii only once a day, set ICESession.SecurityDefinitionSubscriptions.RequestMode = OnceADay
    3. If you wish to receive SecurityDefinitions and UDS from p.iii at each logon, set ICESession.SecurityDefinitionSubscriptions.RequestMode = EachLogon
  5. Specify a correct path in the ICESession.StorageFileName property.
  6. ‘BL_Config.xml’
    1. Make sure that all <History> entities point to the correct DSN, also adjust username and password if they are different from default ones
    2. Specify correct SenderCompID in the rule "Launch ICE Handler" at the line: <MatchMessage Value=".*PLACE YOUR SENDER COMP ID HERE.*" />
      E.g., if your SenderCompID is 1234, the rule will look like: <MatchMessage Value=".*1234.*" />

    3. Specify condition in the rules that should be executed for a session with a specific SenderSubID. If SenderSubID is 987, the condition will look like: <EqualField Field="57" Value="987" />
  7. Start FIXEdge via FIX Integrated Control Center (FIXICC)

How to subscribe to the particular ICE market

ICE markets ICE Trade Capture Solution will subscribe to are specified in the ICEProperties.properties configuration file.

In order to subscribe to the particular ICE market, follow the step-by-step instruction below:

Security Definition Subscriptions

  1. Review https://www.theice.com/publicdocs/technology/Supported_Market_Types_on_ICE_API.pdf and find the ICE Market Type ID you are interested in;
  2. Come up with the name for the subscription and specify it in the ICESession.SecurityDefinitionSubscriptions property (it supports several values delimited by comma).
  3. Add subscription details in the following format:
    ICESession.SecurityDefinitionSubscriptions.<Subscription_Name>.SecurityID = ice_market_type_id
    ICESession.SecurityDefinitionSubscriptions.<Subscription_Name>.CFICode = FXXXXX (for Futures) or OXXXXX (for Options) or OXXFXX (for Unique Option market IDs)

Warning

Parameter values SecurityDefinitionSubscriptions and UDSSubscriptions must be unique. Names of subscriptions should not be the same for receiving Security Definition response (35=d) and Defined Strategies (35=UDS) messages.

Below is the example of the subscription to the Atlantic Coal Futures market type. Market ID is 123. Let's say we are interested in options and the subscription name is ICEAtlanticCoalOptions:

Code Block
languagebash
titleSnippet from ICEProperties.properties
linenumberstrue
ICESession.SecurityDefinitionSubscriptions = ICEAtlanticCoalOptions
ICESession.SecurityDefinitionSubscriptions.ICEAtlanticCoalOptions.SecurityID = 123
ICESession.SecurityDefinitionSubscriptions.ICEAtlanticCoalOptions.CFICode = OXXXXX

...

  1. .

Info

Parameter values SecurityDefinitionSubscriptions and UDSSubscriptions must be unique. Names of subscriptions should not be the same for receiving Security Definition response (35=d) and Defined Strategies (35=UDS) messages.

Below is an example of a subscription to several market types:

  • ICE Market #3 (Market ID is 3, subscription name is the ICEMarket3)  
  • ICE Market #4 (Market ID is 4, subscription name is the ICEMarket4)
  • ICE Market #5 (Market ID is 5, subscription name is the ICEMarket5)
Code Block
languagebash
titleSnippet from ICEProperties.properties
linenumberstrue
ICESession.UDSSubscriptions = ICEMarket3, ICEMarket4, ICEMarket5
ICESession.UDSSubscriptions.ICEMarket3.SecurityID = 3
ICESession.UDSSubscriptions.ICEMarket4.SecurityID = 4
ICESession.UDSSubscriptions.ICEMarket5.SecurityID = 5

How to identify ICE Market Type for ICE Product

Please refer to the ICE official site or ICE Support to inquire about the ICE product codes.

How to perform recovery and re-request trades from some period

ICE Trade Capture Solution has inbuilt abilities to restore the trade data missed due to the outage. Basic recovery mechanism is based on the persistence file (ICE_persistStorage.out), where the date & time of the last received trade are preserved with the time accuracy received in the incoming message.

After the session is started, ICE Trade Capture Solution populates tags 75 (TradeDate) and 60 (TransactTime) in the Trade Capture Report Request based on the date & time (see LastTransactTime field) from the persistence file to request the snapshot of trades starting from the time when the latest trade was received.

Info

If the file is absent or empty, ICE Trade Capture Solution will request the snapshot of trades from the last 2 days starting from the "current" time (in UTC). Otherwise, the data stated in the file will be used.

In order to re-request trades that have already been received earlier, just remove the persistence file (ICE_persistStorage.out) or specify the desired time in a LastTransactTime field (from which the snapshot of trades should be requested) and restart the session. Keep in mind the how long ICE keeps trade records instruction when specifying LastTransactTime in ICE_persistStorage.out.

Info

The name of the ICE storage file is specifiedin ICEProperties.properties:

ICESession.StorageFileName = ../FIXEdge1/log/ICE_persistStorage.out

How long does ICE keep trades records

According to ICE Trade Capture specification, ICE holds trade capture data for the last 2 business days only.

ICE Trade Capture behaviour in case of the ICE session termination

  1. ICE Trade Capture Solution determines that connection with ICE is lost.
  2. ICE Trade Capture Solution considers the Trade Capture Report subscription terminated.
  3. ICE Trade Capture Solution tries to reconnect in accordance with the ReconnectMaxTries and ReconnectInterval session properties specified in the FIXEdge.properties file.

Once the connection is back, ICE Trade Capture Solution starts execution of the main flow from:

ICESession.TradeCaptureSubscriptions.RequestMode: 

  1. step 2, if ICESession.TradeCaptureSubscriptions.RequestMode = EachLogonis specified in the ICEProperties.properties file.

  2. step 6, if ICESession.TradeCaptureSubscriptions.RequestMode = OnceADay is specified in the ICEProperties.properties file.

Info

The start time in Trade Capture Report Request (MsgType = "AD") will be populated based on the data specified in the persistence file (ICE_persistStorage.out).

What is the ICE session schedule and how to set up it in ICE Trade Capture Solution

Refer to the ICE Trade Capture specification to inquire about the schedule for the ICE testenvironment.

ICE regular trading and support hours can be found on the official site

The schedule can be set in ICE Trade Capture Solution by means of FIXEdge Scheduler properties or via FIXICC Scheduler functionality.

  • Below is an example of how the ICE schedule for the Production environment can be configured (applicable to FIXEdge 6.0 and higher):

    Code Block
    languagebash
    titleSnippet from

...

  • FIXEdge.properties
    linenumberstrue

...

  • FIXICC.

...

  • Schedules = 

...

  • true
    

...

  • 
    # 

...

  • Schedule 

...

Defined Strategies Subscriptions

...

Info

See custom Logon in ICETC_Logon.msg file (typically located here ‘C:/B2BITS/FIXEdge/FIXEdge1/conf/’)

  1. Review https://www.theice.com/publicdocs/technology/Supported_Market_Types_on_ICE_API.pdf and find the ICE Market Type ID you are interested in;
  2. Come up with the name for the subscription and specify it in the ICESession.UDSSubscriptions property (it supports several values delimited by comma).
  3. Add subscription details in the following format:
    ICESession.UDSSubscriptions.<Subscription_Name>.SecurityID = ice_market_type_id
Warning

Parameter values SecurityDefinitionSubscriptions and UDSSubscriptions must be unique. Names of subscriptions should not be the same for receiving Security Definition response (35=d) and Defined Strategies (35=UDS) messages.

Below is the example of the subscription to the:

  • IPE Natural Gas Futures (Market ID is 3, subscription name is the ICEEuropeNaturalGas),  
  • IPE Gas Oil Futures (Market ID is 4, subscription name is the ICEEuropeGasOil),
  • IPE Brent Futures (Market ID is 5, subscription name is the ICEEuropeBrent)
    market type. 
    for PROD ICE environment
    Schedules.ICEFIXSchedule.StartTime = 0 30 19 * * *
    Schedules.ICEFIXSchedule.TerminateTime =  0 30 18 * * *
    Schedules.ICEFIXSchedule.TimeZone = EST5EDT
    
    FixLayer.FixEngine.Session.ICESession.Schedule = ICEFIXSchedule
  • Below is an example of how the ICE schedule for the test environment can be set up (applicable to FIXEdge 6.0. version and higher):

    Code Block
    languagebash
    titleSnippet from FIXEdge.properties
    linenumberstrue
    FIXICC.Schedules = true
    
    # Schedule for TEST ICE environment
    Schedules.ICEFIXSchedule.StartTime = 0 30 20 * * *; 0 0 15 * * 4
    Schedules.ICEFIXSchedule.TerminateTime =  0 5 18 * * *; 0 0 13 * * 4
    Schedules.ICEFIXSchedule.TimeZone = EST5EDT
    
    FixLayer.FixEngine.Session.ICESession.Schedule = ICEFIXSchedule
Info

Both schedules are already configured out-of-box. Need just to switch between them when moving from Test to Production.

How to configure obtaining SecDef and UDS on a scheduled basis

ICE Trade Capture solution provides the ability to obtain the SecDef/UDS market information on a scheduled basis.

Schedules must be defined in the Schedules section of FIXEdge.properties file in the form: Schedules.<Schedule name>.StartTime = <CRON expression>.

  • Below is an example of how the obtaining of SecDef on a scheduled basis can be configured (applicable to FIXEdge 6.14.0 version and higher):

    Code Block
    languagebash
    titleSnippet from

...

  • FIXEdge.properties
    linenumberstrue
    ICESession.SecurityDefinitionaSubscriptions.

...

  • RequestMode = 

...

  • Schedule
    ICESession.

...

  • SecurityDefinitionSubscriptions = 

...

  • FinancialGas
    ICESession.

...

  • SecurityDefinitionSubscriptions.

...

  • FinancialGas.SecurityID = 

...

  • 0
    ICESession.

...

  • SecurityDefinitionSubscriptions.

...

  • FinancialGas.

...

  • CFICode = 

...

How to perform recovery and re-request trades from some period

ICE Trade Capture Solution has inbuilt abilities to restore the trade data missed due to the outage. Basic recovery mechanism is based on the persistence file (ICE_persistStorage.out), where the date & time of the last received trade are preserved with the time accuracy received in the incoming message.

After the session is started, ICE Trade Capture Solution populates tags 75 (TradeDate) and 60 (TransactTime) in the Trade Capture Report Request based on the date & time (see LastTransactTime field) from the persistence file to request the snapshot of trades starting from the time when the latest trade was received.

Note

If the file is absent or empty, ICE Trade Capture Solution will request the snapshot of trades from last 2 days starting from the "current" time (in UTC)Otherwise, data stated in the file will be used.

In order to re-request trades which have already been received earlier, just remove the persistence file (ICE_persistStorage.out) or specify the desired time in a LastTransactTime field (from which the snapshot of trades should be requested) and restart the session. Keep in mind how long ICE keeps trade records when specifying LastTransactTime in ICE_persistStorage.out.

...

ICESession.StorageFileName = ../FIXEdge1/log/ICE_persistStorage.out

How long does ICE keep trades records

According to ICE Trade Capture specification, ICE holds trade capture data for last 2 business days only.

What is the ICE Trade Capture behavior in case of the ICE session termination

  1. ICE Trade Capture Solution determines that connection with ICE is lost.
  2. ICE Trade Capture Solution considers the Trade Capture Report subscription terminated.
  3. ICE Trade Capture Solution tries to reconnect in accordance with the ReconnectMaxTries and ReconnectInterval session properties specified in the FIXEdge.properties.

Once the connection is back, ICE Trade Capture Solution starts execution of the main flow from:

  1. step 2, if ICESession.SecurityDefinitionSubscriptions.RequestMode = EachLogon is specified in the ICEProperties.properties

  2. step 6, if ICESession.SecurityDefinitionSubscriptions.RequestMode = OnceADay is specified in the ICEProperties.properties

Note

Start time in Trade Capture Report Request (MsgType = "AD") will be populated based on the data specified in the persistence file (ICE_persistStorage.out)

What is the ICE session schedule and how to setup it in ICE Trade Capture Solution

According to ICE Trade Capture specification, all FIX sessions in Production will be reset by the ICE FIX host after every 24 hours, i.e. at the beginning of the next trading day (during maintenance window between 6:30 PM to 7:30 PM EST/EDT).

As for Test environment, ICE has daily maintenance times at 6:05 PM to 8:30 PM EST/EDT except for Wednesday when there is an additional maintenance between 1 PM to 3 PM EST/EDT.

ICE regular trading and support hours can be found on the official site

The schedule can be set in ICE Trade Capture Solution by means of FIXEdge Scheduler properties or via FIXICC Scheduler functionality.

  • Below is the example of how the ICE schedule for Production environment can be configured (applicable to FIXEdge 6.0 and higher):

    Code Block
    languagebash
    titleSnippet from FIXEdge.properties
    linenumberstrue
    FIXICC.Schedules = true
    
    # Schedule for PROD ICE environment
    Schedules.ICEFIXSchedule.StartTime = 0 30 19 * * *
    Schedules.ICEFIXSchedule.TerminateTime =  0 30 18 * * *
    Schedules.ICEFIXSchedule.TimeZone = EST5EDT
    
    FixLayer.FixEngine.Session.ICESession.Schedule = ICEFIXSchedule
  • Below is the example on how the ICE schedule for Test environment can be setup (applicable to FIXEdge 6.0 and higher):

    Code Block
    languagebash
    titleSnippet from FIXEdge.properties
    linenumberstrue
    FIXICC.Schedules = true
    
    # Schedule for TEST ICE environment
    Schedules.ICEFIXSchedule.StartTime = 0 30 20 * * *; 0 0 15 * * 4
    Schedules.ICEFIXSchedule.TerminateTime =  0 5 18 * * *; 0 0 13 * * 4
    Schedules.ICEFIXSchedule.TimeZone = EST5EDT
    
    FixLayer.FixEngine.Session.ICESession.Schedule = ICEFIXSchedule
Note

Both schedules are already configured out-of-box. Need just to switch between them when move from Test to Production.

How to make a new field from ICE Trade Capture FIX interface stored in the database

Download process is free from any FIXEdge specifics. Any changes can be done by modifying the proper stored procedure and data model.

In order to process new fields so that they can appear in the database, the following needs to be done:

...

FIXEdge server restart is not required.

Example (for MS SQL Server):

Below is the example of how to add the new MiFID II related field to the ICE Trade Capture Solution so that it can be stored in the database.

Assume that tag 9707 (MiFIDID) from the Trade Capture Report message (MsgType = "AE") should be now stored in the database. Following the step-by-step instruction presented above:

...

According to the ICE Trade Capture specification (see https://community.theice.com/docs/DOC-19796), MiFIDID is located in the root of the Trade Capture Report message (MsgType = "AE"). Add the new MiFIDID column with varchar (256) type to the ICEReports table.

Code Block
languagesql
titleICEReports
ALTER TABLE [ICEReports] ADD [MiFIDID] [varchar](256) NULL

Then the SaveReports stored procedure should be adjusted:

Code Block
languagesql
titleSaveReports
 INSERT INTO [ICEReports]
 (
  TradeReportID,
  SendingTime,
  .....  
  ClientIDCode,
  MiFIDID,                               -- new MiFIDID tag 
  ClientAppType
 )
 SELECT
  @ReportID,
  @SendingTime,
  .....
  C.value('f9706[1]', 'nvarchar(256)'),
  C.value('f9707[1]', 'nvarchar(256)'), -- new MiFIDID tag 
  @ClientAppType
 FROM @xmlData.nodes('/FIXMessage') as T(C)
 OPTION (OPTIMIZE FOR ( @xmlData = NULL ));

How to move ICE Trade Capture configuration from Test to Production

In order to move your ICE Trade Capture configuration to Production, several steps are required and/or recommended to be performed:

  1. Adjust ICE session host and port from FIXEdge.properties to point it to Production;
  2. Go through the steps from ICE Trade Capture FAQ#How to deploy the package and make it work and adjust your configuration to point it to Production;
  3. Turn off (comment out) the schedule for ICE TEST and turn on (uncomment) the schedule for ICE PROD environment in FIXEdge.properties. Use ICE Trade Capture FAQ#What is the ICE session schedule and how to setup it in ICE Trade Capture Solution as a reference;
  4. In case SSL connection is required for ICE Production environment (subject for clarification with ICE team), uncomment the following properties in FIXEdge properties:

    Code Block
    FixLayer.FixEngine.Session.ICESession.SSL = true
    FixLayer.FixEngine.Session.ICESession.SSLProtocols = TLSv1, TLSv1_1, TLSv1_2
  5. Turn off debug and trace levels of logging by changing values of appropriate properties in FIXEdge.properties to reduce the number of log records and hence reduce the size of log files;

    Code Block
    Log.DebugIsOn = false
    Log.TraceIsOn = false
  6. Configure logs rotation to manage the disk space where FIXEdge is installed;
  7. Setup email notifications to be informed in case of ICE session state is changed. Check How to configure session state changes notifications article for more details.

What is the Download Performance? 

While all the Trade Capture Reports are downloaded in real-time, the necessity to request the whole ICE markets in order to get desired instruments and the massive size of the security definition FIX messages lead to the question regarding the performance of security definitions download.

The performance of the download can vary and depends on the following factors (including, but not limited to):

  • number of ICE markets subscriptions
  • number of underlying instruments for each subscription
  • period of operation and volume of data already stored in the database
  • overall solution setup (e.g. are FIXEdge and database located on one server or on two different servers? are these servers located in one or different regions?)
  • network specifics

Our tests shows that performance can decrease with the increased volume of data stored in the database after some period of operation. To maintain high performance of the solution, it is recommended to clean the database and archive/purge old/unused data on a regular basis (e.g. once a week/month).

How can I know about ICE releases which affect the ICE Trade Capture Solution

EPAM B2BITS team is constantly monitoring updates of ICE Trade Capture interface. In case of any changes, the impact on the solution is assessed. If the change is critical and it affects the solution, a new version of the software is released and distributed to the clients in advance.

How to use dictionary from ICE Trade Capture Solution package based on FIXEdge 6.7.1 in previous versions

Replace <fixdic> tag from:

Code Block
languagexml
titleadditional_ice.xml
...
<fixdic id="FIX44ICETC"parent_id="FIX44"fixversion="4.4" title="ICE Trade Capture FIX 4.4" date="2018/11/16" > 
...

to:

Code Block
languagexml
titleadditional_ice.xml
...
<fixdic fixversion="4.4" title="ICE Trade Capture FIX 4.4" date="2018/11/16" id="FIX44">
..
Info

Date may be different

Replace the dictionary with a new one and restart FIXEdge.

Why ICE sending NULL value in ExecType(150) tag for some trades?

ExecType(150) will not be sent on snapshot Trade Capture Reports. The value for ExecType(150) is set to "F" by ICE Trade Capture Solution when processing such messages. This value is stored in the database.

...

  • FXXXXX
    ICESession.SecurityDefinitionSubscriptions.FinancialGas.Schedule = Schedule1
    Schedules.Schedule1.StartTime = 0 15 20 * * *

How to make a new field from ICE Trade Capture FIX interface stored in the database

The download process is free from any FIXEdge specifics. Any changes can be done by modifying the proper stored procedure and data model.

In order to process new fields so that they can appear in the database, the following needs to be done:

  1. Check where the FIX tag you are interested in is located in the FIX message. Note that tags from repeating groups are allocated in separate tables. Check the /wiki/spaces/EPMBFIXA/pages/6043351 page for details.
    1. If the FIX tag is located in the root of the message (either Trade Capture Report or Security Definition), then add the coincident column to the ICEReports / ICESecurityDefinitions table.
    2. If the FIX tag is located in one of the repeating groups which are already stored in the database, then add a column to the corresponding table.
    3. If the FIX tag is located in one of the repeating groups which are not stored in the database, then add a new table for the group and specify the required field there.
  2. Add support for new fields in the stored procedure (either SaveReports or SaveDefinitions depending on which fields you are going to add).

The restart of the FIXEdge server is not required.

Below is an example of how to add the new MiFID II-related field to the ICE Trade Capture Solution so that it can be stored in the database.

Assume that tag 9707 (MiFIDID) from the Trade Capture Report message (MsgType = "AE") should be now stored in the database. Following the step-by-step instruction presented above:

  1. According to the ICE Trade Capture specification (see link), MiFIDID is located in the root of the Trade Capture Report message (MsgType = "AE"). Add the new MiFIDID column with varchar (256) type to the ICEReports table.

    Code Block
    languagesql
    titleICEReports
    ALTER TABLE [ICEReports] ADD [MiFIDID] [varchar](256) NULL
  2. Then the SaveReports stored procedure should be adjusted:

    Code Block
    languagesql
    titleSaveReports
     INSERT INTO [ICEReports]
     (
      TradeReportID,
      SendingTime,
      .....  
      ClientIDCode,
      MiFIDID,                               -- new MiFIDID tag 
      ClientAppType
     )
     SELECT
      @ReportID,
      @SendingTime,
      .....
      C.value('f9706[1]', 'nvarchar(256)'),
      C.value('f9707[1]', 'nvarchar(256)'), -- new MiFIDID tag 
      @ClientAppType
     FROM @xmlData.nodes('/FIXMessage') as T(C)
     OPTION (OPTIMIZE FOR ( @xmlData = NULL ));

How to move ICE Trade Capture configuration from Test to Production

In order to move your ICE Trade Capture configuration to Production, several steps are required and/or recommended to be performed:

  1. Adjust ICE session host and port from FIXEdge.properties to point it to Production.
  2. Go through the steps from the How to deploy the package and make it work instruction and adjust your configuration to point it to Production.
  3. Turn off (comment out) the schedule for ICE TEST and turn on (uncomment) the schedule for ICE PROD environment in FIXEdge.properties. Use the What is the ICE session schedule and how to setup it in ICE Trade Capture Solution instruction as a reference.
  4. In case of SSL connection is required for ICE Production environment (subject for clarification with ICE team), uncomment the following properties in FIXEdge properties:

    Code Block
    FixLayer.FixEngine.Session.ICESession.SSL = true
    FixLayer.FixEngine.Session.ICESession.SSLProtocols = TLSv1, TLSv1_1, TLSv1_2
  5. Turn off DEBUG and TRACE levels of logging by changing values of appropriate properties in the FIXEdge.properties file to reduce the number of log records and hence reduce the size of log files:

    Code Block
    Log.DebugIsOn = false
    Log.TraceIsOn = false
  6. Configure logs rotation to manage the disk space where FIXEdge is installed.
  7. Setup email notifications to be informed in case of ICE session state is changed. Check the How to configure session state changes notifications article for more details.

What is the Download Performance? 

While all the Trade Capture Reports are downloaded in real-time, the necessity to request the whole ICE markets in order to get desired instruments and the massive size of the security definition FIX messages lead to the question regarding the performance of security definitions download.

The performance of the download can vary and depends on the following factors (including, but not limited to):

  • the number of ICE markets subscriptions
  • the number of underlying instruments for each subscription
  • period of operation and the volume of data already stored in the database
  • overall solution setup (e.g. are FIXEdge and database located on one server or on two different servers? are these servers located in one or different regions?)
  • network specifics

Our tests show that performance can decrease with the increased volume of data stored in the database after some period of operation. To maintain the high performance of the solution, it is recommended to clean the database and archive/purge old/unused data on a regular basis (e.g. once a week/month).

How can I know about ICE releases which affect the ICE Trade Capture Solution

EPAM B2BITS team is constantly monitoring updates of the ICE Trade Capture interface. In case of any changes, the impact on the solution is assessed. If the change is critical and it affects the solution, a new version of the software is released and distributed to the clients in advance.

How to use a dictionary from the ICE Trade Capture Solution package based on FIXEdge 6.7.1 in previous versions

Replace <fixdic> tag from:

Code Block
languagexml
titleadditional_ice.xml
...
<fixdic id="FIX44ICETC"parent_id="FIX44"fixversion="4.4" title="ICE Trade Capture FIX 4.4" date="2018/11/16" > 
...

to:

Code Block
languagexml
titleadditional_ice.xml
...
<fixdic fixversion="4.4" title="ICE Trade Capture FIX 4.4" date="2018/11/16" id="FIX44">
..
Info

The date may be different.

Replace the dictionary with a new one and restart FIXEdge.

Why is ICE sending a NULL value in ExecType(150) tag for some trades?

ExecType(150) will not be sent on snapshot Trade Capture Reports. The value for ExecType(150) is set to "F" by ICE Trade Capture Solution when processing such messages. This value is stored in the database. Please refer to the link for more details.

What is the order of sending ICE security definition and UDS subscriptions in FIXEdge?

The subscriptions are sent in alphabeticorder for subscription names from a merged list of values from ICESession.SecurityDefinitionSubscriptions and ICESession.UDSSubscriptions in ICEProperties.properties file.

For example, for the next configuration:

Code Block
ICESession.SecurityDefinitionSubscriptions = SecDefSubscription3, SecDefSubscription2, SecDefSubscription1
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription2.SecurityID = 2
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription2.CFICode = OXXXXX
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription3.SecurityID = 3
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription3.CFICode = FXXXXX  
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.SecurityID = 1
ICESession.SecurityDefinitionSubscriptions.SecDefSubscription1.CFICode = FXXXXX

ICESession.UDSSubscriptions = UDSSubscription111
ICESession.UDSSubscriptions.EuropeanPowerSpreadsUDS.SecurityID = 111

The subscriptions order is the next one:

  1. SecDefSubscription1 (35=c|...|321=3|48=111|461=FXXXXX|)
  2. SecDefSubscription2 (35=c|...|321=101|48=111|)
  3. SecDefSubscription3 (35=c|...|321=3|48=1|461=FXXXXX|)
  4. UDSSubscription111 (35=c|...|321=3|48=1|461=OXXXXX|)
Info

The changing order is useful for testing if there is a need to send important instruments first or for speeding up troubleshooting.  For example, a user can postpone downloading time-consuming markets.

Troubleshooting 

Missing instrument static data details

These hints contain checks that should be performed for troubleshooting the missing instrument static data issues.

Identify symbol

  • Get the symbol from the Trade Capture Report (AE) message from tags: Symbol (55), LegSymbol (555 → 600).
  • Check if ICE sent FIX messages with the same symbol.
    All incoming FIX messages are saved to files: <SenderId>_<TargetId>_*.in.
    In FIX logs there should be 35=AE messages with this symbol for trades and 35=d or 35=UDS messages with the instrument's static data.

    Info

    If there are no messages 35=d or 35=UDS messages with this symbol then ICE doesn't send it.

  • If the security definition is sent as a UDS message then it should be in Symbol (55) tag. 
    UDS message may contain not full static data, some fields like StartDate (916), EndDate (917), and Clearable (9025) may be missing. In the case of missing fields, the data should be collected from the Futures linked UDS. The Futures symbol is located in the tag LegSymbol (35=UDS, 555 → 600) of UDS Legs.

  • Hint FIX Message tags:
    Futures/Options 35=AE, tag 55 is linked with 35=d, tag 311.
    Futures/Options multileg 35=AE, tag 555→600 is linked with 35=d, tag 311.
    UDS 35=AE, tag 55 is linked with 35=UDS, tag 55.  35=UDS, 555→600 is linked with 35=d, tag 311.
    UDS Multileg 35=AE, tag 555→600 is linked with 35=UDS, tag 55.  35=UDS, 555→600 is linked with 35=d, tag 311.

  • Hints for database table:
    Futures/Options ICEReports.Symbol is related toICESecurityDefUnderlyings.UnderlyingSymbol
    Futures/Options multileg ICEReportsLegs.LegSymbolis related to ICESecurityDefUnderlyings.UnderlyingSymbol
    UDS ICEReports.Symbolis related to ICEDefinedStrategy.Symbol.  ICEDefinedStrategyLegs.Symbol is related to ICESecurityDefUnderlyings.UnderlyingSymbolICEDefinedStrategy.Symbolis linked with  ICEDefinedStrategyLegs.Symbol byICEDefinedStrategy.SecurityResponseId
    UDS Multileg ICEReportsLeg.LegSymbolis related to ICEDefinedStrategy.Symbol.  ICEDefinedStrategyLegs.Symbol is related to ICESecurityDefUnderlyings.UnderlyingSymbolICEDefinedStrategy.Symbolis linked with ICEDefinedStrategyLegs.Symbol byICEDefinedStrategy.SecurityResponseId.

There are no 35=d or 35=UDS messages with instrument static data

Check if FIXEdge subscribes for missing instrument data. Please refer to the:

If the subscription configuration is correct but there is still no data then raise a request to ICE. Usually, ICE asked details about subscriptions sent by the application that can be found in <SenderId>_<TargetId>_*.out log file as messages with 35=c (Security Definition Request (c)).

Static data is received but wasn't inserted

  • Check errors in the application logs (FIXEdge.log file). In case of database connectivity issues, there would be log records with ERROR severity with a description describing the cause of connectivity issues.
  • Check if the FIXEdge1/conf/additional_ice.xml file corresponds to the most recent version of ICE TC FIX Specification.

    Info
    titleadditional_ice.xml

    <fixdic id="FIX44ICETC" parent_id="FIX44" fixversion="4.4" title="ICE Trade Capture FIX 4.4 specification version 4.11" date="2021/02/12">

    The actual version of the specification can be found on the ICE official site Trade Capture (FIX) Technical Specification.
    In the case of using an obsolete FIX dictionary, there would be Reject (3) 35=3 messages in outgoing logs.

    Recommendations about manual dictionary modification can be found here: FIX and FIXML Dictionaries Customization Guide.
  • If FIXEdge receives the messages but they're still not inserted into the database
  • Check XML → DB conversion in DB schema. 
    The schema example is provided in the ICEFIXTCap-SP FIXEdge package in FIXEdge/DB_script directory.