Packages
tai
0.0.13
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/create.ex
defmodule Tai.Trading.Orders.Create do
alias Tai.Trading.{
OrderStore,
OrderResponses,
Order,
Orders,
BuildOrderFromSubmission
}
@type order :: Order.t()
@type submission :: BuildOrderFromSubmission.submission()
@spec create(submission) :: {:ok, order}
def create(submission) do
{:ok, order} = OrderStore.add(submission)
notify_initial_updated_order(order)
Task.async(fn ->
if Tai.Settings.send_orders?() do
order
|> send
|> parse_response(order)
|> notify_updated_order()
else
order.client_id
|> skip!
|> notify_updated_order()
end
end)
{:ok, order}
end
defp notify_initial_updated_order(order) do
notify_updated_order({:ok, {nil, order}})
end
defp notify_updated_order({:ok, {previous_order, order}}) do
Orders.updated!(previous_order, order)
order
end
defp send(order), do: Tai.Venue.create_order(order)
defp parse_response(
{:ok, %OrderResponses.Create{status: :filled} = response},
order
) do
OrderStore.fill(
order.client_id,
response.id,
response.venue_created_at,
response.avg_price,
response.cumulative_qty
)
end
defp parse_response(
{:ok, %OrderResponses.Create{status: :expired} = response},
order
) do
OrderStore.expire(
order.client_id,
response.id,
response.venue_created_at,
response.avg_price,
response.cumulative_qty,
response.leaves_qty
)
end
defp parse_response(
{:ok, %OrderResponses.Create{status: :open} = response},
order
) do
OrderStore.open(
order.client_id,
response.id,
response.venue_created_at,
response.avg_price,
response.cumulative_qty,
response.leaves_qty
)
end
defp parse_response({:error, reason}, order) do
OrderStore.create_error(order.client_id, reason)
end
defp skip!(client_id), do: OrderStore.skip(client_id)
end