...
route=ARCA,ARCAPOP;penny=true;liq=A => 0.003
=>
) specifies the conditions to match. The rule above match any execution where route is ARCA or ARCAPOP and the liquidity flag is A and the price was less than $1. (The semi-colon character is used as an AND qualifier.)The right-hand side specifies the fee to assess if the conditions match. Positive fees are charges, negative fees are rebates. The rule above charges $3 / 1000 shares.
Leaving the condition blank will match every trade (useful as the last rule to provide a catch-all). For example, changing the example above as follows will charge all remaining executions $5 / 1000:
route=ARCA,ARCA=,ARCAPOP;penny=true;liq=A => 0.003
=> 0.005
Conditions
Unless otherwise specified, conditions are not case sensitive and support a variety of operators: =, != (not equals), >=, >, <=, <
Name | Description | Example |
---|---|---|
afterHours | Execution occurred on or after 4pm EST | afterHours=true |
capacity | Trading capacity of the order (when available). A = Agency, C = Agency Cross, P = Principal, R = Riskless Principal. | capacity=P |
contra | MPID / identifier of the counterparty. | contra=PFSI |
ccy | An ISO 4217 (3-character) currency of the trade. (v1.5.97.13 or greater) | ccy=EUR |
exch | Listing exchange for the security being traded (see list of exchange codes). | exch=NYQ |
execBroker | MPID / identifier of the executing broker. | execBroker=PFSI |
internalContra | Indicates the actual MPID / identifier of the counterparty when an order is routed via an order desk or another intermediary (when available). (v1.5.98.19.16 or greater) | internalContra=PFSI |
internalLiq | Indicates the actual liquidity flag when an order is routed via an order desk or another intermediary (when available). Note: This value is case-sensitive. | internalLiq=A |
internalRoute | Indicates the actual destination when an order is routed via an order desk or another intermediary (when available). | internalRoute=EDGA |
liq | Liquidity flag (see flags for various destinations). Note: This value is case-sensitive. | liq=A |
lot | Considers quantity of trade: (ODD = if quantity < 100 on an execution) | lot=odd |
mult | The multiplier (sometimes called "contract size" for options and "value multiplier" for futures) associated with the traded instrument and used when computing profit and loss (v1.5.97.14.13 or greater) | mult=100 |
penny | Set to true if trade is sub-dollar | penny=true |
price | Execution price. | price>2 |
qty | Quantity of the execution. (v1.5.92.18 or greater) | qty=100 |
route | Exchange, Route or ECN. Different platforms |
can send different values for the same venue (e.g. Sterling: NSDQ vs Laser: ISLD). Furthermore, some platforms can indicate multiple values for the same destination (e.g. Sterling: ARCA, ARCA= to mean ARCA). | route=ARCA | |
side | Buy or sell | side=buy |
source | Where PropReports received the trade from (see list of source ids). | source=1 |
subType | For equities, this will be either etf or blank | subType=etf |
symbol | Ticker symbol of the security being traded | symbol=IBM |
tape | Trade reporting facility indicator (e.g. A, B, or C). See Tape Designations. | tape=A |
time | Execution time in the format HH:MM:SS (v.1.6.5.85 or greater). | time>=10:00:00 |
type | Type of instrument being traded (equity, option, future, index, fund, fx, bond) | type=option |
underlyingSymbol | For options, the ticker symbol of the underlying security or index. | underlyingSymbol=YHOO |
underlyingType | For options, the type of the underlying security (equity, future, index) | underlyingType=index |
underlyingSubType | For options, the sub type of the underlying equity (etf or blank) | underlyingSubType=etf |
Wildcards / Partial Matches
For = and != operators you can specify a partial value to match by using the wildcard symbol: % (PropReports version 1.5.97.14.74 and greater).
This could be useful for capturing routes or symbols with a common prefix without having to list them all. For example, route=ARCA%
will match any execution where route begins with ARCA (e.g. ARCA and ARCAPOP). Likewise, symbol=/KC%
will match all symbols that start with /KC (e.g. /KCH4 and /KCK5) .
You can also specify the wildcard at the end of the text to match. For example symbol=%.TO
will match any symbol with a suffix of .TO.
Please be aware that entering a % anywhere else in the text or both at the beginning and the end will match the percent sign. This means route=A%B
will only match the exact route A%B and route=%AB%
will only match the exact route %AB%.
In the very rare case you need to match text that actually ends or begins with a percent sign you can escape it by prepending a '\' For example route=XYZ\%
will match the exact route and route=\%XYZ
will match the route %XYZ.
AND-ing conditions
Sometimes you may require ALL of a multiple set of conditions, and you can do so with the use of the semi-colon character ";". For example, let's say you want to select trades where both the destination is set to EDGA and the contra is set to BATS.
...
(route=ARCA),(contra=ARCA) => 0.003
Slicing
Sometimes you may want to match one particular character placed in the nth position of a string in order to assess a fee based on that sliced character. You can use brackets [ ] to do so and note that you can use this with non-numeric comparison operators (!= and =). Using [] or [:] alone will have no effect. Slicing is available beginning in version 1.6.5.68.
Example: In the Liq field there is an eight character string of "ABCDEFGH". The following examples of slicing could be used:
Condition examples | Fee Rule Syntax |
liq[1] will match against A | liq[1]=A => 0.001 |
liq[2] will match against B | liq[2]=B => 0.001 |
liq[1:2] will match against AB | liq[1:2]=AB => 0.001 |
liq[1:5] will match against ABCDE | liq[1:5]=ABCDE => 0.001 |
liq[4:] will match against DEFGH | liq[4:]=DEFGH => 0.001 |
liq[:4] will match against ABCD | liq[:4]=ABCD => 0.001 |
When multiple sliced conditions need to be true, use the AND-ing semi-colon character ";" liq[1] will match against A and liq[4] will match against D | liq[1]=A;liq[4]=D => 0.001 |
When one sliced condition needs to be true, use the OR-ing comma character "," liq[1] will match against A or liq[4] will match against D | liq[1]=A,liq[4]=D => 0.001 |
Fees
Positive fees are charges, negative fees are rebates. There are four ways to assess a fee or rebate:
Method | Example |
---|---|
Per Share | 0.003 (1,000 shares @ $2 is charged 1,000 * 0.003 = $3.00). |
Percentage of Value | 0.003% (1,000 shares @ $2 is charged $2,000 * 0.003 = $6.00). |
Fixed Amount per Execution (available in v1.5.92.51.3 or greater) | [10] ($10 is charged) |
Pass Through (do not change) | blank (the fee will be left as received from the data source) |
You can also specify a minimum/maximum of two or three fees (available in PropReports v1.5.91.17 and greater):
Example | Description |
---|---|
max(0.003%, 0.003) | Result will be the highest of : (0.003 * trade value) or (0.003 * quantity) |
min(0.003%, 0.003, |
[3]) | Result will be the lowest of : (0.003 * trade value) or (0.003 * quantity) or 3 |
Markup/Markdown
To mark up or mark down a received (original) fee you can specify a fee as follows (PropReports v1.5.97.14.36 and greater):
Important: When using in Fee Rules plan, the fee that is being marked up/down is the computed Exchange Fee. If you need to mark up/down a different trade fee, you will need to use this within a Per Execution plan type.
Example | Description |
---|---|
markup(0.003) | Add a charge of 0.003 per share to the imported fee. |
markdown([1]) | Reduce imported fee by $1 |
Blocks
To avoid repeating the same condition you can specify blocks.
Instead of:
route=EDGA;liq=A => -
0.002
route=EDGA;liq=B =>
0.0002
You can use:
route=EDGA {
liq=A => -
0.002
liq=B =>
0.0002
}
Blocks can also be nested. For example:
route=EDGA {
penny=
true
{
liq=A => -
0.001
%
liq=B =>
0.003
%
}
liq=A => -
0.002
liq=B =>
0.0002
}
Comments
Any lines that start with a '#' are ignored. Any text following a '#' at the end of a line will also be ignored. Comments are available in PropReports v1.5.91.17 and greater.
# this Comment line will be ignored
route=EDGA;liq=A => -
0.002
route=EDGA;liq=B =>
0.002
# another comment that will be ignored
...