Fee Rules

Fee rules are a concise way to specify an ECN fee schedule or any other schedule that contains a large number of conditional fees.

How the Rules Work
 

  1. Rules are processed first to last for every execution. 
  2. The first rule in the list that matches determines the fee.
  3. If no rule matches, the fee received from the data source is left unchanged.

(warning) Important: Make sure the Formula Type is set to "Fee Rules" when creating a plan.

Creating a Rule

Below is a sample rule:

    route=ARCA,ARCAPOP;penny=true;liq=A => 0.003


The left-hand side (everything before =>) 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

capacityTrading 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

execBrokerMPID / identifier of the executing broker.execBroker=PFSI
internalContraIndicates 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
internalLiqIndicates 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
internalRouteIndicates 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) 
(EVEN = if quantity divisible by 100) 
(MIXED = if > 100 and not divisible by 100 evenly)

lot=odd 
lot=even 
lot=mixed

multThe 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

timeExecution 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=EDGA;contra=BATS => 0.003

OR-ing conditions

Sometimes you may want to match more than one set of conditions, and you can do so with the use of the comma character ",". For example, let's say you want to select trades where either the destination or contra are set to ARCA. Since version 1.5.92.18 you can specify a rule as follows (please note the use of parenthesis):

    (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 examplesFee Rule Syntax

liq[1] will match against A

liq[1]=A => 0.001
liq[2] will match against Bliq[2]=B => 0.001
liq[1:2] will match against ABliq[1:2]=AB => 0.001
liq[1:5] will match against ABCDEliq[1:5]=ABCDE => 0.001
liq[4:] will match against DEFGHliq[4:]=DEFGH => 0.001
liq[:4] will match against ABCDliq[: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:

MethodExample
Per Share0.003     (1,000 shares @ $2 is charged 1,000 * 0.003 = $3.00).
Percentage of Value0.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):

ExampleDescription
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): 

(warning) 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.

ExampleDescription
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