# Tai
[![Build Status](https://circleci.com/gh/fremantle-capital/tai.png)](https://circleci.com/gh/fremantle-capital/tai)
A trading toolkit built with [Elixir](https://elixir-lang.org/) that runs on the [Erlang virtual machine](http://erlang.org/faq/implementations.html)
## WARNING
`tai` is alpha quality software. It passes our test suite but the API is highly
likely to change and no effort will be made to maintain backwards compatibility at this time.
We are working to make `tai` production quality software.
[Tai on GitHub](https://github.com/fremantle-capital/tai) | [Install](#install) | [Usage](#usage) | [Advisors](./advisors) | [Configuration](#configuration) | [Debugging](#debugging)
## Supported Exchanges
| Exchange | Live Order Book | Orders |
|----------------|:----:|:--------------:|
| GDAX | [x] | [x] |
| Binance | [x] | [ ] |
| Poloniex | [x] | [ ] |
## Planned Exchanges
| Exchange | Live Order Book | Orders |
|----------------|:----:|:--------------:|
| Bitfinex | [ ] | [ ] |
| Bitflyer | [ ] | [ ] |
| Bithumb | [ ] | [ ] |
| Bitmex | [ ] | [ ] |
| Bitstamp | [ ] | [ ] |
| Bittrex | [ ] | [ ] |
| Gemini | [ ] | [ ] |
| HitBtc | [ ] | [ ] |
| Huobi | [ ] | [ ] |
| Kraken | [ ] | [ ] |
| OkCoin | [ ] | [ ] |
| ... | [ ] | [ ] |
[Full List...](./PLANNED_EXCHANGES.md)
## Install
Tai requires Elixir 1.6. Add `tai` to your list of dependencies in `mix.exs`
```elixir
def deps do
[
{:tai, "~> 0.0.1"}
]
end
```
Or use the lastest from `master`
```elixir
def deps do
[
{:tai, github: "fremantle-capital/tai"}
]
end
```
## Usage
`tai` currently runs as an interactive mix console application.
Once started it subscribes to the configured order book feeds and starts
[advisors](#advisors) to process the changes in the order book where you can
execute orders using a uniform API across exchanges.
```bash
iex -S mix
```
### Commands
You can view your total balance, inspect the state of orders, display live markets
or execute manual orders using the following commands.
#### help
Display the available commands and usage examples
```bash
iex(1)> help
* balance
* markets
* orders
* buy_limit exchange(:gdax), symbol(:btcusd), price(101.12), size(1.2)
* sell_limit exchange(:gdax), symbol(:btcusd), price(101.12), size(1.2)
* order_status exchange(:gdax), order_id("f1bb2fa3-6218-45be-8691-21b98157f25a")
* cancel_order exchange(:gdax), order_id("f1bb2fa3-6218-45be-8691-21b98157f25a")
```
#### balance
Return the USD value across all configured exchanges
```
iex(2)> balance
$100.13
```
#### markets
Displays the live top of the order book for the configured feeds. It includes
the time they were processed locally and if supported, the time they were sent
from the exchange. This allows you to monitor if a feed is under backpressure and
starting to fall behind as it updates it's order books.
```
iex(3)> markets
+---------+---------+-----------+-----------+------------+--------------+------------------+-----------------------+------------------+-----------------------+
| Feed | Symbol | Bid Price | Ask Price | Bid Size | Ask Size | Bid Processed At | Bid Server Changed At | Ask Processed At | Ask Server Changed At |
+---------+---------+-----------+-----------+------------+--------------+------------------+-----------------------+------------------+-----------------------+
| binance | btcusdt | 8430.0 | 8439.91 | 0.349355 | 1.021896 | 1 second ago | 1 second ago | now | now |
| binance | ltcusdt | 159.53 | 159.58 | 10.54534 | 1.02855 | 9 seconds ago | 9 seconds ago | 4 seconds ago | 4 seconds ago |
| binance | ethusdt | 519.67 | 520.0 | 0.08984 | 2.33198 | 7 seconds ago | 7 seconds ago | now | now |
| gdax | btcusd | 8430.86 | 8430.87 | 0.01448655 | 24.32791169 | 3 seconds ago | 3 seconds ago | 1 second ago | 1 second ago |
| gdax | ltcusd | 159.97 | 159.98 | 0.00002 | 478.22565196 | 28 seconds ago | 28 seconds ago | now | now |
| gdax | ethusd | 520.93 | 520.94 | 9.48431449 | 79.37008001 | now | now | 1 second ago | 2 seconds ago |
+---------+---------+-----------+-----------+------------+--------------+------------------+-----------------------+------------------+-----------------------+
```
#### orders
Displays the list of orders and their status.
**[IN PROGRESS:](https://github.com/fremantle-capital/tai/tree/order-feed-spike)**
As the lifecycle of the order changes i.e. partial fills, process events and
update in the background so that the information is available when you re-run
the `orders` command.
```
iex(4)> orders
+----------+--------+-----------+-------+------+--------+--------------------------------------+-----------+----------------+------------+
| Exchange | Symbol | Type | Price | Size | Status | Client ID | Server ID | Enqueued At | Created At |
+----------+--------+-----------+-------+------+--------+--------------------------------------+-----------+----------------+------------+
| gdax | btcusd | buy_limit | 100.1 | 0.1 | error | a6aa15bc-b271-486f-ab40-f9b35b2cd223 | | 20 minutes ago | |
+----------+--------+-----------+-------+------+--------+--------------------------------------+-----------+----------------+------------+
```
## Advisors
Advisors are the brains of any `tai` application, they receive events such
as order book changes or trades and can create, edit or cancel orders. They
are intended to run without supervision to analyze and record data or execute
trading strategies.
Take a look at some of the [examples](./examples/advisors) to understand how to create advisors.
## Configuration
Each environment can have its own configuration. Take a look at the [example dev configuration](config/dev.exs.example)
for available options.
## Debugging
`tai` keeps detailed logs of it's operations while running. They are written to a file with the name of the environment e.g. `logs/dev.log`. By default only `info`, `warn` & `error` messages are logged. If you would like to enable verbose logging that is useful for development and debugging you can set the `DEBUG` environment variable before you run tai.
```bash
DEBUG=true iex -S mix
```
To monitor a running instance of `tai` you can `tail` it's log
```bash
tail -f logs/dev.log
```
You can combine `tail` with `grep` to filter the logs for specific components or patterns.
e.g. Filter log messages created by the `CreateAndCancelPendingOrder` advisor
```bash
tail -f logs/dev.log | grep advisor_create_and_cancel_pending_order
```
## Authors
* Alex Kwiatkowski - alex+git@rival-studios.com
## License
`tai` is released under the [MIT license](./LICENSE.md)