Packages
tai
0.0.19
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/trading/orders.ex
defmodule Tai.Trading.Orders do
alias Tai.Trading.{Order, Orders, OrderSubmissions}
alias Tai.Events
@type submission :: OrderSubmissions.Factory.submission()
@type order :: Order.t()
@type status :: Order.status()
@type status_was :: status
@type status_required :: status | [status]
@type amend_attrs :: Orders.Amend.attrs()
@type amend_error_reason :: {:invalid_status, status_was, status_required}
@type cancel_error_reason :: {:invalid_status, status_was, status_required}
@spec create(submission) :: {:ok, order}
defdelegate create(submission), to: Orders.Create
@spec amend(order, amend_attrs) :: {:ok, updated :: order} | {:error, amend_error_reason}
defdelegate amend(order, attrs), to: Orders.Amend
@spec cancel(order) :: {:ok, updated :: order} | {:error, cancel_error_reason}
defdelegate cancel(order), to: Orders.Cancel
@spec broadcast(order) :: :ok
def broadcast(%Order{} = order) do
%Events.OrderUpdated{
client_id: order.client_id,
venue_id: order.venue_id,
account_id: order.account_id,
venue_order_id: order.venue_order_id,
product_symbol: order.product_symbol,
product_type: order.product_type,
side: order.side,
type: order.type,
time_in_force: order.time_in_force,
status: order.status,
price: order.price,
avg_price: order.avg_price,
qty: order.qty,
leaves_qty: order.leaves_qty,
cumulative_qty: order.cumulative_qty,
error_reason: order.error_reason,
enqueued_at: order.enqueued_at,
last_received_at: order.last_received_at,
last_venue_timestamp: order.last_venue_timestamp,
updated_at: order.updated_at,
close: order.close
}
|> Events.info()
end
@spec updated!(order | nil, order) :: :ok
def updated!(previous, %Order{} = updated) do
broadcast(updated)
if updated.order_updated_callback do
updated.order_updated_callback.(previous, updated)
else
:ok
end
end
end