ZenCex.Adapters.Binance.PortfolioMargin (zen_cex v0.2.1)

View Source

Portfolio Margin trading endpoints for Binance.

Portfolio Margin is Binance's advanced trading mode that provides unified margin and risk management across multiple trading products. It's designed for sophisticated traders who need capital efficiency across different markets.

Supported Product Types

  • USD-M Futures (UM): USDT-margined perpetual and quarterly futures
  • COIN-M Futures (CM): Coin-margined perpetual and quarterly futures
  • Margin Trading: Cross and isolated margin trading (spot with leverage)

Key Features

Cross-Collateralization

All assets in your portfolio can be used as collateral across different products. For example, your BTC holdings can secure USDT futures positions.

Unified Risk Management

  • Single maintenance margin calculation across all positions
  • Portfolio-level liquidation instead of position-level
  • Advanced risk metrics including Greeks for options (when available)

Enhanced Capital Efficiency

  • Lower margin requirements due to portfolio offsetting
  • Hedged positions require less collateral
  • Automatic borrowing and lending between products

API Characteristics

  • Base URL: https://papi.binance.com (production only)
  • Rate Limit: 3,000 requests per minute (higher than standard APIs)
  • Testnet Support: NOT available - returns 404 on testnet
  • Path Prefix: All endpoints use /papi/v1/ prefix

Account Requirements

  1. Activation Required: Portfolio Margin must be activated on your account
  2. VIP Level: Generally requires VIP 1 or higher
  3. API Permissions: API key needs Portfolio Margin trading permission
  4. IP Whitelist: Recommended for security

Common Use Cases

1. Unified Account View

# Get complete account information across all products
{:ok, account} = PortfolioMargin.get_unified_account()

2. Cross-Product Orders

# Place order using cross-collateral
{:ok, order} = PortfolioMargin.place_unified_order(%{
  symbol: "BTCUSDT",
  side: "BUY",
  type: "LIMIT",
  quantity: "0.001",
  price: "40000",
  product_type: "UM"  # Optional: auto-detected from symbol
})

3. Risk Monitoring

# Get all positions with unified margin calculations
{:ok, positions} = PortfolioMargin.get_all_positions()

Important Considerations

  • No Testnet: All testing must be done carefully in production with small amounts
  • Liquidation Risk: Portfolio liquidation affects ALL positions
  • Complexity: Requires understanding of cross-margin and portfolio risk
  • Product Limits: Some features may be limited based on your VIP level

Error Handling

Common errors specific to Portfolio Margin:

  • {:error, {:not_activated, _}} - Portfolio Margin not activated on account
  • {:error, {:insufficient_margin, _}} - Not enough collateral across portfolio
  • {:error, {:invalid_product_type, _}} - Product type not supported or detected
  • {:error, {:no_testnet_for_portfolio_margin}} - Testnet access attempted

Rate Limiting

Portfolio Margin has a separate rate limit pool:

  • 3,000 weight per minute (compared to 1,200 for spot)
  • Shared across all /papi/ endpoints
  • Not affected by spot or futures rate limits

Summary

Functions

Returns all configured endpoints.

Cancel All CM Open Conditional Orders

Cancel All CM Open Orders

Cancel All UM Open Conditional Orders

Cancel All UM Open Orders

Cancel CM Conditional Order

Cancel Margin Account All Open Orders on a Symbol

Cancel Margin Account OCO Orders

Cancel Margin Account Order

Cancel UM Conditional Order

Change Auto-repay-futures Status

Change CM Initial Leverage

Change CM Position Mode

Change UM Initial Leverage

Change UM Position Mode

CM Account Trade List

CM Notional and Leverage Brackets

CM Position ADL Quantile Estimation

Fund Collection by Asset

Get all positions across UM, CM, and Margin products.

Get Auto-repay-futures Status

Get CM Account Detail

Get CM Current Position Mode

Get CM Income History

Get Download Id For UM Futures Order History

Get Download Id For UM Futures Trade History

Get Download Id For UM Futures Transaction History

Returns the endpoint configuration for the given operation.

Get Margin Borrow/Loan Interest History

Get UM Account Detail

Get UM Account Detail V2

Get UM Current Position Mode

Get UM Futures BNB Burn Status

Get UM Futures Order Download Link by Id

Get UM Futures Trade Download Link by Id

Get UM Futures Transaction Download Link by Id

Get UM Income History

Get unified account information across all product types.

Get User Commission Rate for CM

Get User Commission Rate for UM

Returns the rate limit weight for an operation.

Margin Account Borrow

Margin Account New OCO

