2020-10-08 12:49:05 +00:00
|
|
|
# bbgo
|
|
|
|
|
|
|
|
A trading bot framework written in Go. The name bbgo comes from the BB8 bot in the Star Wars movie. aka Buy BitCoin Go!
|
|
|
|
|
|
|
|
## Current Status
|
|
|
|
|
|
|
|
_Working hard in progress_
|
|
|
|
|
2020-10-10 05:19:54 +00:00
|
|
|
[![Build Status](https://travis-ci.org/c9s/bbgo.svg?branch=main)](https://travis-ci.org/c9s/bbgo)
|
|
|
|
|
|
|
|
Aim to release v1.0 before 11/14
|
2020-10-08 12:49:05 +00:00
|
|
|
|
|
|
|
## Features
|
|
|
|
|
|
|
|
- Exchange abstraction interface
|
|
|
|
- Stream integration (user data websocket)
|
|
|
|
- PnL calculation.
|
2020-10-11 12:16:38 +00:00
|
|
|
- Slack notification
|
2020-10-08 12:49:05 +00:00
|
|
|
|
2020-10-08 14:31:09 +00:00
|
|
|
## Supported Exchanges
|
|
|
|
|
|
|
|
- MAX Exchange (located in Taiwan)
|
|
|
|
- Binance Exchange
|
|
|
|
|
2020-10-10 05:18:40 +00:00
|
|
|
## Installation
|
|
|
|
|
|
|
|
Install the builtin commands:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
go get -u github.com/c9s/bbgo/cmd/bbgo
|
|
|
|
```
|
|
|
|
|
2020-10-11 08:05:07 +00:00
|
|
|
Add your dotenv file:
|
|
|
|
|
|
|
|
```
|
|
|
|
SLACK_TOKEN=
|
|
|
|
|
|
|
|
BINANCE_API_KEY=
|
|
|
|
BINANCE_API_SECRET=
|
|
|
|
|
|
|
|
MAX_API_KEY=
|
|
|
|
MAX_API_SECRET=
|
|
|
|
|
|
|
|
MYSQL_HOST=127.0.0.1
|
|
|
|
MYSQL_PORT=3306
|
|
|
|
MYSQL_USERNAME=root
|
|
|
|
MYSQL_PASSWORD=
|
|
|
|
MYSQL_DATABASE=bbgo
|
|
|
|
MYSQL_URL=root@tcp(127.0.0.1:3306)/bbgo
|
|
|
|
```
|
|
|
|
|
2020-10-11 08:31:58 +00:00
|
|
|
You can get your API key and secret after you register the accounts:
|
|
|
|
|
|
|
|
- For MAX: <https://max.maicoin.com/signup?r=c7982718>
|
|
|
|
- For Binance: <https://www.binancezh.com/en/register?ref=VGDGLT80>
|
|
|
|
|
2020-10-11 08:05:07 +00:00
|
|
|
Then run the `migrate` command to initialize your database:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
dotenv -f .env.local -- bbgo migrate up
|
|
|
|
```
|
|
|
|
|
|
|
|
There are some other commands you can run:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
dotenv -f .env.local -- bbgo migrate status
|
|
|
|
dotenv -f .env.local -- bbgo migrate redo
|
|
|
|
```
|
|
|
|
|
|
|
|
(It internally uses `goose` to run these migration files, see [migrations](migrations))
|
2020-10-10 10:01:37 +00:00
|
|
|
|
2020-10-11 12:11:22 +00:00
|
|
|
|
|
|
|
To query transfer history:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
dotenv -f .env.local -- bbgo transfer-history --exchange max --asset USDT --since "2019-01-01"
|
|
|
|
```
|
|
|
|
|
|
|
|
To calculate pnl:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
dotenv -f .env.local -- bbgo pnl --exchange binance --asset BTC --since "2019-01-01"
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2020-10-18 03:20:44 +00:00
|
|
|
## Exchange API Examples
|
2020-10-10 04:06:22 +00:00
|
|
|
|
2020-10-10 04:07:12 +00:00
|
|
|
Please check out the example directory: [examples](examples)
|
2020-10-10 04:06:22 +00:00
|
|
|
|
2020-10-10 04:09:23 +00:00
|
|
|
Initialize MAX API:
|
|
|
|
|
|
|
|
```go
|
|
|
|
key := os.Getenv("MAX_API_KEY")
|
|
|
|
secret := os.Getenv("MAX_API_SECRET")
|
|
|
|
|
|
|
|
maxRest := maxapi.NewRestClient(maxapi.ProductionAPIURL)
|
|
|
|
maxRest.Auth(key, secret)
|
|
|
|
```
|
|
|
|
|
|
|
|
Creating user data stream to get the orderbook (depth):
|
|
|
|
|
|
|
|
```go
|
|
|
|
stream := max.NewStream(key, secret)
|
|
|
|
stream.Subscribe(types.BookChannel, symbol, types.SubscribeOptions{})
|
|
|
|
|
|
|
|
streambook := types.NewStreamBook(symbol)
|
|
|
|
streambook.BindStream(stream)
|
|
|
|
```
|
|
|
|
|
2020-10-18 03:20:44 +00:00
|
|
|
## Strategies
|
|
|
|
|
|
|
|
Please check out the directory: [strategies](strategies)
|
|
|
|
|
2020-10-16 02:26:45 +00:00
|
|
|
## New API Design
|
2020-10-08 14:26:33 +00:00
|
|
|
|
|
|
|
_**still under construction**_
|
|
|
|
|
|
|
|
```go
|
2020-10-10 04:06:22 +00:00
|
|
|
package main
|
|
|
|
|
2020-10-08 14:26:33 +00:00
|
|
|
import (
|
|
|
|
"github.com/c9s/bbgo"
|
|
|
|
)
|
|
|
|
|
2020-10-12 09:33:02 +00:00
|
|
|
func main() {
|
|
|
|
mysqlURL := viper.GetString("mysql-url")
|
|
|
|
mysqlURL = fmt.Sprintf("%s?parseTime=true", mysqlURL)
|
|
|
|
db, err := sqlx.Connect("mysql", mysqlURL)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-10-16 02:26:45 +00:00
|
|
|
environment := bbgo.NewEnvironment(db)
|
2020-10-12 09:33:02 +00:00
|
|
|
environment.AddExchange("binance", binance.New(viper.Getenv("binance-api-key"), viper.Getenv("binance-api-secret"))))
|
|
|
|
environment.AddExchange("max", max.New(viper.Getenv("max-key"), viper.Getenv("max-secret"))))
|
|
|
|
|
|
|
|
trader := bbgo.NewTrader(bbgo.Config{
|
|
|
|
Environment: environment,
|
|
|
|
DB: db,
|
|
|
|
})
|
|
|
|
|
|
|
|
trader.AddNotifier(slacknotifier.New(slackToken))
|
|
|
|
trader.AddLogHook(slacklog.NewLogHook(slackToken))
|
|
|
|
|
|
|
|
// when any trade execution happened
|
|
|
|
trader.OnTrade(func(session string, exchange types.Exchange, trade types.Trade) {
|
|
|
|
notify(trade)
|
|
|
|
notifyPnL()
|
|
|
|
})
|
|
|
|
|
|
|
|
// mount strategy on an exchange
|
|
|
|
trader.AddExchangeStrategy("binance",
|
|
|
|
bondtrade.New("btcusdt", "5m"),
|
|
|
|
bondtrade.New("ethusdt", "5m"))
|
|
|
|
|
|
|
|
// mount cross exchange strategy
|
|
|
|
trader.AddCrossExchangeStrategy(hedgemaker.New("max", "binance"))
|
|
|
|
|
|
|
|
t.Run(ctx)
|
2020-10-08 14:26:33 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-10-08 14:31:09 +00:00
|
|
|
## Support
|
|
|
|
|
2020-10-11 08:31:58 +00:00
|
|
|
### Contribute pull requests
|
|
|
|
|
|
|
|
Any pull request is welcome, documentation, format fixing, testing, features.
|
|
|
|
|
|
|
|
### Register account with referral ID
|
|
|
|
|
2020-10-08 14:31:09 +00:00
|
|
|
You may register your exchange account with my referral ID to support this project.
|
|
|
|
|
|
|
|
- For MAX Exchange: <https://max.maicoin.com/signup?r=c7982718> (default commission rate to your account)
|
|
|
|
- For Binance Exchange: <https://www.binancezh.com/en/register?ref=VGDGLT80> (5% commission back to your account)
|
|
|
|
|
2020-10-11 08:31:58 +00:00
|
|
|
### Some cryptos
|
|
|
|
|
|
|
|
To support this project by some small amount cryptos:
|
2020-10-08 14:31:09 +00:00
|
|
|
|
2020-10-11 08:31:58 +00:00
|
|
|
- BTC address `3J6XQJNWT56amqz9Hz2BEVQ7W4aNmb5kiU`
|
|
|
|
- USDT ERC20 address `0x63E5805e027548A384c57E20141f6778591Bac6F`
|
2020-10-08 14:31:09 +00:00
|
|
|
|
2020-10-08 12:49:05 +00:00
|
|
|
## License
|
|
|
|
|
|
|
|
MIT License
|