bbgo_origin/README.md

643 lines
15 KiB
Markdown
Raw Normal View History

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
2021-12-04 16:39:36 +00:00
[![Go](https://github.com/c9s/bbgo/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/c9s/bbgo/actions/workflows/go.yml)
2020-10-10 05:19:54 +00:00
2020-10-08 12:49:05 +00:00
## Features
- Exchange abstraction interface
- Stream integration (user data websocket)
2021-02-25 04:49:25 +00:00
- PnL calculation
- Slack notification
2021-02-25 04:49:25 +00:00
- KLine-based backtest
2020-11-11 08:35:21 +00:00
- Built-in strategies
2021-02-25 04:49:25 +00:00
- Multi-session support
- Standard indicators (SMA, EMA, BOLL)
2021-11-30 02:35:57 +00:00
- React-powered Web Dashboard
2020-10-08 12:49:05 +00:00
2020-10-08 14:31:09 +00:00
## Supported Exchanges
2021-10-07 08:40:57 +00:00
- MAX Spot Exchange (located in Taiwan)
- Binance Spot Exchange
- FTX Spot Exchange
2020-10-08 14:31:09 +00:00
2020-10-27 12:21:28 +00:00
## Requirements
2021-03-20 02:16:07 +00:00
Get your exchange API key and secret after you register the accounts (you can choose one or more exchanges):
2020-10-27 12:21:28 +00:00
- For MAX: <https://max.maicoin.com/signup?r=c7982718>
- For Binance: <https://www.binancezh.com/en/register?ref=VGDGLT80>
2021-03-19 03:07:15 +00:00
- For FTX: <https://ftx.com/#a=7710474>
Since the exchange implementation and support are done by a small team, if you like the work they've done for you, It
would be great if you can use their referral code as your support to them. :-D
2020-10-27 12:21:28 +00:00
2020-10-10 05:18:40 +00:00
## Installation
2021-03-13 12:02:05 +00:00
### Install from binary
The following script will help you set up a config file, dotenv file:
2021-03-13 12:02:05 +00:00
2021-03-29 10:38:55 +00:00
```sh
2021-03-13 12:02:05 +00:00
bash <(curl -s https://raw.githubusercontent.com/c9s/bbgo/main/scripts/setup-grid.sh)
```
### Install and Run from the One-click Linode StackScript:
- BBGO USDT/TWD Market Grid Trading <https://cloud.linode.com/stackscripts/793380>
2021-03-29 10:37:07 +00:00
- BBGO USDC/TWD Market Grid Trading <https://cloud.linode.com/stackscripts/797776>
- BBGO LINK/TWD Market Grid Trading <https://cloud.linode.com/stackscripts/797774>
- BBGO USDC/USDT Market Grid Trading <https://cloud.linode.com/stackscripts/797777>
- BBGO Standard Grid Trading <https://cloud.linode.com/stackscripts/795788>
2021-03-13 12:02:05 +00:00
### Install from source
2021-05-09 17:00:12 +00:00
If you need to use go-sqlite, you will need to enable CGO first:
```
CGO_ENABLED=1 go get github.com/mattn/go-sqlite3
```
2021-03-19 03:52:09 +00:00
Install the bbgo command:
2020-10-10 05:18:40 +00:00
```sh
go get -u github.com/c9s/bbgo/cmd/bbgo
```
2020-10-11 08:05:07 +00:00
Add your dotenv file:
2021-03-29 10:38:55 +00:00
```sh
2021-03-15 09:57:03 +00:00
# if you have one
2020-10-11 08:05:07 +00:00
BINANCE_API_KEY=
BINANCE_API_SECRET=
2021-03-15 09:57:03 +00:00
# if you have one
2020-10-11 08:05:07 +00:00
MAX_API_KEY=
MAX_API_SECRET=
2021-03-15 09:57:03 +00:00
# if you have one
2021-02-05 13:27:29 +00:00
FTX_API_KEY=
FTX_API_SECRET=
# specify it if credentials are for subaccount
2021-03-15 10:52:31 +00:00
FTX_SUBACCOUNT=
2020-10-11 08:05:07 +00:00
```
2021-02-25 04:49:25 +00:00
Prepare your dotenv file `.env.local` and BBGO yaml config file `bbgo.yaml`.
2020-10-10 10:01:37 +00:00
The minimal bbgo.yaml could be generated by:
2021-03-19 03:00:20 +00:00
2021-03-29 10:38:55 +00:00
```sh
2021-03-20 02:16:51 +00:00
curl -o bbgo.yaml https://raw.githubusercontent.com/c9s/bbgo/main/config/minimal.yaml
```
To sync your own trade data:
2021-03-29 10:38:55 +00:00
```sh
2021-02-25 04:49:25 +00:00
bbgo sync --session max
bbgo sync --session binance
```
2021-02-25 04:49:25 +00:00
If you want to switch to other dotenv file, you can add an `--dotenv` option or `--config`:
2021-03-29 10:38:55 +00:00
```sh
bbgo sync --dotenv .env.dev --config config/grid.yaml --session binance
```
2020-11-23 06:50:57 +00:00
To sync remote exchange klines data for backtesting:
```sh
2021-02-25 04:49:25 +00:00
bbgo backtest --exchange binance -v --sync --sync-only --sync-from 2020-01-01
2020-11-23 06:50:57 +00:00
```
To run backtest:
```sh
2021-02-25 04:49:25 +00:00
bbgo backtest --exchange binance --base-asset-baseline
2020-11-23 06:50:57 +00:00
```
2020-10-11 12:11:22 +00:00
To query transfer history:
```sh
2021-02-17 06:43:08 +00:00
bbgo transfer-history --session max --asset USDT --since "2019-01-01"
2020-10-11 12:11:22 +00:00
```
To calculate pnl:
```sh
bbgo pnl --exchange binance --asset BTC --since "2019-01-01"
2020-10-11 12:11:22 +00:00
```
2020-10-27 12:21:28 +00:00
To run strategy:
```sh
2021-02-25 04:49:25 +00:00
bbgo run
2020-10-27 12:21:28 +00:00
```
2020-10-11 12:11:22 +00:00
2021-11-30 02:35:57 +00:00
To start bbgo with the frontend dashboard:
```sh
bbgo run --enable-webserver
```
2021-03-19 03:00:20 +00:00
## Advanced Setup
### Setting up Telegram Bot Notification
Open your Telegram app, and chat with @botFather
Enter `/newbot` to create a new bot
Enter the bot display name. ex. `your_bbgo_bot`
Enter the bot username. This should be global unique. e.g., `bbgo_bot_711222333`
Botfather will response your a bot token. *Keep bot token safe*
Set `TELEGRAM_BOT_TOKEN` in the `.env.local` file, e.g.,
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
TELEGRAM_BOT_TOKEN=347374838:ABFTjfiweajfiawoejfiaojfeijoaef
```
For the telegram chat authentication (your bot needs to verify it's you), if you only need a fixed authentication token,
you can set `TELEGRAM_AUTH_TOKEN` in the `.env.local` file, e.g.,
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
TELEGRAM_BOT_AUTH_TOKEN=itsme55667788
```
Run your bbgo,
Open your Telegram app, search your bot `bbgo_bot_711222333`
Enter `/start` and `/auth {code}`
Done! your notifications will be routed to the telegram chat.
### Setting up Slack Notification
Put your slack bot token in the .env.local file:
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
SLACK_TOKEN=xxoox
```
### Synchronizing Trading Data
By default, BBGO does not sync your trading data from the exchange sessions, so it's hard to calculate your profit and
loss correctly.
2021-03-19 03:02:35 +00:00
2021-03-19 03:00:20 +00:00
By synchronizing trades and orders to the local database, you can earn some benefits like PnL calculations, backtesting
and asset calculation.
#### Configure MySQL Database
To use MySQL database for data syncing, first you need to install your mysql server:
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
# For Ubuntu Linux
sudo apt-get install -y mysql-server
```
2021-03-19 03:52:09 +00:00
Or [run it in docker](https://hub.docker.com/_/mysql)
2021-03-19 03:00:20 +00:00
Create your mysql database:
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
mysql -uroot -e "CREATE DATABASE bbgo CHARSET utf8"
```
Then put these environment variables in your `.env.local` file:
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
DB_DRIVER=mysql
DB_DSN="user:password@tcp(127.0.0.1:3306)/bbgo"
2021-03-19 03:00:20 +00:00
```
#### Configure Sqlite3 Database
Just put these environment variables in your `.env.local` file:
2021-03-29 10:38:55 +00:00
```sh
2021-03-19 03:00:20 +00:00
DB_DRIVER=sqlite3
DB_DSN=bbgo.sqlite3
```
2020-10-27 11:24:39 +00:00
## Built-in Strategies
Check out the strategy directory [strategy](pkg/strategy) for all built-in strategies:
2020-11-07 04:24:18 +00:00
- `pricealert` strategy demonstrates how to use the notification system [pricealert](pkg/strategy/pricealert)
2021-03-19 03:00:20 +00:00
- `xpuremaker` strategy demonstrates how to maintain the orderbook and submit maker
orders [xpuremaker](pkg/strategy/xpuremaker)
- `buyandhold` strategy demonstrates how to subscribe kline events and submit market
2021-10-14 05:10:00 +00:00
order [buyandhold](pkg/strategy/pricedrop)
2021-03-19 03:00:20 +00:00
- `bollgrid` strategy implements a basic grid strategy with the built-in bollinger
indicator [bollgrid](pkg/strategy/bollgrid)
- `grid` strategy implements the fixed price band grid strategy [grid](pkg/strategy/grid)
2020-11-07 04:24:18 +00:00
- `flashcrash` strategy implements a strategy that catches the flashcrash [flashcrash](pkg/strategy/flashcrash)
2021-03-19 03:00:20 +00:00
To run these built-in strategies, just modify the config file to make the configuration suitable for you, for example if
you want to run
2020-11-07 04:26:08 +00:00
`buyandhold` strategy:
2020-11-07 04:24:18 +00:00
```sh
vim config/buyandhold.yaml
# run bbgo with the config
bbgo run --config config/buyandhold.yaml
2020-11-07 04:24:18 +00:00
```
2020-10-27 11:24:39 +00:00
## Adding New Built-in Strategy
Fork and clone this repository, Create a directory under `pkg/strategy/newstrategy`, write your strategy
at `pkg/strategy/newstrategy/strategy.go`.
Define a strategy struct:
```go
package newstrategy
import (
"github.com/c9s/bbgo/pkg/fixedpoint"
)
type Strategy struct {
Symbol string `json:"symbol"`
Param1 int `json:"param1"`
Param2 int `json:"param2"`
Param3 fixedpoint.Value `json:"param3"`
}
```
Register your strategy:
```go
package newstrategy
const ID = "newstrategy"
const stateKey = "state-v1"
var log = logrus.WithField("strategy", ID)
func init() {
2021-05-27 19:05:59 +00:00
bbgo.RegisterStrategy(ID, &Strategy{})
}
```
Implement the strategy methods:
```go
package newstrategy
func (s *Strategy) Subscribe(session *bbgo.ExchangeSession) {
2021-05-27 19:05:59 +00:00
session.Subscribe(types.KLineChannel, s.Symbol, types.SubscribeOptions{Interval: "2m"})
}
func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, session *bbgo.ExchangeSession) error {
2021-05-27 19:05:59 +00:00
// ....
return nil
}
```
Edit `pkg/cmd/builtin.go`, and import the package, like this:
```go
package cmd
// import built-in strategies
import (
_ "github.com/c9s/bbgo/pkg/strategy/bollgrid"
_ "github.com/c9s/bbgo/pkg/strategy/buyandhold"
_ "github.com/c9s/bbgo/pkg/strategy/flashcrash"
_ "github.com/c9s/bbgo/pkg/strategy/grid"
_ "github.com/c9s/bbgo/pkg/strategy/pricealert"
_ "github.com/c9s/bbgo/pkg/strategy/support"
_ "github.com/c9s/bbgo/pkg/strategy/swing"
_ "github.com/c9s/bbgo/pkg/strategy/trailingstop"
_ "github.com/c9s/bbgo/pkg/strategy/xmaker"
_ "github.com/c9s/bbgo/pkg/strategy/xpuremaker"
)
```
2020-10-27 12:36:20 +00:00
## Write your own strategy
Create your go package, and initialize the repository with `go mod` and add bbgo as a dependency:
2021-03-29 10:38:55 +00:00
```sh
2020-10-27 12:36:20 +00:00
go mod init
2021-01-21 04:32:39 +00:00
go get github.com/c9s/bbgo@main
2020-10-27 12:36:20 +00:00
```
2021-01-21 04:32:39 +00:00
Write your own strategy in the strategy file:
2020-10-27 12:36:20 +00:00
2021-03-29 10:38:55 +00:00
```sh
2021-01-21 04:32:39 +00:00
vim strategy.go
2020-10-27 12:36:20 +00:00
```
You can grab the skeleton strategy from <https://github.com/c9s/bbgo/blob/main/pkg/strategy/skeleton/strategy.go>
Now add your config:
2021-03-29 10:38:55 +00:00
```sh
2020-10-27 12:36:20 +00:00
mkdir config
2020-10-27 12:38:56 +00:00
(cd config && curl -o bbgo.yaml https://raw.githubusercontent.com/c9s/bbgo/main/config/minimal.yaml)
2020-10-27 12:36:20 +00:00
```
Add your strategy package path to the config file `config/bbgo.yaml`
```yaml
2021-01-21 04:32:39 +00:00
---
build:
dir: build
imports:
- github.com/your_id/your_swing
targets:
- name: swing-amd64-linux
os: linux
arch: amd64
- name: swing-amd64-darwin
os: darwin
arch: amd64
2020-10-27 12:36:20 +00:00
```
Run `bbgo run` command, bbgo will compile a wrapper binary that imports your strategy:
```sh
dotenv -f .env.local -- bbgo run --config config/bbgo.yaml
```
2021-01-21 04:32:39 +00:00
Or you can build your own wrapper binary via:
```shell
bbgo build --config config/bbgo.yaml
```
2021-05-27 19:05:59 +00:00
## Command Usages
### Submitting Orders to a specific exchagne session
```shell
bbgo submit-order --session=okex --symbol=OKBUSDT --side=buy --price=10.0 --quantity=1
```
### Listing Open Orders of a specific exchange session
```sh
bbgo list-orders open --session=okex --symbol=OKBUSDT
bbgo list-orders open --session=ftx --symbol=FTTUSDT
bbgo list-orders open --session=max --symbol=MAXUSDT
bbgo list-orders open --session=binance --symbol=BNBUSDT
```
### Canceling an open order
```shell
# both order id and symbol is required for okex
bbgo cancel-order --session=okex --order-id=318223238325248000 --symbol=OKBUSDT
# for max, you can just give your order id
bbgo cancel-order --session=max --order-id=1234566
```
### Debugging user data stream
```shell
bbgo userdatastream --session okex
bbgo userdatastream --session max
bbgo userdatastream --session binance
```
2020-10-27 12:36:20 +00:00
## Dynamic Injection
In order to minimize the strategy code, bbgo supports dynamic dependency injection.
2021-03-19 03:00:20 +00:00
Before executing your strategy, bbgo injects the components into your strategy object if it found the embedded field
that is using bbgo component. for example:
2020-10-27 12:36:20 +00:00
```go
type Strategy struct {
2021-03-19 03:00:20 +00:00
*bbgo.Notifiability
2020-10-27 12:36:20 +00:00
}
```
And then, in your code, you can call the methods of Notifiability.
Supported components (single exchange strategy only for now):
- `*bbgo.Notifiability`
- `bbgo.OrderExecutor`
2021-03-19 03:00:20 +00:00
If you have `Symbol string` field in your strategy, your strategy will be detected as a symbol-based strategy, then the
following types could be injected automatically:
2020-11-07 04:24:18 +00:00
- `*bbgo.ExchangeSession`
- `types.Market`
2021-03-15 09:57:03 +00:00
## Strategy Execution Phases
1. Load config from the config file.
2. Allocate and initialize exchange sessions.
3. Add exchange sessions to the environment (the data layer).
2021-03-15 09:58:10 +00:00
4. Use the given environment to initialize the trader object (the logic layer).
2021-03-15 09:57:03 +00:00
5. The trader initializes the environment and start the exchange connections.
6. Call strategy.Run() method sequentially.
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)
```
2021-03-15 09:57:42 +00:00
## How To Add A New Exchange
(TBD)
2020-12-17 06:09:22 +00:00
## Helm Chart
2021-03-24 09:49:32 +00:00
If you need redis:
2021-03-29 10:38:55 +00:00
```sh
2021-03-24 09:49:32 +00:00
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install redis bitnami/redis
```
To get the dynamically generated redis password, you can use the following command:
2021-03-29 10:38:55 +00:00
```sh
export REDIS_PASSWORD=$(kubectl get secret --namespace bbgo redis -o jsonpath="{.data.redis-password}" | base64 --decode)
```
2021-03-24 09:49:32 +00:00
2020-12-17 08:19:31 +00:00
Prepare your docker image locally (you can also use the docker image from docker hub):
2021-03-29 10:38:55 +00:00
```sh
2020-12-17 08:19:31 +00:00
make docker DOCKER_TAG=1.16.0
```
The docker tag version number is from the file [Chart.yaml](charts/bbgo/Chart.yaml)
Choose your instance name:
2021-03-29 10:38:55 +00:00
```sh
export INSTANCE=grid
```
2020-12-17 07:31:00 +00:00
Prepare your secret:
2021-03-29 10:38:55 +00:00
```sh
kubectl create secret generic bbgo-$INSTANCE --from-env-file .env.local
2020-12-17 06:09:22 +00:00
```
2021-03-19 03:00:20 +00:00
Configure your config file, the chart defaults to read config/bbgo.yaml to create a configmap:
2020-12-17 07:31:00 +00:00
2021-03-29 10:38:55 +00:00
```sh
cp config/grid.yaml bbgo-$INSTANCE.yaml
vim bbgo-$INSTANCE.yaml
2020-12-17 07:31:00 +00:00
```
Prepare your configmap:
2021-03-29 10:38:55 +00:00
```sh
kubectl create configmap bbgo-$INSTANCE --from-file=bbgo.yaml=bbgo-$INSTANCE.yaml
2020-12-17 07:31:00 +00:00
```
2021-03-19 03:00:20 +00:00
Install chart with the preferred release name, the release name maps to the previous secret we just created, that
is, `bbgo-grid`:
2020-12-17 07:31:00 +00:00
2021-03-29 10:38:55 +00:00
```sh
helm install --set existingConfigmap=bbgo-$INSTANCE bbgo-$INSTANCE ./charts/bbgo
2020-12-17 07:31:00 +00:00
```
2021-03-24 07:12:08 +00:00
To use the latest version:
2021-03-29 10:38:55 +00:00
```sh
helm install --set existingConfigmap=bbgo-$INSTANCE --set image.tag=latest bbgo-$INSTANCE ./charts/bbgo
```
To upgrade:
2021-03-29 10:38:55 +00:00
```sh
helm upgrade bbgo-$INSTANCE ./charts/bbgo
helm upgrade --set image.tag=1.15.2 bbgo-$INSTANCE ./charts/bbgo
2021-03-24 07:12:08 +00:00
```
2020-12-17 07:31:00 +00:00
Delete chart:
2021-03-29 10:38:55 +00:00
```sh
helm delete bbgo-$INSTANCE
2020-12-17 07:31:00 +00:00
```
2021-02-15 12:30:53 +00:00
## Development
The overview function flow at bbgo
![image info](./assets/overview.svg)
2021-03-18 06:57:03 +00:00
### Setting up your local repository
1. Click the "Fork" button from the GitHub repository.
2. Clone your forked repository into `$GOPATH/github.com/c9s/bbgo`.
3. Change directory into `$GOPATH/github.com/c9s/bbgo`.
4. Create a branch and start your development.
2021-03-19 03:00:20 +00:00
5. Test your changes.
2021-03-18 06:57:03 +00:00
6. Push your changes to your fork.
7. Send a pull request.
2021-02-15 12:30:53 +00:00
### Adding new migration
2021-12-04 02:05:02 +00:00
1. The project used rockerhopper for db migration.
https://github.com/c9s/rockhopper
2. Create migration files
2021-02-15 12:30:53 +00:00
```sh
rockhopper --config rockhopper_sqlite.yaml create --type sql add_pnl_column
rockhopper --config rockhopper_mysql.yaml create --type sql add_pnl_column
```
2021-02-23 01:24:42 +00:00
or
```
bash utils/generate-new-migration.sh add_pnl_column
```
2021-12-04 02:09:27 +00:00
Be sure to edit both sqlite3 and mysql migration files. ( [Sample](migrations/mysql/20210531234123_add_kline_taker_buy_columns.sql) )
2021-12-04 02:05:02 +00:00
2021-02-23 01:24:42 +00:00
2021-12-04 02:05:02 +00:00
To test the drivers, you have to update the rockhopper_mysql.yaml file to connect your database,
then do:
2021-02-23 01:24:42 +00:00
2021-03-29 10:38:55 +00:00
```sh
2021-02-23 01:24:42 +00:00
rockhopper --config rockhopper_sqlite.yaml up
rockhopper --config rockhopper_mysql.yaml up
```
2021-05-31 15:46:53 +00:00
Then run the following command to compile the migration files into go files:
```shell
make migrations
```
2021-02-18 01:24:24 +00:00
### Setup frontend development environment
2021-03-29 10:38:55 +00:00
```sh
2021-02-18 01:24:24 +00:00
cd frontend
yarn install
```
### Testing Desktop App
for webview
```sh
make embed && go run -tags web ./cmd/bbgo-webview
```
for lorca
```sh
make embed && go run -tags web ./cmd/bbgo-lorca
```
2020-10-08 14:31:09 +00:00
2021-11-25 18:57:07 +00:00
## Contributing
2020-10-11 08:31:58 +00:00
2021-11-25 18:58:03 +00:00
See [Contributing](./CONTRIBUTING.md)
2020-10-08 14:31:09 +00:00
## Community
2021-05-03 04:28:35 +00:00
You can join our telegram channels:
- BBGO International <https://t.me/bbgo_intl>
- BBGO Taiwan <https://t.me/bbgocrypto>
2021-12-01 16:52:03 +00:00
## Supporter
- GitBook
2020-10-08 12:49:05 +00:00
## License
MIT License