Module Trading_engine.Account

Exact multi-currency cash, signed-position, cost-basis, and P&L accounting.

type execution_fee_component = private {
  1. name : string;
  2. kind : string;
  3. currency : string;
  4. amount : Scalar.Money.t;
  5. quote_amount : Scalar.Money.t;
}
type execution_fee_component_attribution = private {
  1. name : string;
  2. kind : string;
  3. currency : string;
  4. amount : Scalar.Money.t;
  5. quote_currency : string;
  6. quote_amount : Scalar.Money.t;
  7. base_amount : Scalar.Money.t;
}
type position = private {
  1. quantity : Scalar.Quantity.t;
  2. cost_basis : Scalar.Money.t;
  3. realized_pnl : Scalar.Money.t;
  4. dividend_pnl : Scalar.Money.t;
  5. execution_fees : Scalar.Money.t;
  6. borrow_fees : Scalar.Money.t;
  7. execution_fee_components : execution_fee_component list;
}
type cash_attribution = private {
  1. currency : string;
  2. amount : Scalar.Money.t;
  3. settled_amount : Scalar.Money.t;
  4. unsettled_amount : Scalar.Money.t;
  5. fx_rate : Scalar.Price.t;
  6. base_value : Scalar.Money.t;
  7. base_settled_value : Scalar.Money.t;
  8. base_unsettled_value : Scalar.Money.t;
  9. interest : Scalar.Money.t;
  10. base_interest : Scalar.Money.t;
}
type position_attribution = private {
  1. instrument_id : Id.Instrument.t;
  2. quote_currency : string;
  3. quantity : Scalar.Quantity.t;
  4. settled_quantity : Scalar.Quantity.t;
  5. unsettled_quantity : Scalar.Quantity.t;
  6. mark : Scalar.Price.t;
  7. fx_rate : Scalar.Price.t;
  8. market_value : Scalar.Money.t;
  9. base_market_value : Scalar.Money.t;
  10. cost_basis : Scalar.Money.t;
  11. base_cost_basis : Scalar.Money.t;
  12. realized_pnl : Scalar.Money.t;
  13. base_realized_pnl : Scalar.Money.t;
  14. unrealized_pnl : Scalar.Money.t;
  15. base_unrealized_pnl : Scalar.Money.t;
  16. dividend_pnl : Scalar.Money.t;
  17. base_dividend_pnl : Scalar.Money.t;
  18. execution_fees : Scalar.Money.t;
  19. base_execution_fees : Scalar.Money.t;
  20. borrow_fees : Scalar.Money.t;
  21. base_borrow_fees : Scalar.Money.t;
  22. total_fees : Scalar.Money.t;
  23. base_total_fees : Scalar.Money.t;
  24. execution_fee_components : execution_fee_component_attribution list;
}
type t
type valuation = private {
  1. base_currency : string;
  2. cash : Scalar.Money.t;
  3. settled_cash : Scalar.Money.t;
  4. unsettled_cash : Scalar.Money.t;
  5. net_market_value : Scalar.Money.t;
  6. long_market_value : Scalar.Money.t;
  7. short_market_value : Scalar.Money.t;
  8. gross_exposure : Scalar.Money.t;
  9. cost_basis : Scalar.Money.t;
  10. realized_pnl : Scalar.Money.t;
  11. unrealized_pnl : Scalar.Money.t;
  12. equity : Scalar.Money.t;
  13. dividend_pnl : Scalar.Money.t;
  14. execution_fees : Scalar.Money.t;
  15. borrow_fees : Scalar.Money.t;
  16. cash_interest : Scalar.Money.t;
  17. total_fees : Scalar.Money.t;
  18. cash_balances : cash_attribution list;
  19. positions : position_attribution list;
  20. execution_fee_components : execution_fee_component_attribution list;
}
val create : base_currency:string -> initial_cash:(string * Scalar.Money.t) list -> (t, string) Stdlib.result
val of_initial_portfolio : Initial_portfolio.t -> (t, string) Stdlib.result
val base_currency : t -> string
val initial_cash : t -> (string * Scalar.Money.t) list
val cash_balances : t -> (string * Scalar.Money.t) list
val cash : t -> string -> Scalar.Money.t option
val settled_cash : t -> string -> Scalar.Money.t option
val position : t -> Id.Instrument.t -> position
val position_quantity : t -> Id.Instrument.t -> Scalar.Quantity.t
val settled_position_quantity : t -> Id.Instrument.t -> Scalar.Quantity.t
val positions : t -> (Id.Instrument.t * position) list
val apply_fill : t -> Fill.t -> (t, string) Stdlib.result
val apply_unsettled_fill : t -> Fill.t -> (t, string) Stdlib.result
val apply_settlement : t -> Settlement.instruction -> (t, string) Stdlib.result
val apply_split : t -> instrument_id:Id.Instrument.t -> numerator:int64 -> denominator:int64 -> (t, string) Stdlib.result
val apply_cash_dividend : t -> instrument_id:Id.Instrument.t -> quote_currency:string -> amount_per_unit:Scalar.Money.t -> (t, string) Stdlib.result
type distribution_result = {
  1. source_quantity : Scalar.Quantity.t;
  2. destination_quantity : Scalar.Quantity.t;
  3. fractional_quantity : Scalar.Quantity.t;
  4. allocated_basis : Scalar.Money.t;
  5. fractional_basis : Scalar.Money.t;
  6. cash_in_lieu : Scalar.Money.t;
}
val apply_distribution : t -> source_instrument_id:Id.Instrument.t -> destination_instrument_id:Id.Instrument.t -> destination_lot_size:Scalar.Quantity.t -> numerator:int64 -> denominator:int64 -> basis_allocation_bps:int -> fractional_policy:Corporate_action.fractional_policy -> (t * distribution_result, string) Stdlib.result
val cash_out_position : t -> instrument_id:Id.Instrument.t -> currency:string -> price:Scalar.Price.t -> (t * Scalar.Quantity.t * Scalar.Money.t, string) Stdlib.result
val apply_borrow_fee : t -> instrument_id:Id.Instrument.t -> quote_currency:string -> fee:Scalar.Money.t -> (t, string) Stdlib.result
val apply_cash_interest : t -> currency:string -> interest:Scalar.Money.t -> (t, string) Stdlib.result
val value : t -> instruments:Instrument.t list -> marks:(Id.Instrument.t * Scalar.Price.t) list -> fx_rates:(string * Scalar.Price.t) list -> (valuation, string) Stdlib.result

value state ~instruments ~marks ~fx_rates attributes every supplied mark and retained account position. Marks must cover positions with nonzero quantity. A retained flat position may omit its mark; its attribution then uses the canonical mark one.

val pp_valuation : Stdlib.Format.formatter -> valuation -> unit