Current section
Files
Jump to
Current section
Files
lib/bingex/swap/model/position_info.ex
defmodule Bingex.Swap.Model.PositionInfo do
@moduledoc """
Represents individual position information.
"""
import Bingex.{Helpers, Convertors}
defstruct [
:position_id,
:symbol,
:position_side,
:isolated?,
:leverage,
:create_time,
:update_time,
:average_price,
:mark_price,
:liquidation_price,
:position_quantity,
:available_quantity,
:margin,
:initial_margin,
:position_value,
:pnl_ratio,
:realised_profit,
:unrealised_profit,
:risk_rate,
:only_one_position?
]
@type t() :: %__MODULE__{
position_id: binary(),
symbol: binary(),
position_side: binary(),
isolated?: boolean(),
leverage: pos_integer(),
create_time: pos_integer(),
update_time: pos_integer(),
average_price: float(),
mark_price: float(),
liquidation_price: float(),
position_quantity: float(),
available_quantity: float(),
margin: float(),
initial_margin: float(),
position_value: float(),
pnl_ratio: float(),
realised_profit: float(),
unrealised_profit: float(),
risk_rate: float(),
only_one_position?: boolean()
}
@spec decode(map()) :: {:ok, t()} | :error
def decode(%{} = data) do
struct = %__MODULE__{
position_id: get_and_transform(data, "positionId", &to_binary/1),
symbol: get_and_transform(data, "symbol", &to_non_empty_binary/1),
position_side: get_and_transform(data, "positionSide", &to_binary/1),
isolated?: get_and_transform(data, "isolated", &to_boolean/1),
leverage: get_and_transform(data, "leverage", &to_integer/1),
create_time: get_and_transform(data, "createTime", &to_integer/1),
update_time: get_and_transform(data, "updateTime", &to_integer/1),
average_price: get_and_transform(data, "avgPrice", &to_float/1),
mark_price: get_and_transform(data, "markPrice", &to_float/1),
liquidation_price: get_and_transform(data, "liquidationPrice", &to_float/1),
position_quantity: get_and_transform(data, "positionAmt", &to_float/1),
available_quantity: get_and_transform(data, "availableAmt", &to_float/1),
margin: get_and_transform(data, "margin", &to_float/1),
initial_margin: get_and_transform(data, "initialMargin", &to_float/1),
position_value: get_and_transform(data, "positionValue", &to_float/1),
pnl_ratio: get_and_transform(data, "pnlRatio", &to_float/1),
realised_profit: get_and_transform(data, "realisedProfit", &to_float/1),
unrealised_profit: get_and_transform(data, "unrealizedProfit", &to_float/1),
risk_rate: get_and_transform(data, "riskRate", &to_float/1),
only_one_position?: get_and_transform(data, "onlyOnePosition", &to_boolean/1)
}
{:ok, struct}
end
def decode(_), do: :error
end