Class OrderPlacementPolicy

java.lang.Object
com.quantfinlib.execution.OrderPlacementPolicy

public final class OrderPlacementPolicy extends Object
The post-or-cross decision — the smallest and most repeated choice in execution, made explicit as expected-cost arithmetic instead of habit. Relative to the current mid, for a buy:
  cross now:   pay the half spread                    → h
  post at bid: filled (prob p):  earn h, pay adverse selection a,
               collect the rebate r                    → a − h − r
               unfilled (1−p):   cross later after the
               market drifted d against you            → h + d

  expected post cost = p·(a − h − r) + (1−p)·(h + d)
  POST iff that beats h

The inputs are the honest parts: fillProbability from microstructure.FillProbabilityModel (or your own), the adverse-selection cost a from post-fill markouts (a passive fill happens exactly when the market comes THROUGH you — free money it is not), and the drift d from your alpha (positive = expected to move against a waiting buyer). All in the same per-unit currency. Static, deterministic, research/warm lane; per-share or per-notional units both work as long as they are consistent.

  • Method Details

    • decide

      public static OrderPlacementPolicy.Placement decide(double halfSpread, double fillProbability, double adverseSelection, double adverseDrift, double rebate)
      Parameters:
      halfSpread - half the touch spread, > 0
      fillProbability - P(passive order fills within the horizon), in [0, 1]
      adverseSelection - expected cost WHEN passively filled (post-fill markout), ≥ 0
      adverseDrift - expected move against the order while waiting unfilled (signed: negative = the market is expected to come to you)
      rebate - maker rebate per unit, ≥ 0
    • postRegion

      public static OrderPlacementPolicy.PostRegion postRegion(double halfSpread, double adverseSelection, double adverseDrift, double rebate)
      The desk's rule for these market conditions: post iff the fill probability lands inside the returned region of [0, 1].