Packages
tai
0.0.3
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 Tai.Exchanges
alias Tai.Markets.{OrderBook, Quote}
alias TableRex.Table
@spec markets :: no_return
def markets do
Exchanges.Config.order_book_feed_ids()
|> group_rows
|> fetch_rows
|> format_rows
|> render!
end
defp group_rows(feed_ids) do
feed_ids
|> Enum.reduce(
[],
fn feed_id, acc ->
feed_id
|> Exchanges.Config.order_book_feed_symbols()
|> Enum.reduce(
acc,
fn symbol, acc -> [{feed_id, symbol} | acc] end
)
end
)
|> Enum.reverse()
end
defp fetch_rows(groups) when is_list(groups) do
groups
|> Enum.map(fn {feed_id, symbol} ->
{:ok, inside_quote} = OrderBook.inside_quote(feed_id, symbol)
{feed_id, symbol, inside_quote}
end)
end
defp format_rows(groups_with_quotes) when is_list(groups_with_quotes) do
groups_with_quotes
|> Enum.map(fn {feed_id, symbol, %Quote{bid: bid, ask: ask}} ->
[
feed_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
@spec render!(list) :: no_return
defp render!(rows) do
header = [
"Feed",
"Symbol",
"Bid Price",
"Ask Price",
"Bid Size",
"Ask Size",
"Bid Processed At",
"Bid Server Changed At",
"Ask Processed At",
"Ask Server Changed At"
]
rows
|> Table.new(header)
|> Table.put_column_meta(:all, align: :right)
|> Table.render!()
|> IO.puts()
end
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
end