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'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.
54SideCharYOrder side ("1"=BUY or "2"=SELL)
50SenderSubIDStringYTrader ID
44PricePriceNLimit Price. If provided, then child orders will use this limit price.
38OrderQtyQtyYOrder quantity
76BrokerIDStringY"PVOL" (Deployment key of algo strategy)
40OrdTypeCharY"X" (Denotes custom algo order)

Custom PVOL order parameters

FIX TagField nameTypeReq'dComments
6002OrderDurationStringNOrder 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).
The order entry time would be statically assigned so if the user chooses later to modify the parameter to 03:00:00, the new calculated end time of the algo would be from the initial entry time plus 3 hours. Required when Stop Time is not specified.
6021StartTimeTimestampNDefines order execution start time. If omitted, PVOL will start executing order immediately.
6022StopTimeTimestampNDefines order exit time. Required when Order Duration is not specified.
6023PercentFloatYPercentage of order duration time assigned to each clip. For example, the value "5" (5%) will split total order duration into 20 equal time intervals.
6024ParticipationVolumeFloatYParticipation of strategy orders in total volume.
Example: "2.5" means 2.5% of market volume.
6027IntervalVarianceFloatNPercentage 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.
6028PriceTimeoutStringNPrice 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.
7002EligibleExchangesStringNEligible Exchanges attribute is used to limit final exchange destination of the order and will be simply forwarded by PVOL with its child orders

Only Price, Quantity, ParticipationVolume and IntervalVariance can be modified.

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.