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.
Standard PVOL order parameters
FIX Tag | Field name | Type | Req'd | Comments |
---|---|---|---|---|
1 | Account | String | N | Trading Order account. All child orders will have the same trading account. |
55 | Symbol | String | Y | This tag is required. Human-readable instrument name as it is defined in Deltix Security Metadata. |
54 | Side | Char | Y | Order side ("1"=BUY or "2"=SELL) |
50 | SenderSubID | String | Y | Trader ID |
44 | Price | Price | N | Limit Price. If provided, then child orders will use this limit price. |
38 | OrderQty | Qty | Y | Order quantity |
76 | BrokerID | String | Y | "PVOL" (Deployment key of algo strategy) |
40 | OrdType | Char | Y | "X" (Denotes custom algo order) |
Custom PVOL order parameters
FIX Tag | Field name | Type | Req'd | Comments |
---|---|---|---|---|
6002 | OrderDuration | String | N | Order 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. |
6021 | StartTime | Timestamp | N | Defines order execution start time. If omitted, PVOL will start executing order immediately. |
6022 | StopTime | Timestamp | N | Defines order exit time. Required when Order Duration is not specified. |
6023 | Percent | Float | Y | Percentage of order duration time assigned to each clip. For example, the value "5" (5%) will split total order duration into 20 equal time intervals. |
6024 | ParticipationVolume | Float | Y | Participation of strategy orders in total volume. Example: "2.5" means 2.5% of market volume. |
6027 | IntervalVariance | Float | N | Percentage 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. |
6028 | PriceTimeout | String | N | Price 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. |
7002 | EligibleExchanges | String | N | Eligible 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 Name | Description |
---|---|
initialActiveOrdersCacheSize | Optional, int. Initial active orders cache size. |
initialClientsCapacity | Optional, int. Initial client capacity. |
maxInactiveOrdersCacheSize | Optional, int. Maximum inactive orders cache size. |
orderCacheCapacity | Optional, int. Order cache capacity. |
defaultOrderDestination | Optional, string, null by default. Destination of orders issued by the algorithm |
applyRequestTags | Optional, 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.