# `Bourse.Position`
[🔗](https://github.com/ZenHive/bourse/blob/main/lib/bourse/position.ex#L1)

Unified derivatives position data.

Represents an open position on a derivatives exchange (futures, swaps, options).

## Fields

  * `id` - Position ID
  * `symbol` - Unified symbol (e.g., "BTC/USDT:USDT")
  * `timestamp` - Last update time in milliseconds
  * `datetime` - ISO 8601 datetime string
  * `side` - "long" or "short"
  * `contracts` - Number of contracts
  * `contract_size` - Size of one contract
  * `notional` - Absolute position value denominated by `notional_currency`.
    The numeric value preserves the venue's published unit.
  * `notional_currency` - Unified currency code that denominates `notional`.
    Populated whenever `notional` is populated on the unified read path.
  * `base_quantity` - Absolute position size in the base currency. Populated
    only for Deribit future rows from `size_currency`. It is `nil` for Deribit
    options and other venues; their `contracts` may already be base-denominated.
  * `leverage` - Current leverage
  * `unrealized_pnl` - Unrealized profit/loss
  * `realized_pnl` - Realized profit/loss
  * `cumulative_funding` - Funding settled for the position
  * `pending_funding` - Funding not yet settled into cash balance
  * `total_fees` - Fees paid while opening or changing the position
  * `net_settlements` - Net USD paid or received from settlements
  * `collateral` - Collateral amount
  * `entry_price` - Average entry price
  * `mark_price` - Current mark price
  * `liquidation_price` - Estimated liquidation price
  * `margin_mode` - "cross" or "isolated"
  * `isolated` - Whether the position uses isolated margin
  * `hedged` - Whether position is in hedge mode
  * `maintenance_margin` - Required maintenance margin
  * `maintenance_margin_percentage` - Maintenance margin as a fraction (0.1 = 10%)
  * `initial_margin` - Required initial margin
  * `initial_margin_percentage` - Initial margin as a fraction (0.1 = 10%)
  * `margin_ratio` - Current margin ratio as a fraction (0.1 = 10%)
  * `last_update_timestamp` - Last update timestamp
  * `last_price` - Last traded price
  * `stop_loss_price` - Stop loss price
  * `take_profit_price` - Take profit price
  * `percentage` - PnL in percent points (10 = 10%)
  * `margin` - Position margin
  * `info` - Raw exchange response

# `t`

```elixir
@type t() :: %Bourse.Position{
  base_quantity: number() | nil,
  collateral: number() | nil,
  contract_size: number() | nil,
  contracts: number() | nil,
  cumulative_funding: number() | nil,
  datetime: String.t() | nil,
  entry_price: number() | nil,
  hedged: boolean() | nil,
  id: String.t() | nil,
  info: map() | nil,
  initial_margin: number() | nil,
  initial_margin_percentage: number() | nil,
  isolated: boolean() | nil,
  last_price: number() | nil,
  last_update_timestamp: integer() | nil,
  leverage: number() | nil,
  liquidation_price: number() | nil,
  maintenance_margin: number() | nil,
  maintenance_margin_percentage: number() | nil,
  margin: number() | nil,
  margin_mode: String.t() | nil,
  margin_ratio: number() | nil,
  mark_price: number() | nil,
  net_settlements: number() | nil,
  notional: number() | nil,
  notional_currency: String.t() | nil,
  pending_funding: number() | nil,
  percentage: number() | nil,
  realized_pnl: number() | nil,
  side: String.t() | nil,
  stop_loss_price: number() | nil,
  symbol: String.t() | nil,
  take_profit_price: number() | nil,
  timestamp: integer() | nil,
  total_fees: number() | nil,
  unrealized_pnl: number() | nil
}
```

# `long?`

```elixir
@spec long?(t()) :: boolean()
```

Returns true if the position is long.

# `profitable?`

```elixir
@spec profitable?(t()) :: boolean()
```

Returns true if the position has positive unrealized PnL.

# `schema`

```elixir
@spec schema() :: map()
```

JSON Schema for the Position unified type.

# `short?`

```elixir
@spec short?(t()) :: boolean()
```

Returns true if the position is short.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
