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/trading/notify_order_update.ex
defmodule Tai.Trading.NotifyOrderUpdate do
alias Tai.Events
alias Tai.Trading.Order
@type order :: Order.t()
@spec notify!(order | nil, order) :: :ok | {:error, :noproc}
def notify!(previous, %Order{} = updated) do
:ok = broadcast(updated)
previous
|> callback(updated)
|> case do
{:error, :noproc} = error -> error
_ -> :ok
end
end
defp broadcast(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,
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
defp callback(_, %Order{order_updated_callback: nil}), do: :ok
defp callback(
previous,
%Order{order_updated_callback: {dest, data}} = updated
)
when is_atom(dest) or is_pid(dest) do
dest |> send_msg({:order_updated, previous, updated, data})
end
defp callback(
previous,
%Order{order_updated_callback: dest} = updated
)
when is_atom(dest) or is_pid(dest) do
dest |> send_msg({:order_updated, previous, updated})
end
defp callback(
previous,
%Order{order_updated_callback: callback} = updated
)
when is_function(callback) do
callback.(previous, updated)
end
defp send_msg(dest, msg) do
try do
send(dest, msg)
rescue
_e in ArgumentError -> {:error, :noproc}
end
end
end