Margin Account Repay Debt

Margin Account Trade List

New CM Conditional Order

New UM Conditional Order

Place a unified order that can span multiple product types.

Portfolio Margin UM Trading Quantitative Rules Indicators

Query All CM Conditional Orders

Query All Current CM Open Conditional Orders

Query All Current CM Open Orders

Query All Current UM Open Conditional Orders

Query All Current UM Open Orders

Query All Margin Account Orders

Query All UM Conditional Orders

Query CM Conditional Order History

Query CM Modify Order History

Query CM Position Information

Query Current CM Open Conditional Order

Query Current CM Open Order

Query Current Margin Open Order

Query Current UM Open Conditional Order

Query Current UM Open Order

Query Margin Account Order

Query Margin Account's all OCO

Query Margin Account's OCO

Query Margin Account's Open OCO

Query Margin Loan Record

Query Margin Max Withdraw

Query Margin repay Record

Query Portfolio Margin Negative Balance Interest History

Query UM Conditional Order History

Query UM Modify Order History

Query UM Position Information

Query User Negative Balance Auto Exchange Record

Query User Rate Limit

Query User's CM Force Orders

Query User's Margin Force Orders

Query User's UM Force Orders

Repay futures Negative Balance

Toggle BNB Burn On UM Futures Trade

UM Account Trade List

UM Futures Account Configuration

UM Futures Symbol Configuration

UM Notional and Leverage Brackets

UM Position ADL Quantile Estimation

Functions

account_balance(params \\ %{})

@spec account_balance(map()) :: {:ok, term()} | {:error, term()}

Account Balance

account_balance(params, opts)

