Skip to main content

PVOL Algorithm

The Percent of Volume (PVOL) Algorithm executes large orders without excessive impact on market price. PVOL is similar to TWAP. The main difference from TWAP is that instead of sending equal chunks of order quantity at each interval, PVOL chunks are proportional to the volume traded on the market during each interval.

Order duration and slice intervals are controlled via similar custom attributes as TWAP and VWAP orders: Entry/Stop times, Duration, and Percent parameters.

At the end of each interval, PVOL calculates the total volume of trades that happened on the market VOL(Ti).

Quantity(Child Orderi) = VOL(Ti)*ParticipationVolume

When the order end time is passed, PVOL is cancelled.

PVOL Algorithm in TCA

Standard PVOL order parameters

FIX TagField nameTypeReq'dModifiableComments
1AccountStringNNTrading Order account. All child orders will have the same trading account.
55SymbolStringYNThis tag is required. Human-readable instrument name as it is defined in Deltix Security Metadata.
54SideCharYNOrder side ("1"=BUY or "2"=SELL)
50SenderSubIDStringYNTrader ID
44PricePriceNYLimit Price. If provided, then child orders will use this limit price.
38OrderQtyQtyYYOrder quantity
76BrokerIDStringYN"PVOL" (Deployment key of algo strategy)
40OrdTypeCharYN"X" (Denotes custom algo order)
59TimeInForceCharNYTime in Force of the child orders. All child orders are canceled at the end of order duration period regardless of time in force. ('0' = Day, '1' = Good Till Cancel)

Custom PVOL order parameters

FIX TagField nameTypeReq'dModifiableComments
6002OrderDurationStringNNOrder 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 order start time. This parameter is required when StopTime is not specified. The maximum value is 29:59:59. Use StartTime and StopTime parameters for longer duration.
6021StartTimeTimestampNNDefines order execution start time in UTC timestamp format: YYYYMMDD-HH:MM:SS.sss. If omitted, PVOL will start executing order immediately.
6022StopTimeTimestampNNDefines order exit time in UTC timestamp format: YYYYMMDD-HH:MM:SS.sss. Required when Order Duration is not specified.
6023PercentFloatYNPercentage of order duration time assigned to each clip. For example, the value "5" (5%) will split total order duration into 20 equal time intervals.
6024ParticipationVolumeFloatYYParticipation of strategy orders in total volume.
Example: "2.5" means 2.5% of market volume.
6027IntervalVarianceFloatNYPercentage in the range from 0 to 50% that randomizes the fixed time interval between child orders. For instance, when 10% interval variance is specified, each next child order will be issued after an interval within 10% of the fixed time interval specified by Duration and Percent attributes.
6029PriceTimeoutStringNYPrice timeout period in HH:MM:SS or HH:MM:SS.sss format. When specified, each clip order will be initially placed at the passive (top of the order book) price and then changed to the limit price if this child order has not been filled after this price timeout.
7002EligibleExchangesStringNYEligible Exchanges attribute is used to limit final exchange destination of the order and will be simply forwarded by PVOL with its child orders

Example

We send an order: BUY 100 BTC/USD @ 11000.

  • Duration is 10 minutes
  • Percent is 5%
  • Participation volume is 75%

PVOL splits 10 minutes into 5% parts (30 seconds).

At each interval, PVOL sends a child order for 75% of trading volume observed during the elapsed interval.

Depending on market conditions, PVOL may fill immediately, over several intervals, partially fill, or not fill at all. For example, if the trading volume is low, the participation volume parameter is set to a small number, and the minimum order size is large, the order will not fill. At the end of the order duration, PVOL is cancelled.

Configuration example

The following stanza shows how a PVOL algorithm can be configured in ember.conf:

algorithm {
PVOL: ${template.algorithm.default} {
factory = "deltix.ember.algorithm.pack.pvol.PVOLAlgorithmFactory"
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 = "SOR"
}
}
}

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.