Packages
tai
0.0.23
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 when
# the venue adapters 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.AdvisorsSupervisor
]
{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one, name: Tai.Supervisor)
config |> boot_venues!()
config |> boot_advisor_groups!()
{: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)
end
defp boot_advisor_groups!(config) do
config
|> Tai.Advisors.specs(start_on_boot: true)
|> Tai.Advisors.start()
end
end