Packages
tai
0.0.27
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.ex
defmodule Tai do
use Application
def start(_type, _args) do
# TODO:
# ex_poloniex won't need to resolve env on boot separately when
# it's venue adapter can support per account configuration
Confex.resolve_env!(:ex_poloniex)
Confex.resolve_env!(:tai)
config = Tai.Config.parse()
settings = Tai.Settings.from_config(config)
children = [
Tai.PubSub,
{Tai.Events, config.event_registry_partitions},
Tai.EventsLogger,
{Tai.Settings, settings},
Tai.Trading.PositionStore,
Tai.Trading.OrderStore,
Tai.Venues.ProductStore,
Tai.Venues.FeeStore,
Tai.Venues.AssetBalances,
Tai.Venues.OrderBookFeedsSupervisor,
Tai.Venues.StreamsSupervisor,
{Task.Supervisor, name: Tai.TaskSupervisor, restart: :transient},
Tai.Advisors.Store,
Tai.Advisors.Supervisor
]
{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one, name: Tai.Supervisor)
config
|> boot_venues!()
|> hydrate_advisors!()
|> boot_advisors!()
{:ok, pid}
end
defp boot_venues!(config) do
config
|> Tai.Venues.Config.parse_adapters()
|> Enum.map(fn {_, adapter} ->
task =
Task.Supervisor.async(
Tai.TaskSupervisor,
Tai.Venues.Boot,
:run,
[adapter],
timeout: adapter.timeout
)
{task, adapter}
end)
|> Enum.map(fn {task, adapter} -> Task.await(task, adapter.timeout) end)
|> Enum.each(&config.venue_boot_handler.parse_response/1)
{:ok, config}
end
defp hydrate_advisors!({:ok, config}) do
config
|> Tai.Advisors.Specs.from_config()
|> Enum.map(&Tai.Advisors.Instance.from_spec/1)
|> Enum.map(&Tai.Advisors.Store.upsert/1)
end
defp boot_advisors!(upsert_results) do
upsert_results
|> Enum.map(fn {:ok, instance} -> instance end)
|> Enum.filter(fn instance -> instance.start_on_boot end)
|> Tai.Advisors.Instances.start()
end
end