Packages
tai
0.0.21
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/advisor_groups.ex
defmodule Tai.Commands.AdvisorGroups do
import Tai.Commands.Table, only: [render!: 2]
@type config :: Tai.Config.t()
@type group_id :: Tai.AdvisorGroup.id()
@header [
"Group ID",
"Running",
"Unstarted",
"Total"
]
@spec advisor_groups() :: no_return
@spec advisor_groups(config) :: no_return
def advisor_groups(config \\ Tai.Config.parse()) do
config
|> Tai.Advisors.specs([])
|> agg_status_by_group
|> format_rows
|> render!(@header)
end
@spec start(group_id, config) :: no_return
def start(group_id, config \\ Tai.Config.parse()) do
{:ok, {new, old}} =
config
|> Tai.Advisors.specs(group_id: group_id)
|> Tai.Advisors.start()
IO.puts("Started advisors: #{new} new, #{old} already running")
IEx.dont_display_result()
end
@spec stop(group_id, config) :: no_return
def stop(group_id, config \\ Tai.Config.parse()) do
{:ok, {new, old}} =
config
|> Tai.Advisors.specs(group_id: group_id)
|> Tai.Advisors.stop()
IO.puts("Stopped advisors: #{new} new, #{old} already stopped")
IEx.dont_display_result()
end
defp agg_status_by_group(specs) do
specs
|> Tai.Advisors.info()
|> Enum.map(fn {{_, opts}, pid} -> {Keyword.fetch!(opts, :group_id), pid} end)
|> Enum.reduce(
%{},
fn {group_id, pid}, acc ->
{_, _} = counts = Map.get(acc, group_id, {0, 0})
counts = counts |> increment(pid)
Map.put(acc, group_id, counts)
end
)
end
defp increment({running, unstarted}, pid) when is_pid(pid), do: {running + 1, unstarted}
defp increment({running, unstarted}, _), do: {running, unstarted + 1}
defp format_rows(status_by_group) do
status_by_group
|> Enum.map(fn {group_id, {running, unstarted}} ->
[group_id, running, unstarted, running + unstarted]
end)
|> Enum.sort(fn [group_a, _, _, _], [group_b, _, _, _] ->
group_a > group_b
end)
end
end