tai v0.0.14 Tai.Trading.OrderStore
ETS backed store for the local state of orders
Link to this section Summary
Functions
Build an enqueued order from the submission and insert it into the ETS table
Return a list of all orders currently stored in the ETS table
Change the order status to open after an amend attempt
Change the order status to amend_error after an amend attempt
Change the order status to canceled after a cancel attempt
Change the order status to cancel_error after a cancel attempt
Returns a specification to start this module under a supervisor
Return the count of all orders currently stored in the ETS table
Change the order status to create_error when it failed on the venue
Change the order status to expired
Update the cumulative_qty & price for a fully filled order
Return the order in the ETS table that matches the given client_id
Invoked when the server is started. start_link/3
or start/3
will
block until it returns
Change the order status to open after it was enqueued
Change the order status to canceled from an external passive source
Update the cumulative_qty & price for a fully filled passive order
Update the cumulative_qty & price for a partially filled passive order
Change the order status to pending_amend
Change the order status to pending_cancel
Change the ordertatus to skip when orders aren't sent to the venue
Link to this section Types
client_id()
client_id() :: String.t()
client_id() :: String.t()
order()
order() :: Tai.Trading.Order.t()
order() :: Tai.Trading.Order.t()
passive_cancel_required()
passive_cancel_required() ::
:open
| :expired
| :filled
| :pending_cancel
| :pending_amend
| :canceled
| :amend
passive_cancel_required() :: :open | :expired | :filled | :pending_cancel | :pending_amend | :canceled | :amend
passive_fills_required()
passive_fills_required() ::
:open | :pending_amend | :pending_cancel | :amend_error | :cancel_error
passive_fills_required() :: :open | :pending_amend | :pending_cancel | :amend_error | :cancel_error
submission()
submission() :: Tai.Trading.BuildOrderFromSubmission.submission()
submission() :: Tai.Trading.BuildOrderFromSubmission.submission()
venue_order_id()
venue_order_id() :: Tai.Trading.Order.venue_order_id()
venue_order_id() :: Tai.Trading.Order.venue_order_id()
Link to this section Functions
add(submission)
add(submission()) :: {:ok, order()} | no_return()
add(submission()) :: {:ok, order()} | no_return()
Build an enqueued order from the submission and insert it into the ETS table
all()
all() :: [] | [order()]
all() :: [] | [order()]
Return a list of all orders currently stored in the ETS table
amend(client_id, price, leaves_qty, last_received_at, last_venue_timestamp)
amend(client_id(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found
| {:invalid_status, current :: atom(), required :: :pending_amend}}
amend(client_id(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :pending_amend}}
Change the order status to open after an amend attempt
amend_error(client_id, reason, last_received_at)
Change the order status to amend_error after an amend attempt
cancel(client_id, last_venue_timestamp)
cancel(client_id(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found
| {:invalid_status, current :: atom(), required :: :pending_cancel}}
cancel(client_id(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :pending_cancel}}
Change the order status to canceled after a cancel attempt
cancel_error(client_id, reason, last_received_at)
Change the order status to cancel_error after a cancel attempt
child_spec(init_arg)
Returns a specification to start this module under a supervisor.
See Supervisor
.
count()
count() :: non_neg_integer()
count() :: non_neg_integer()
Return the count of all orders currently stored in the ETS table
create_error(client_id, error_reason, last_received_at)
Change the order status to create_error when it failed on the venue
expire(client_id, venue_order_id, avg_price, cumulative_qty, leaves_qty, last_received_at, last_venue_timestamp)
expire(
client_id(),
venue_order_id(),
Decimal.t(),
Decimal.t(),
Decimal.t(),
DateTime.t(),
DateTime.t()
) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
expire( client_id(), venue_order_id(), Decimal.t(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t() ) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
Change the order status to expired
fill(client_id, venue_order_id, avg_price, cumulative_qty, last_received_at, last_venue_timestamp)
fill(
client_id(),
venue_order_id(),
Decimal.t(),
Decimal.t(),
DateTime.t(),
DateTime.t()
) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
fill( client_id(), venue_order_id(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t() ) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
Update the cumulative_qty & price for a fully filled order
find_by_client_id(client_id)
Return the order in the ETS table that matches the given client_id
init(state)
Invoked when the server is started. start_link/3
or start/3
will
block until it returns.
init_arg
is the argument term (second argument) passed to start_link/3
.
Returning {:ok, state}
will cause start_link/3
to return
{:ok, pid}
and the process to enter its loop.
Returning {:ok, state, timeout}
is similar to {:ok, state}
except handle_info(:timeout, state)
will be called after timeout
milliseconds if no messages are received within the timeout.
Returning {:ok, state, :hibernate}
is similar to {:ok, state}
except the process is hibernated before entering the loop. See
c:handle_call/3
for more information on hibernation.
Returning {:ok, state, {:continue, continue}}
is similar to
{:ok, state}
except that immediately after entering the loop
the c:handle_continue/2
callback will be invoked with the value
continue
as first argument.
Returning :ignore
will cause start_link/3
to return :ignore
and
the process will exit normally without entering the loop or calling
c:terminate/2
. If used when part of a supervision tree the parent
supervisor will not fail to start nor immediately try to restart the
GenServer
. The remainder of the supervision tree will be started
and so the GenServer
should not be required by other processes.
It can be started later with Supervisor.restart_child/2
as the child
specification is saved in the parent supervisor. The main use cases for
this are:
- The
GenServer
is disabled by configuration but might be enabled later. - An error occurred and it will be handled by a different mechanism than the
Supervisor
. Likely this approach involves callingSupervisor.restart_child/2
after a delay to attempt a restart.
Returning {:stop, reason}
will cause start_link/3
to return
{:error, reason}
and the process to exit with reason reason
without
entering the loop or calling c:terminate/2
.
Callback implementation for GenServer.init/1
.
open(client_id, venue_order_id, avg_price, cumulative_qty, leaves_qty, last_received_at, last_venue_timestamp)
open(
client_id(),
venue_order_id(),
Decimal.t(),
Decimal.t(),
Decimal.t(),
DateTime.t(),
DateTime.t()
) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
open( client_id(), venue_order_id(), Decimal.t(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t() ) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :enqueued}}
Change the order status to open after it was enqueued
passive_cancel(client_id, last_received_at, last_venue_timestamp)
passive_cancel(client_id(), DateTime.t(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found
| {:invalid_status, current :: atom(), passive_cancel_required()}}
passive_cancel(client_id(), DateTime.t(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), passive_cancel_required()}}
Change the order status to canceled from an external passive source
passive_fill(client_id, cumulative_qty, last_received_at, last_venue_timestamp)
passive_fill(client_id(), Decimal.t(), DateTime.t(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), passive_fills_required()}}
passive_fill(client_id(), Decimal.t(), DateTime.t(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), passive_fills_required()}}
Update the cumulative_qty & price for a fully filled passive order
passive_partial_fill(client_id, avg_price, cumulative_qty, leaves_qty, last_received_at, last_venue_timestamp)
passive_partial_fill(
client_id(),
Decimal.t(),
Decimal.t(),
Decimal.t(),
DateTime.t(),
DateTime.t()
) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), passive_fills_required()}}
passive_partial_fill( client_id(), Decimal.t(), Decimal.t(), Decimal.t(), DateTime.t(), DateTime.t() ) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), passive_fills_required()}}
Update the cumulative_qty & price for a partially filled passive order
pend_amend(client_id, updated_at)
pend_amend(client_id(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found
| {:invalid_status, current :: atom(), required :: :open | :amend_error}}
pend_amend(client_id(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :open | :amend_error}}
Change the order status to pending_amend
pend_cancel(client_id, updated_at)
pend_cancel(client_id(), DateTime.t()) ::
{:ok, {old :: order(), updated :: order()}}
| {:error,
:not_found | {:invalid_status, current :: atom(), required :: :open}}
pend_cancel(client_id(), DateTime.t()) :: {:ok, {old :: order(), updated :: order()}} | {:error, :not_found | {:invalid_status, current :: atom(), required :: :open}}
Change the order status to pending_cancel
skip(client_id)
Change the ordertatus to skip when orders aren't sent to the venue