Packages
tai
0.0.39
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/venue.ex
defmodule Tai.Venue do
alias Tai.Venues.Adapter
alias Tai.Trading.{Order, OrderResponses}
@type adapter :: Adapter.t()
@type account_id :: Adapter.account_id()
@type product :: Tai.Venues.Product.t()
@type asset_balance :: Tai.Venues.AssetBalance.t()
@type position :: Tai.Trading.Position.t()
@type order :: Order.t()
@type shared_error_reason ::
:timeout
| :connect_timeout
| :overloaded
| :rate_limited
| {:credentials, reason :: term}
| {:nonce_not_increasing, String.t()}
@spec products(adapter) :: {:ok, [product]}
def products(%Adapter{adapter: adapter, id: venue_id}), do: adapter.products(venue_id)
@spec asset_balances(adapter, account_id) :: {:ok, [asset_balance]}
def asset_balances(
%Adapter{adapter: adapter, id: venue_id, accounts: accounts},
account_id
) do
{:ok, credentials} = Map.fetch(accounts, account_id)
adapter.asset_balances(venue_id, account_id, credentials)
end
@spec positions(adapter, account_id) ::
{:ok, [position]} | {:error, :not_supported | shared_error_reason}
def positions(%Adapter{adapter: adapter, id: venue_id, accounts: accounts}, account_id) do
{:ok, credentials} = Map.fetch(accounts, account_id)
adapter.positions(venue_id, account_id, credentials)
end
@spec maker_taker_fees(adapter :: adapter, account_id) ::
{:ok, {maker :: Decimal.t(), taker :: Decimal.t()}}
def maker_taker_fees(
%Adapter{adapter: adapter, id: venue_id, accounts: accounts},
account_id
) do
{:ok, credentials} = Map.fetch(accounts, account_id)
adapter.maker_taker_fees(venue_id, account_id, credentials)
end
@type create_response :: OrderResponses.Create.t() | OrderResponses.CreateAccepted.t()
@type create_order_error_reason ::
:not_implemented
| {:insufficient_balance, reason :: term}
| shared_error_reason
@spec create_order(order) :: {:ok, create_response} | {:error, create_order_error_reason}
def create_order(%Order{} = order, adapters \\ Tai.Venues.Config.parse_adapters()) do
{venue_adapter, credentials} = find_venue_adapter_and_credentials(order, adapters)
venue_adapter.adapter.create_order(order, credentials)
end
@type amend_attrs :: Tai.Trading.Orders.Amend.attrs()
@type amend_response :: OrderResponses.Amend.t()
@type amend_order_error_reason ::
:not_implemented
| shared_error_reason
@spec amend_order(order, amend_attrs) ::
{:ok, amend_response} | {:error, amend_order_error_reason}
def amend_order(%Order{} = order, attrs, adapters \\ Tai.Venues.Config.parse_adapters()) do
{venue_adapter, credentials} = find_venue_adapter_and_credentials(order, adapters)
venue_adapter.adapter.amend_order(order, attrs, credentials)
end
@type cancel_response :: OrderResponses.Cancel.t() | OrderResponses.CancelAccepted.t()
@type cancel_order_error_reason ::
:not_implemented
| :not_found
| shared_error_reason
@spec cancel_order(order) :: {:ok, cancel_response} | {:error, cancel_order_error_reason}
def cancel_order(%Order{} = order, adapters \\ Tai.Venues.Config.parse_adapters()) do
{venue_adapter, credentials} = find_venue_adapter_and_credentials(order, adapters)
venue_adapter.adapter.cancel_order(order, credentials)
end
defp find_venue_adapter_and_credentials(order, adapters) do
venue_adapter = adapters |> Map.fetch!(order.venue_id)
credentials = Map.fetch!(venue_adapter.accounts, order.account_id)
{venue_adapter, credentials}
end
end