@spec account_balance(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

account_information(params \\ %{})

@spec account_information(map()) :: {:ok, term()} | {:error, term()}

Account Information

account_information(params, opts)

@spec account_information(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

all_endpoints()

@spec all_endpoints() :: [map()]

Returns all configured endpoints.

bnb_transfer(params \\ %{})

@spec bnb_transfer(map()) :: {:ok, term()} | {:error, term()}

BNB transfer

bnb_transfer(params, opts)

@spec bnb_transfer(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

cancel_all_cm_open_conditional_orders(params \\ %{})

@spec cancel_all_cm_open_conditional_orders(map()) :: {:ok, term()} | {:error, term()}

Cancel All CM Open Conditional Orders

cancel_all_cm_open_conditional_orders(params, opts)

@spec cancel_all_cm_open_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_all_cm_open_orders(params \\ %{})

@spec cancel_all_cm_open_orders(map()) :: {:ok, term()} | {:error, term()}

Cancel All CM Open Orders

cancel_all_cm_open_orders(params, opts)

@spec cancel_all_cm_open_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_all_um_open_conditional_orders(params \\ %{})

@spec cancel_all_um_open_conditional_orders(map()) :: {:ok, term()} | {:error, term()}

Cancel All UM Open Conditional Orders

cancel_all_um_open_conditional_orders(params, opts)

@spec cancel_all_um_open_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_all_um_open_orders(params \\ %{})

@spec cancel_all_um_open_orders(map()) :: {:ok, term()} | {:error, term()}

Cancel All UM Open Orders

cancel_all_um_open_orders(params, opts)

@spec cancel_all_um_open_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_cm_conditional_order(params \\ %{})

@spec cancel_cm_conditional_order(map()) :: {:ok, term()} | {:error, term()}

Cancel CM Conditional Order

cancel_cm_conditional_order(params, opts)

@spec cancel_cm_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_cm_order(params \\ %{})

@spec cancel_cm_order(map()) :: {:ok, term()} | {:error, term()}

Cancel CM Order

cancel_cm_order(params, opts)

@spec cancel_cm_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

cancel_margin_account_all_open_orders_on_a_symbol(params \\ %{})

@spec cancel_margin_account_all_open_orders_on_a_symbol(map()) ::
  {:ok, term()} | {:error, term()}

Cancel Margin Account All Open Orders on a Symbol

cancel_margin_account_all_open_orders_on_a_symbol(params, opts)

@spec cancel_margin_account_all_open_orders_on_a_symbol(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_margin_account_oco_orders(params \\ %{})

@spec cancel_margin_account_oco_orders(map()) :: {:ok, term()} | {:error, term()}

Cancel Margin Account OCO Orders

cancel_margin_account_oco_orders(params, opts)

@spec cancel_margin_account_oco_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_margin_account_order(params \\ %{})

@spec cancel_margin_account_order(map()) :: {:ok, term()} | {:error, term()}

Cancel Margin Account Order

cancel_margin_account_order(params, opts)

@spec cancel_margin_account_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_um_conditional_order(params \\ %{})

@spec cancel_um_conditional_order(map()) :: {:ok, term()} | {:error, term()}

Cancel UM Conditional Order

cancel_um_conditional_order(params, opts)

@spec cancel_um_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cancel_um_order(params \\ %{})

@spec cancel_um_order(map()) :: {:ok, term()} | {:error, term()}

Cancel UM Order

cancel_um_order(params, opts)

@spec cancel_um_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

change_auto_repay_futures_status(params \\ %{})

@spec change_auto_repay_futures_status(map()) :: {:ok, term()} | {:error, term()}

Change Auto-repay-futures Status

change_auto_repay_futures_status(params, opts)

@spec change_auto_repay_futures_status(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

change_cm_initial_leverage(params \\ %{})

@spec change_cm_initial_leverage(map()) :: {:ok, term()} | {:error, term()}

Change CM Initial Leverage

change_cm_initial_leverage(params, opts)

@spec change_cm_initial_leverage(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

change_cm_position_mode(params \\ %{})

@spec change_cm_position_mode(map()) :: {:ok, term()} | {:error, term()}

Change CM Position Mode

change_cm_position_mode(params, opts)

@spec change_cm_position_mode(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

change_um_initial_leverage(params \\ %{})

@spec change_um_initial_leverage(map()) :: {:ok, term()} | {:error, term()}

Change UM Initial Leverage

change_um_initial_leverage(params, opts)

@spec change_um_initial_leverage(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

change_um_position_mode(params \\ %{})

@spec change_um_position_mode(map()) :: {:ok, term()} | {:error, term()}

Change UM Position Mode

change_um_position_mode(params, opts)

@spec change_um_position_mode(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cm_account_trade_list(params \\ %{})

@spec cm_account_trade_list(map()) :: {:ok, term()} | {:error, term()}

CM Account Trade List

cm_account_trade_list(params, opts)

@spec cm_account_trade_list(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cm_notional_and_leverage_brackets(params \\ %{})

@spec cm_notional_and_leverage_brackets(map()) :: {:ok, term()} | {:error, term()}

CM Notional and Leverage Brackets

cm_notional_and_leverage_brackets(params, opts)

@spec cm_notional_and_leverage_brackets(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

cm_position_adl_quantile_estimation(params \\ %{})

@spec cm_position_adl_quantile_estimation(map()) :: {:ok, term()} | {:error, term()}

CM Position ADL Quantile Estimation

cm_position_adl_quantile_estimation(params, opts)

@spec cm_position_adl_quantile_estimation(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

fund_auto_collection(params \\ %{})

@spec fund_auto_collection(map()) :: {:ok, term()} | {:error, term()}

Fund Auto-collection

fund_auto_collection(params, opts)

@spec fund_auto_collection(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

fund_collection_by_asset(params \\ %{})

@spec fund_collection_by_asset(map()) :: {:ok, term()} | {:error, term()}

Fund Collection by Asset

fund_collection_by_asset(params, opts)

@spec fund_collection_by_asset(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_all_positions(params \\ %{})

@spec get_all_positions(map()) :: {:ok, map()} | {:error, term()}

Get all positions across UM, CM, and Margin products.

Returns a unified view of all positions with cross-margin calculations. This provides a complete picture of your portfolio risk exposure.

Response Structure

Returns a map with product types as keys:

%{
  um_futures: [
    %{
      "symbol" => "BTCUSDT",
      "positionAmt" => "0.001",
      "entryPrice" => "45000",
      "markPrice" => "46000",
      "unRealizedProfit" => "1.00",
      "marginType" => "cross",
      "positionSide" => "BOTH"
    }
  ],
  cm_futures: [
    %{
      "symbol" => "BTCUSD_PERP",
      "positionAmt" => "100",  # contracts
      "entryPrice" => "45000",
      "markPrice" => "46000",
      "unRealizedProfit" => "0.002",  # in BTC
      "marginType" => "cross"
    }
  ]
}

Parameters

  • symbol (optional): Filter for specific symbol
  • recvWindow (optional): Request validity window

Examples

# Get all positions
{:ok, positions} = PortfolioMargin.get_all_positions()

# Get positions for specific symbol
{:ok, positions} = PortfolioMargin.get_all_positions(%{symbol: "BTCUSDT"})

# Access specific product positions
{:ok, %{um_futures: um, cm_futures: cm}} = PortfolioMargin.get_all_positions()

Notes

  • Margin positions endpoint is not yet available from Binance
  • Empty positions are returned as empty lists
  • All positions use cross margin in Portfolio Margin mode

get_all_positions(params, opts)

@spec get_all_positions(
  map(),
  keyword()
) :: {:ok, map()} | {:error, term()}

get_auto_repay_futures_status(params \\ %{})

@spec get_auto_repay_futures_status(map()) :: {:ok, term()} | {:error, term()}

Get Auto-repay-futures Status

get_auto_repay_futures_status(params, opts)

@spec get_auto_repay_futures_status(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_cm_account_detail(params \\ %{})

@spec get_cm_account_detail(map()) :: {:ok, term()} | {:error, term()}

Get CM Account Detail

get_cm_account_detail(params, opts)

@spec get_cm_account_detail(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_cm_current_position_mode(params \\ %{})

@spec get_cm_current_position_mode(map()) :: {:ok, term()} | {:error, term()}

Get CM Current Position Mode

get_cm_current_position_mode(params, opts)

@spec get_cm_current_position_mode(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_cm_income_history(params \\ %{})

@spec get_cm_income_history(map()) :: {:ok, term()} | {:error, term()}

Get CM Income History

get_cm_income_history(params, opts)

@spec get_cm_income_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_download_id_for_um_futures_order_history(params \\ %{})

@spec get_download_id_for_um_futures_order_history(map()) ::
  {:ok, term()} | {:error, term()}

Get Download Id For UM Futures Order History

get_download_id_for_um_futures_order_history(params, opts)

@spec get_download_id_for_um_futures_order_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_download_id_for_um_futures_trade_history(params \\ %{})

@spec get_download_id_for_um_futures_trade_history(map()) ::
  {:ok, term()} | {:error, term()}

Get Download Id For UM Futures Trade History

get_download_id_for_um_futures_trade_history(params, opts)

@spec get_download_id_for_um_futures_trade_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_download_id_for_um_futures_transaction_history(params \\ %{})

@spec get_download_id_for_um_futures_transaction_history(map()) ::
  {:ok, term()} | {:error, term()}

Get Download Id For UM Futures Transaction History

get_download_id_for_um_futures_transaction_history(params, opts)

@spec get_download_id_for_um_futures_transaction_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_endpoint(arg1)

@spec get_endpoint(atom()) :: map() | nil

Returns the endpoint configuration for the given operation.

Examples

iex> get_endpoint(:get_balances)
%{operation: :get_balances, path: "/api/v3/account", ...}

get_margin_borrow_loan_interest_history(params \\ %{})

@spec get_margin_borrow_loan_interest_history(map()) ::
  {:ok, term()} | {:error, term()}

Get Margin Borrow/Loan Interest History

get_margin_borrow_loan_interest_history(params, opts)

@spec get_margin_borrow_loan_interest_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_um_account_detail(params \\ %{})

@spec get_um_account_detail(map()) :: {:ok, term()} | {:error, term()}

Get UM Account Detail

get_um_account_detail(params, opts)

@spec get_um_account_detail(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_um_account_detail_v2(params \\ %{})

@spec get_um_account_detail_v2(map()) :: {:ok, term()} | {:error, term()}

Get UM Account Detail V2

get_um_account_detail_v2(params, opts)

@spec get_um_account_detail_v2(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_um_current_position_mode(params \\ %{})

@spec get_um_current_position_mode(map()) :: {:ok, term()} | {:error, term()}

Get UM Current Position Mode

get_um_current_position_mode(params, opts)

@spec get_um_current_position_mode(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_um_futures_bnb_burn_status(params \\ %{})

@spec get_um_futures_bnb_burn_status(map()) :: {:ok, term()} | {:error, term()}

Get UM Futures BNB Burn Status

get_um_futures_bnb_burn_status(params, opts)

@spec get_um_futures_bnb_burn_status(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_um_income_history(params \\ %{})

@spec get_um_income_history(map()) :: {:ok, term()} | {:error, term()}

Get UM Income History

get_um_income_history(params, opts)

@spec get_um_income_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_unified_account(params \\ %{})

@spec get_unified_account(map()) :: {:ok, map()} | {:error, term()}

Get unified account information across all product types.

Returns consolidated account data including UM, CM, and Margin positions with cross-collateralization details. This is the primary endpoint for understanding your portfolio margin account status.

Response Structure

The response includes:

  • uniMMR: Unified Maintenance Margin Ratio (critical for liquidation)
  • accountEquity: Total equity across all products
  • actualEquity: Equity after unrealized PnL
  • accountInitialMargin: Total initial margin required
  • accountMaintMargin: Total maintenance margin required
  • accountStatus: NORMAL, MARGIN_CALL, or LIQUIDATION
  • virtualMaxWithdrawAmount: Maximum withdrawable amount

Parameters

  • recvWindow (optional): Request validity window in milliseconds (max 60000)

Examples

# Get basic account information
{:ok, account} = PortfolioMargin.get_unified_account()

# With custom receive window
{:ok, account} = PortfolioMargin.get_unified_account(%{recvWindow: 5000})

Error Responses

  • {:error, {:not_activated, _}} - Portfolio margin not activated
  • {:error, {:unauthorized, _}} - API key lacks portfolio margin permission

get_unified_account(params, opts)

@spec get_unified_account(
  map(),
  keyword()
) :: {:ok, map()} | {:error, term()}

get_user_commission_rate_for_cm(params \\ %{})

@spec get_user_commission_rate_for_cm(map()) :: {:ok, term()} | {:error, term()}

Get User Commission Rate for CM

get_user_commission_rate_for_cm(params, opts)

@spec get_user_commission_rate_for_cm(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_user_commission_rate_for_um(params \\ %{})

@spec get_user_commission_rate_for_um(map()) :: {:ok, term()} | {:error, term()}

Get User Commission Rate for UM

get_user_commission_rate_for_um(params, opts)

@spec get_user_commission_rate_for_um(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

get_weight(operation)

@spec get_weight(atom()) :: integer()

Returns the rate limit weight for an operation.

margin_account_borrow(params \\ %{})

@spec margin_account_borrow(map()) :: {:ok, term()} | {:error, term()}

Margin Account Borrow

margin_account_borrow(params, opts)

@spec margin_account_borrow(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

margin_account_new_oco(params \\ %{})

@spec margin_account_new_oco(map()) :: {:ok, term()} | {:error, term()}

Margin Account New OCO

margin_account_new_oco(params, opts)

@spec margin_account_new_oco(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

margin_account_repay(params \\ %{})

@spec margin_account_repay(map()) :: {:ok, term()} | {:error, term()}

Margin Account Repay

margin_account_repay(params, opts)

@spec margin_account_repay(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

margin_account_repay_debt(params \\ %{})

@spec margin_account_repay_debt(map()) :: {:ok, term()} | {:error, term()}

Margin Account Repay Debt

margin_account_repay_debt(params, opts)

@spec margin_account_repay_debt(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

margin_account_trade_list(params \\ %{})

@spec margin_account_trade_list(map()) :: {:ok, term()} | {:error, term()}

Margin Account Trade List

margin_account_trade_list(params, opts)

@spec margin_account_trade_list(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

margin_max_borrow(params \\ %{})

@spec margin_max_borrow(map()) :: {:ok, term()} | {:error, term()}

Margin Max Borrow

margin_max_borrow(params, opts)

@spec margin_max_borrow(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

modify_cm_order(params \\ %{})

@spec modify_cm_order(map()) :: {:ok, term()} | {:error, term()}

Modify CM Order

modify_cm_order(params, opts)

@spec modify_cm_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

modify_um_order(params \\ %{})

@spec modify_um_order(map()) :: {:ok, term()} | {:error, term()}

Modify UM Order

modify_um_order(params, opts)

@spec modify_um_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

new_cm_conditional_order(params \\ %{})

@spec new_cm_conditional_order(map()) :: {:ok, term()} | {:error, term()}

New CM Conditional Order

new_cm_conditional_order(params, opts)

@spec new_cm_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

new_cm_order(params \\ %{})

@spec new_cm_order(map()) :: {:ok, term()} | {:error, term()}

New CM Order

new_cm_order(params, opts)

@spec new_cm_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

new_margin_order(params \\ %{})

@spec new_margin_order(map()) :: {:ok, term()} | {:error, term()}

New Margin Order

new_margin_order(params, opts)

@spec new_margin_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

new_um_conditional_order(params \\ %{})

@spec new_um_conditional_order(map()) :: {:ok, term()} | {:error, term()}

New UM Conditional Order

new_um_conditional_order(params, opts)

@spec new_um_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

new_um_order(params \\ %{})

@spec new_um_order(map()) :: {:ok, term()} | {:error, term()}

New UM Order

new_um_order(params, opts)

@spec new_um_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

place_unified_order(params)

@spec place_unified_order(map()) :: {:ok, map()} | {:error, term()}

Place a unified order that can span multiple product types.

This intelligently routes orders to the appropriate product endpoint while utilizing the cross-collateralization benefits of Portfolio Margin. The order will use available collateral from your entire portfolio.

Product Type Detection

The function automatically detects the product type from:

  1. Explicit product_type parameter ("UM", "CM", or "MARGIN")
  2. Symbol pattern analysis (see ProductDetector for patterns)

Parameters

Required:

  • symbol: Trading pair (e.g., "BTCUSDT", "BTCUSD_PERP", "ETHBTC")
  • side: "BUY" or "SELL"
  • type: Order type ("LIMIT", "MARKET", "STOP", etc.)
  • quantity: Order quantity as string

Optional:

  • product_type: Explicit product type ("UM", "CM", "MARGIN")
  • price: Required for LIMIT orders
  • stopPrice: For STOP orders
  • timeInForce: "GTC", "IOC", "FOK" (default: "GTC")
  • positionSide: "BOTH", "LONG", "SHORT" (futures only)
  • reduceOnly: true/false (futures only)
  • closePosition: true/false to close entire position (futures)

Examples

# USD-M Futures order (auto-detected from USDT suffix)
{:ok, order} = PortfolioMargin.place_unified_order(%{
  symbol: "BTCUSDT",
  side: "BUY",
  type: "LIMIT",
  quantity: "0.001",
  price: "40000"
})

# COIN-M Futures order (auto-detected from underscore)
{:ok, order} = PortfolioMargin.place_unified_order(%{
  symbol: "BTCUSD_PERP",
  side: "SELL",
  type: "MARKET",
  quantity: "100"  # contracts
})

# Margin order with explicit type
{:ok, order} = PortfolioMargin.place_unified_order(%{
  symbol: "ETHBTC",
  side: "BUY",
  type: "LIMIT",
  quantity: "0.1",
  price: "0.065",
  product_type: "MARGIN"
})

Error Responses

  • {:error, {:invalid_product_type, _}} - Unable to detect or invalid product type
  • {:error, {:insufficient_margin, _}} - Not enough collateral across portfolio
  • {:error, {:invalid_symbol, _}} - Symbol not valid for detected product type

place_unified_order(params, opts)

@spec place_unified_order(
  map(),
  keyword()
) :: {:ok, map()} | {:error, term()}

portfolio_margin_um_trading_quantitative_rules_indicators(params \\ %{})

@spec portfolio_margin_um_trading_quantitative_rules_indicators(map()) ::
  {:ok, term()} | {:error, term()}

Portfolio Margin UM Trading Quantitative Rules Indicators

portfolio_margin_um_trading_quantitative_rules_indicators(params, opts)

@spec portfolio_margin_um_trading_quantitative_rules_indicators(
  map(),
  keyword() | map()
) ::
  {:ok, term()} | {:error, term()}

query_all_cm_conditional_orders(params \\ %{})

@spec query_all_cm_conditional_orders(map()) :: {:ok, term()} | {:error, term()}

Query All CM Conditional Orders

query_all_cm_conditional_orders(params, opts)

@spec query_all_cm_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_cm_orders(params \\ %{})

@spec query_all_cm_orders(map()) :: {:ok, term()} | {:error, term()}

Query All CM Orders

query_all_cm_orders(params, opts)

@spec query_all_cm_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_current_cm_open_conditional_orders(params \\ %{})

@spec query_all_current_cm_open_conditional_orders(map()) ::
  {:ok, term()} | {:error, term()}

Query All Current CM Open Conditional Orders

query_all_current_cm_open_conditional_orders(params, opts)

@spec query_all_current_cm_open_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_current_cm_open_orders(params \\ %{})

@spec query_all_current_cm_open_orders(map()) :: {:ok, term()} | {:error, term()}

Query All Current CM Open Orders

query_all_current_cm_open_orders(params, opts)

@spec query_all_current_cm_open_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_current_um_open_conditional_orders(params \\ %{})

@spec query_all_current_um_open_conditional_orders(map()) ::
  {:ok, term()} | {:error, term()}

Query All Current UM Open Conditional Orders

query_all_current_um_open_conditional_orders(params, opts)

@spec query_all_current_um_open_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_current_um_open_orders(params \\ %{})

@spec query_all_current_um_open_orders(map()) :: {:ok, term()} | {:error, term()}

Query All Current UM Open Orders

query_all_current_um_open_orders(params, opts)

@spec query_all_current_um_open_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_margin_account_orders(params \\ %{})

@spec query_all_margin_account_orders(map()) :: {:ok, term()} | {:error, term()}

Query All Margin Account Orders

query_all_margin_account_orders(params, opts)

@spec query_all_margin_account_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_um_conditional_orders(params \\ %{})

@spec query_all_um_conditional_orders(map()) :: {:ok, term()} | {:error, term()}

Query All UM Conditional Orders

query_all_um_conditional_orders(params, opts)

@spec query_all_um_conditional_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_all_um_orders(params \\ %{})

@spec query_all_um_orders(map()) :: {:ok, term()} | {:error, term()}

Query All UM Orders

query_all_um_orders(params, opts)

@spec query_all_um_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_cm_conditional_order_history(params \\ %{})

@spec query_cm_conditional_order_history(map()) :: {:ok, term()} | {:error, term()}

Query CM Conditional Order History

query_cm_conditional_order_history(params, opts)

@spec query_cm_conditional_order_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_cm_modify_order_history(params \\ %{})

@spec query_cm_modify_order_history(map()) :: {:ok, term()} | {:error, term()}

Query CM Modify Order History

query_cm_modify_order_history(params, opts)

@spec query_cm_modify_order_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_cm_order(params \\ %{})

@spec query_cm_order(map()) :: {:ok, term()} | {:error, term()}

Query CM Order

query_cm_order(params, opts)

@spec query_cm_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

query_cm_position_information(params \\ %{})

@spec query_cm_position_information(map()) :: {:ok, term()} | {:error, term()}

Query CM Position Information

query_cm_position_information(params, opts)

@spec query_cm_position_information(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_current_cm_open_conditional_order(params \\ %{})

@spec query_current_cm_open_conditional_order(map()) ::
  {:ok, term()} | {:error, term()}

Query Current CM Open Conditional Order

query_current_cm_open_conditional_order(params, opts)

@spec query_current_cm_open_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_current_cm_open_order(params \\ %{})

@spec query_current_cm_open_order(map()) :: {:ok, term()} | {:error, term()}

Query Current CM Open Order

query_current_cm_open_order(params, opts)

@spec query_current_cm_open_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_current_margin_open_order(params \\ %{})

@spec query_current_margin_open_order(map()) :: {:ok, term()} | {:error, term()}

Query Current Margin Open Order

query_current_margin_open_order(params, opts)

@spec query_current_margin_open_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_current_um_open_conditional_order(params \\ %{})

@spec query_current_um_open_conditional_order(map()) ::
  {:ok, term()} | {:error, term()}

Query Current UM Open Conditional Order

query_current_um_open_conditional_order(params, opts)

@spec query_current_um_open_conditional_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_current_um_open_order(params \\ %{})

@spec query_current_um_open_order(map()) :: {:ok, term()} | {:error, term()}

Query Current UM Open Order

query_current_um_open_order(params, opts)

@spec query_current_um_open_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_account_order(params \\ %{})

@spec query_margin_account_order(map()) :: {:ok, term()} | {:error, term()}

Query Margin Account Order

query_margin_account_order(params, opts)

@spec query_margin_account_order(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_account_s_all_oco(params \\ %{})

@spec query_margin_account_s_all_oco(map()) :: {:ok, term()} | {:error, term()}

Query Margin Account's all OCO

query_margin_account_s_all_oco(params, opts)

@spec query_margin_account_s_all_oco(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_account_s_oco(params \\ %{})

@spec query_margin_account_s_oco(map()) :: {:ok, term()} | {:error, term()}

Query Margin Account's OCO

query_margin_account_s_oco(params, opts)

@spec query_margin_account_s_oco(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_account_s_open_oco(params \\ %{})

@spec query_margin_account_s_open_oco(map()) :: {:ok, term()} | {:error, term()}

Query Margin Account's Open OCO

query_margin_account_s_open_oco(params, opts)

@spec query_margin_account_s_open_oco(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_loan_record(params \\ %{})

@spec query_margin_loan_record(map()) :: {:ok, term()} | {:error, term()}

Query Margin Loan Record

query_margin_loan_record(params, opts)

@spec query_margin_loan_record(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_max_withdraw(params \\ %{})

@spec query_margin_max_withdraw(map()) :: {:ok, term()} | {:error, term()}

Query Margin Max Withdraw

query_margin_max_withdraw(params, opts)

@spec query_margin_max_withdraw(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_margin_repay_record(params \\ %{})

@spec query_margin_repay_record(map()) :: {:ok, term()} | {:error, term()}

Query Margin repay Record

query_margin_repay_record(params, opts)

@spec query_margin_repay_record(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_portfolio_margin_negative_balance_interest_history(params \\ %{})

@spec query_portfolio_margin_negative_balance_interest_history(map()) ::
  {:ok, term()} | {:error, term()}

Query Portfolio Margin Negative Balance Interest History

query_portfolio_margin_negative_balance_interest_history(params, opts)

@spec query_portfolio_margin_negative_balance_interest_history(
  map(),
  keyword() | map()
) ::
  {:ok, term()} | {:error, term()}

query_um_conditional_order_history(params \\ %{})

@spec query_um_conditional_order_history(map()) :: {:ok, term()} | {:error, term()}

Query UM Conditional Order History

query_um_conditional_order_history(params, opts)

@spec query_um_conditional_order_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_um_modify_order_history(params \\ %{})

@spec query_um_modify_order_history(map()) :: {:ok, term()} | {:error, term()}

Query UM Modify Order History

query_um_modify_order_history(params, opts)

@spec query_um_modify_order_history(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_um_order(params \\ %{})

@spec query_um_order(map()) :: {:ok, term()} | {:error, term()}

Query UM Order

query_um_order(params, opts)

@spec query_um_order(map(), keyword() | map()) :: {:ok, term()} | {:error, term()}

query_um_position_information(params \\ %{})

@spec query_um_position_information(map()) :: {:ok, term()} | {:error, term()}

Query UM Position Information

query_um_position_information(params, opts)

@spec query_um_position_information(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_user_negative_balance_auto_exchange_record(params \\ %{})

@spec query_user_negative_balance_auto_exchange_record(map()) ::
  {:ok, term()} | {:error, term()}

Query User Negative Balance Auto Exchange Record

query_user_negative_balance_auto_exchange_record(params, opts)

@spec query_user_negative_balance_auto_exchange_record(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_user_rate_limit(params \\ %{})

@spec query_user_rate_limit(map()) :: {:ok, term()} | {:error, term()}

Query User Rate Limit

query_user_rate_limit(params, opts)

@spec query_user_rate_limit(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_user_s_cm_force_orders(params \\ %{})

@spec query_user_s_cm_force_orders(map()) :: {:ok, term()} | {:error, term()}

Query User's CM Force Orders

query_user_s_cm_force_orders(params, opts)

@spec query_user_s_cm_force_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_user_s_margin_force_orders(params \\ %{})

@spec query_user_s_margin_force_orders(map()) :: {:ok, term()} | {:error, term()}

Query User's Margin Force Orders

query_user_s_margin_force_orders(params, opts)

@spec query_user_s_margin_force_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

query_user_s_um_force_orders(params \\ %{})

@spec query_user_s_um_force_orders(map()) :: {:ok, term()} | {:error, term()}

Query User's UM Force Orders

query_user_s_um_force_orders(params, opts)

@spec query_user_s_um_force_orders(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

repay_futures_negative_balance(params \\ %{})

@spec repay_futures_negative_balance(map()) :: {:ok, term()} | {:error, term()}

Repay futures Negative Balance

repay_futures_negative_balance(params, opts)

@spec repay_futures_negative_balance(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

toggle_bnb_burn_on_um_futures_trade(params \\ %{})

@spec toggle_bnb_burn_on_um_futures_trade(map()) :: {:ok, term()} | {:error, term()}

Toggle BNB Burn On UM Futures Trade

toggle_bnb_burn_on_um_futures_trade(params, opts)

@spec toggle_bnb_burn_on_um_futures_trade(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

um_account_trade_list(params \\ %{})

@spec um_account_trade_list(map()) :: {:ok, term()} | {:error, term()}

UM Account Trade List

um_account_trade_list(params, opts)

@spec um_account_trade_list(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

um_futures_account_configuration(params \\ %{})

@spec um_futures_account_configuration(map()) :: {:ok, term()} | {:error, term()}

UM Futures Account Configuration

um_futures_account_configuration(params, opts)

@spec um_futures_account_configuration(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

um_futures_symbol_configuration(params \\ %{})

@spec um_futures_symbol_configuration(map()) :: {:ok, term()} | {:error, term()}

UM Futures Symbol Configuration

um_futures_symbol_configuration(params, opts)

@spec um_futures_symbol_configuration(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

um_notional_and_leverage_brackets(params \\ %{})

@spec um_notional_and_leverage_brackets(map()) :: {:ok, term()} | {:error, term()}

UM Notional and Leverage Brackets

um_notional_and_leverage_brackets(params, opts)

@spec um_notional_and_leverage_brackets(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}

um_position_adl_quantile_estimation(params \\ %{})

@spec um_position_adl_quantile_estimation(map()) :: {:ok, term()} | {:error, term()}

UM Position ADL Quantile Estimation

um_position_adl_quantile_estimation(params, opts)

@spec um_position_adl_quantile_estimation(map(), keyword() | map()) ::
  {:ok, term()} | {:error, term()}