Packages
tai
0.0.8
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/commands/markets.ex
defmodule Tai.Commands.Markets do
@moduledoc """
Display the bid/ask for each symbol on all order book feeds
"""
alias TableRex.Table
@spec markets :: no_return
def markets do
Tai.Exchanges.ProductStore.all()
|> fetch_inside_quotes
|> format_rows
|> sort_rows
|> render!
end
defp fetch_inside_quotes(products) when is_list(products) do
products
|> Enum.map(fn p -> {p.exchange_id, p.symbol} end)
|> Enum.map(fn {venue_id, symbol} ->
{:ok, inside_quote} = Tai.Markets.OrderBook.inside_quote(venue_id, symbol)
{venue_id, symbol, inside_quote}
end)
end
defp format_rows(products_with_inside_quote) do
products_with_inside_quote
|> Enum.map(fn {venue_id, symbol, %Tai.Markets.Quote{bid: bid, ask: ask}} ->
[
venue_id,
symbol,
{bid, :price},
{ask, :price},
{bid, :size},
{ask, :size},
{bid, :processed_at},
{bid, :server_changed_at},
{ask, :processed_at},
{ask, :server_changed_at}
]
|> format_row
end)
end
defp sort_rows(rows), do: rows |> Enum.sort(&(&1 < &2))
defp format_row(row) when is_list(row), do: row |> Enum.map(&format_col/1)
defp format_col({nil, _}), do: format_col(nil)
defp format_col({receiver, message}), do: receiver |> get_in([message]) |> format_col
defp format_col(num) when is_number(num), do: Decimal.new(num)
defp format_col(%DateTime{} = date), do: Timex.from_now(date)
defp format_col(nil), do: "~"
defp format_col(pass_through), do: pass_through
@header [
"Venue",
"Product",
"Bid Price",
"Ask Price",
"Bid Size",
"Ask Size",
"Bid Processed At",
"Bid Server Changed At",
"Ask Processed At",
"Ask Server Changed At"
]
@spec render!(list) :: no_return
defp render!(rows)
defp render!([]) do
col_count = @header |> Enum.count()
[List.duplicate("-", col_count)]
|> render!
end
defp render!(rows) do
rows
|> Table.new(@header)
|> Table.put_column_meta(:all, align: :right)
|> Table.render!()
|> IO.puts()
end
end