Skip to main content

ICEBERG Algorithm

The ICEBERG algorithm splits and executes large aggressive orders without excessive impact on the market price by limiting quantity of active child orders to the parent order display size. The algorithm issues child orders with the parent order limit price until the total parent order quantity is filled or until the time exceeds the specified order duration.

The cumulative quantity of the active child orders is defined by the DisplayQty input parameter, but this displayed quantity can also vary over time when order is issued with the QuantityVariance parameter (see below). ICEBERG will reevaluate if it should replenish the quantity currently placed to the market for the parent order after each fill. Normally, as the order gets filled, ICEBERG will immediately replenish the quantity placed to the market by issuing another child order. However, for parent orders with time interval parameters (see MinTimeInterval, MaxTimeInterval below), ICEBERG will wait for each child order to be completely filled and then issue the next child order only after the specified interval.

ICEBERG Algorithm

Standard ICEBERG order parameters

TagField nameTypeReq'dComments
1AccountStringNTrading Order account. All child orders will have the same trading account.
55SymbolStringYThis tag is required. Human-readable instrument name as it is defined in Deltix Security Metadata.
54SideCharY'1'=Buy
'2'=Sell
'5'=Sell Short
'6'=Sell Short Exempt
50SenderSubIDStringYTrader ID
44PricePriceYOrder price
38OrderQtyQtyYOrder quantity
111MaxFloorQtyNLimits how much of the total order quantity can be displayed on exchange floor at any given time. When this attribute is provided, the order executes synthetically in smaller clips (not using an exchange supported iceberg). Must be greater than or equal to zero. When unspecified or equal to zero, the algo works the full order quantity.
76ExecBrokerStringY"ICEBERG" (Deployment key of algo strategy)
40OrdTypeCharY"X" (Denotes custom algo order)

Custom ICEBERG order parameters

TagField nameFIX TypeReq'dComments
6002OrderDurationUTCTimeOnlyNOrder duration in HH:MM:SS or HH:MM:SS.sss format. For example, 05:03:30 would be 5 hours, 3 minutes and 30 seconds from the time the order was initially entered (entry time captured during initialization).
Order duration sets the expiration time of the order. The entry time would be statically assigned, so if the user chooses later to modify the parameter to 03:00:00, the new calculated expiration time of the order would be from the initial entry time plus 3 hours.
7002EligibleExchangesStringNIf specified, restricts exchanges where order should be executed. Comma-separated list of exchange codes "COINBASE,BINANCE,GEMINI". Each exchange name must match Deltix exchange code. This tag is used for children orders (for example when sending children to SOR).
6028QuantityVarianceFloatNThe percentage in the range from 0 to 100 randomizes the quantity of child orders. For instance, when 50% quantity variance is specified, each next child order will be issued with the quantity within 50% of the quantity specified by MaxFloor attribute. For this example, if MaxFloor is set to 10 then child orders will range from 5 to 15.
6030MinTimeIntervalUTCTimeOnlyNMinimum time interval between child orders in HH:MM:SS or HH:MM:SS.sss format. For example, 00:01:30 would indicate that ICEBERG should wait for 1 minute and 30 seconds after a child order is completely filled before issuing the next child order.
Minimum time iterval can be set to 00:00:00. When 0 time interval is specified, ICEBERG will still wait for each child order to get completely filled before issuing the next order.
6031MaxTimeIntervalUTCTimeOnlyNMaximum time interval between child orders in HH:MM:SS or HH:MM:SS.sss format. When specified, interval between child orders will be chosen randomly each time in the min to max interval range.
If MinTimeInterval is not specified, the random interval will be chosen in the range between 0 and MaxTimeInterval. MaxTimeInterval value cannot be smaller than MinTimeInterval value. Setting both to the same value is allowed but is equivalent to using only MinTimeInterval parameter.
6032PriceIncrementFloatNPrice increment that can be positive or negative that is used to calculate child order prices. The first child order will be issued at parent order limit price and each subsequent child order price will be incremented by specified amount.

Configuration example

The following stanza shows how the ICEBERG algorithm can be configured in ember.conf:

algorithm {
ICEBERG: ${template.algorithm.default} {
factory = "deltix.ember.algorithm.pack.iceberg.IcebergAlgorithmFactory"
subscription {
streams = ["COINBASE", "BINANCE", "KRAKEN"] # market data streams
symbols = [BTC/USD, LTC/USD, ETH/USD, LTC/BTC, BCH/USD, BCH/BTC, ETH/BTC]
}
settings {
defaultOrderDestination = "SIM"
}
}
}

Configuration

Here is the complete list of supported config settings:

Parameter NameDescription
initialActiveOrdersCacheSizeOptional, int. Initial active orders cache size.
initialClientsCapacityOptional, int. Initial client capacity.
maxInactiveOrdersCacheSizeOptional, int. Maximum inactive orders cache size.
orderCacheCapacityOptional, int. Order cache capacity.
defaultOrderDestinationOptional, string, null by default. Destination of orders issued by the algorithm
applyRequestTagsOptional, array of strings. [ 7002 ] by default. List of tags of parent order custom attributes that should be included with child orders if available. This list can contain individual keys or a range of keys from a min and up to a max. Min and max key in the range will be separated by '-'. For example: "applyRequestTags = [ 7002, 1-1000 ]", where the second value is a range of keys that includes all keys from 1 to 1000

Please refer to Ember's Configuration Reference for more information about algorithm deployment options.