Module Trading_engine.Risk

Deterministic signed-position, exposure, leverage, and margin checks.

type t
type instrument_policy = private {
  1. instrument_id : Id.Instrument.t;
  2. max_order_quantity : Scalar.Quantity.t;
  3. max_long_position : Scalar.Quantity.t;
  4. max_short_position : Scalar.Quantity.t;
  5. max_notional_exposure : Scalar.Money.t option;
  6. initial_margin_bps : int;
  7. maintenance_margin_bps : int;
  8. shorting_allowed : bool;
}
type group_kind =
  1. | Issuer
  2. | Sector
  3. | Currency
  4. | Country
  5. | Asset_class
  6. | Custom
type group_limits = private {
  1. max_gross_exposure : Scalar.Money.t option;
  2. max_long_exposure : Scalar.Money.t option;
  3. max_short_exposure : Scalar.Money.t option;
  4. max_absolute_net_exposure : Scalar.Money.t option;
  5. max_concentration : Scalar.Ratio.t option;
}
type group = private {
  1. group_id : Id.Risk_group.t;
  2. group_kind : group_kind;
  3. instrument_ids : Id.Instrument.t list;
  4. limits : group_limits;
}
type group_exposure = private {
  1. group_id : Id.Risk_group.t;
  2. gross_exposure : Scalar.Money.t;
  3. net_exposure : Scalar.Money.t;
  4. long_exposure : Scalar.Money.t;
  5. short_exposure : Scalar.Money.t;
  6. concentration : Scalar.Weight.t option;
}
type margin_snapshot = private {
  1. initial_requirement : Scalar.Money.t;
  2. maintenance_requirement : Scalar.Money.t;
  3. initial_excess : Scalar.Money.t;
  4. maintenance_excess : Scalar.Money.t;
  5. margin_call : bool;
  6. group_exposures : group_exposure list;
}
type fill_limit =
  1. | Maximum_order_quantity of Scalar.Quantity.t
  2. | Maximum_long_position of Scalar.Quantity.t
  3. | Maximum_short_position of Scalar.Quantity.t
  4. | Maximum_gross_exposure of Scalar.Money.t
  5. | Maximum_leverage of Scalar.Ratio.t
  6. | Initial_margin of int
  7. | Instrument_maximum_long_position of Id.Instrument.t * Scalar.Quantity.t
  8. | Instrument_maximum_short_position of Id.Instrument.t * Scalar.Quantity.t
  9. | Instrument_maximum_notional of Id.Instrument.t * Scalar.Money.t
  10. | Instrument_shorting_disabled of Id.Instrument.t
  11. | Instrument_borrow_availability of Id.Instrument.t * Scalar.Quantity.t
  12. | Settlement_cash_buying_power of string * Scalar.Money.t
  13. | Settlement_position_availability of Id.Instrument.t * Scalar.Quantity.t
  14. | Instrument_initial_margin of Id.Instrument.t * int
  15. | Group_maximum_gross of Id.Risk_group.t * Scalar.Money.t
  16. | Group_maximum_long of Id.Risk_group.t * Scalar.Money.t
  17. | Group_maximum_short of Id.Risk_group.t * Scalar.Money.t
  18. | Group_maximum_absolute_net of Id.Risk_group.t * Scalar.Money.t
  19. | Group_maximum_concentration of Id.Risk_group.t * Scalar.Ratio.t
type fill_check_error =
  1. | Limit of fill_limit
  2. | Invalid of string
val create : base_currency:string -> instruments:Instrument.t list -> max_order_quantity:Scalar.Quantity.t -> max_long_position:Scalar.Quantity.t -> max_short_position:Scalar.Quantity.t -> max_gross_exposure:Scalar.Money.t -> max_leverage:Scalar.Ratio.t -> initial_margin_bps:int -> maintenance_margin_bps:int -> short_borrow_bps:int -> (t, string) Stdlib.result
val create_instrument_policy : instrument:Instrument.t -> max_order_quantity:Scalar.Quantity.t -> max_long_position:Scalar.Quantity.t -> max_short_position:Scalar.Quantity.t -> max_notional_exposure:Scalar.Money.t option -> initial_margin_bps:int -> maintenance_margin_bps:int -> shorting_allowed:bool -> (instrument_policy, string) Stdlib.result
val create_group_limits : max_gross_exposure:Scalar.Money.t option -> max_long_exposure:Scalar.Money.t option -> max_short_exposure:Scalar.Money.t option -> max_absolute_net_exposure:Scalar.Money.t option -> max_concentration:Scalar.Ratio.t option -> (group_limits, string) Stdlib.result
val create_group : group_id:Id.Risk_group.t -> group_kind:group_kind -> instrument_ids:Id.Instrument.t list -> limits:group_limits -> (group, string) Stdlib.result
val create_v7 : base_currency:string -> instruments:Instrument.t list -> instrument_policies:instrument_policy list -> groups:group list -> max_gross_exposure:Scalar.Money.t -> max_leverage:Scalar.Ratio.t -> short_borrow_bps:int -> (t, string) Stdlib.result
val base_currency : t -> string
val instruments : t -> Instrument.t list
val instrument : t -> Id.Instrument.t -> Instrument.t option
val instrument_policies : t -> instrument_policy list
val instrument_policy : t -> Id.Instrument.t -> instrument_policy option
val groups : t -> group list
val max_order_quantity : t -> Scalar.Quantity.t
val max_long_position : t -> Scalar.Quantity.t
val max_short_position : t -> Scalar.Quantity.t
val max_gross_exposure : t -> Scalar.Money.t
val max_leverage : t -> Scalar.Ratio.t
val initial_margin_bps : t -> int
val maintenance_margin_bps : t -> int
val short_borrow_bps : t -> int
val max_order_quantity_for : t -> Id.Instrument.t -> Scalar.Quantity.t option
val check_position : t -> Scalar.Quantity.t -> (unit, string) Stdlib.result
val check_position_for : t -> Id.Instrument.t -> Scalar.Quantity.t -> (unit, string) Stdlib.result
val margin_snapshot : t -> Account.valuation -> (margin_snapshot, string) Stdlib.result
val group_exposures : t -> Account.valuation -> (group_exposure list, string) Stdlib.result
val check_initial : t -> Account.valuation -> (unit, string) Stdlib.result
val check_post_fill : t -> before_position:Scalar.Quantity.t -> after_position:Scalar.Quantity.t -> before:Account.valuation -> after:Account.valuation -> (unit, fill_check_error) Stdlib.result
val check_post_fill_for : t -> instrument_id:Id.Instrument.t -> before_position:Scalar.Quantity.t -> after_position:Scalar.Quantity.t -> before:Account.valuation -> after:Account.valuation -> (unit, fill_check_error) Stdlib.result
val check_reserved_fill : t -> account:Account.t -> oms:Oms.t -> marks:(Id.Instrument.t * Scalar.Price.t) list -> fx_rates:(string * Scalar.Price.t) list -> order:Order.t -> filled_quantity:Scalar.Quantity.t -> after:Account.valuation -> (unit, fill_check_error) Stdlib.result
val check : t -> account:Account.t -> oms:Oms.t -> marks:(Id.Instrument.t * Scalar.Price.t) list -> fx_rates:(string * Scalar.Price.t) list -> Order.request -> (unit, string) Stdlib.result