Packages
tai
0.0.19
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/advisors.ex
defmodule Tai.Advisors do
@type config :: Tai.Config.t()
@type product :: Tai.Venues.Product.t()
@type advisor_spec :: Tai.Advisor.spec()
@type provider :: Tai.AdvisorGroups.RichConfig.provider()
@spec specs(config, list, provider) :: [advisor_spec]
def specs(config, filters, provider \\ Tai.AdvisorGroups.RichConfigProvider) do
advisor_id_filter = filters |> Keyword.get(:advisor_id)
{:ok, groups} = config |> Tai.AdvisorGroups.Config.parse_groups(provider)
groups
|> Enum.map(&Tai.AdvisorGroups.specs(&1, filters))
|> Enum.flat_map(& &1)
|> Enum.filter(fn {_, args} ->
spec_advisor_id = args |> Keyword.fetch!(:advisor_id)
spec_advisor_id == advisor_id_filter || advisor_id_filter == nil
end)
end
@spec info([advisor_spec]) :: [{advisor_spec, pid}]
def info(specs) do
specs
|> Enum.map(fn {_, opts} = spec ->
group_id = Keyword.fetch!(opts, :group_id)
advisor_id = Keyword.fetch!(opts, :advisor_id)
name = Tai.Advisor.to_name(group_id, advisor_id)
pid = Process.whereis(name)
{spec, pid}
end)
end
@spec start([advisor_spec]) :: {:ok, {new_started :: integer, old_started :: integer}}
def start(specs) do
counts =
specs
|> Tai.Advisors.info()
|> Enum.reduce({0, 0}, &start_advisor/2)
{:ok, counts}
end
@spec stop([advisor_spec]) :: {:ok, {new_stopped :: integer, old_stopped :: integer}}
def stop(specs) do
counts =
specs
|> Tai.Advisors.info()
|> Enum.reduce({0, 0}, &stop_advisor/2)
{:ok, counts}
end
defp start_advisor({_, pid}, {new, old}) when is_pid(pid) do
{new, old + 1}
end
defp start_advisor({spec, nil}, {new, old}) do
Tai.AdvisorsSupervisor.start_advisor(spec)
{new + 1, old}
end
defp stop_advisor({_, pid}, {new, old}) when is_pid(pid) do
Tai.AdvisorsSupervisor.terminate_advisor(pid)
{new + 1, old}
end
defp stop_advisor({_, nil}, {new, old}) do
{new, old + 1}
end
end