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
|
|
|
|
|
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)
|
|
|
|
|
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-11-11 08:35:21 +00:00
|
|
|
- KLine-based Backtest
|
|
|
|
- Built-in strategies
|
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-27 12:21:28 +00:00
|
|
|
## Requirements
|
|
|
|
|
|
|
|
Get your exchange 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-10 05:18:40 +00:00
|
|
|
## Installation
|
|
|
|
|
2020-12-12 20:53:07 +00:00
|
|
|
Setup MySQL or [run it in docker](https://hub.docker.com/_/mysql)
|
|
|
|
|
2020-10-10 05:18:40 +00:00
|
|
|
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=
|
|
|
|
|
2020-12-05 06:20:27 +00:00
|
|
|
TELEGRAM_BOT_TOKEN=
|
2020-12-11 06:40:04 +00:00
|
|
|
TELEGRAM_BOT_AUTH_TOKEN=
|
2020-12-05 06:20:27 +00:00
|
|
|
|
2020-10-11 08:05:07 +00:00
|
|
|
BINANCE_API_KEY=
|
|
|
|
BINANCE_API_SECRET=
|
|
|
|
|
|
|
|
MAX_API_KEY=
|
|
|
|
MAX_API_SECRET=
|
|
|
|
|
2021-02-05 13:27:29 +00:00
|
|
|
FTX_API_KEY=
|
|
|
|
FTX_API_SECRET=
|
|
|
|
# specify it if credentials are for subaccount
|
|
|
|
FTX_SUBACCOUNT_NAME=
|
|
|
|
|
2021-01-15 02:34:44 +00:00
|
|
|
MYSQL_URL=root@tcp(127.0.0.1:3306)/bbgo?parseTime=true
|
2020-10-11 08:05:07 +00:00
|
|
|
```
|
|
|
|
|
2021-01-15 02:35:24 +00:00
|
|
|
Make sure you have [dotenv](https://github.com/bkeepers/dotenv)
|
2020-10-10 10:01:37 +00:00
|
|
|
|
2021-02-06 07:05:25 +00:00
|
|
|
To sync your own trade data:
|
|
|
|
|
|
|
|
```
|
|
|
|
bbgo sync --config config/grid.yaml --session max
|
|
|
|
bbgo sync --config config/grid.yaml --session binance
|
|
|
|
```
|
|
|
|
|
|
|
|
If you want to switch to other dotenv file, you can add an `--dotenv` option:
|
|
|
|
|
|
|
|
```
|
|
|
|
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-06 07:05:25 +00:00
|
|
|
bbgo backtest --exchange binance --config config/grid.yaml -v --sync --sync-only --sync-from 2020-01-01
|
2020-11-23 06:50:57 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
To run backtest:
|
|
|
|
|
|
|
|
```sh
|
2021-02-06 07:05:25 +00:00
|
|
|
bbgo backtest --exchange binance --config config/bollgrid.yaml --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
|
2021-02-06 07:05:25 +00:00
|
|
|
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-06 07:05:25 +00:00
|
|
|
bbgo run --config config/buyandhold.yaml
|
2020-10-27 12:21:28 +00:00
|
|
|
```
|
2020-10-11 12:11:22 +00:00
|
|
|
|
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)
|
|
|
|
- `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 order [buyandhold](pkg/strategy/buyandhold)
|
|
|
|
- `grid` strategy implements a basic grid strategy with the built-in bollinger indicator [grid](pkg/strategy/grid)
|
|
|
|
- `flashcrash` strategy implements a strategy that catches the flashcrash [flashcrash](pkg/strategy/flashcrash)
|
|
|
|
|
2020-11-07 04:26:08 +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
|
|
|
|
`buyandhold` strategy:
|
2020-11-07 04:24:18 +00:00
|
|
|
|
|
|
|
```sh
|
|
|
|
vim config/buyandhold.yaml
|
|
|
|
|
|
|
|
# run bbgo with the config
|
2021-02-06 07:05:25 +00:00
|
|
|
bbgo run --config config/buyandhold.yaml
|
2020-11-07 04:24:18 +00:00
|
|
|
```
|
2020-10-27 11:24:39 +00:00
|
|
|
|
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:
|
|
|
|
|
|
|
|
```
|
|
|
|
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-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:
|
|
|
|
|
|
|
|
```
|
|
|
|
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
|
|
|
|
```
|
|
|
|
|
2020-10-27 12:36:20 +00:00
|
|
|
## Dynamic Injection
|
|
|
|
|
|
|
|
In order to minimize the strategy code, bbgo supports dynamic dependency injection.
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
```go
|
|
|
|
type Strategy struct {
|
|
|
|
*bbgo.Notifiability
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
And then, in your code, you can call the methods of Notifiability.
|
|
|
|
|
|
|
|
Supported components (single exchange strategy only for now):
|
|
|
|
|
|
|
|
- `*bbgo.Notifiability`
|
|
|
|
- `bbgo.OrderExecutor`
|
|
|
|
|
2020-11-07 04:24:18 +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:
|
|
|
|
|
|
|
|
- `*bbgo.ExchangeSession`
|
|
|
|
- `types.Market`
|
|
|
|
|
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-12-06 05:26:34 +00:00
|
|
|
## Telegram Integration
|
|
|
|
|
|
|
|
- In telegram: @botFather
|
|
|
|
- /newbot
|
|
|
|
- input bot display name. ex. `bbgo_bot`
|
|
|
|
- input bot username. This should be global unique. ex. `PeqFqJxP_bbgo_bot`
|
|
|
|
- Botfather return bot token. Keep bot token safe
|
|
|
|
- Set `TELEGRAM_BOT_TOKEN` in `.env.local`
|
2020-12-06 05:59:47 +00:00
|
|
|
- Set `TELEGRAM_AUTH_TOKEN` in `.env.local`. Generate your own auth token. ex. 92463901, or kx2UX@eM
|
2020-12-06 05:26:34 +00:00
|
|
|
- Run bbgo
|
|
|
|
- In telegram: search your bot `PeqFqJxP_bbgo_bot`
|
|
|
|
- /start
|
2020-12-06 05:59:47 +00:00
|
|
|
- /auth 92463901
|
2020-12-06 05:26:34 +00:00
|
|
|
- done! your session will route to telegram
|
|
|
|
|
2020-12-17 06:09:22 +00:00
|
|
|
## Helm Chart
|
|
|
|
|
2020-12-17 08:19:31 +00:00
|
|
|
Prepare your docker image locally (you can also use the docker image from docker hub):
|
|
|
|
|
|
|
|
```
|
|
|
|
make docker DOCKER_TAG=1.16.0
|
|
|
|
```
|
|
|
|
|
|
|
|
The docker tag version number is from the file [Chart.yaml](charts/bbgo/Chart.yaml)
|
|
|
|
|
2020-12-17 07:31:00 +00:00
|
|
|
Prepare your secret:
|
|
|
|
|
2020-12-17 06:09:22 +00:00
|
|
|
```
|
2020-12-18 03:29:18 +00:00
|
|
|
kubectl create secret generic bbgo-grid --from-env-file .env.local
|
2020-12-17 06:09:22 +00:00
|
|
|
```
|
|
|
|
|
2020-12-18 03:29:18 +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
|
|
|
|
|
|
|
```
|
2020-12-17 07:39:08 +00:00
|
|
|
cp config/grid.yaml config/bbgo.yaml
|
2020-12-17 07:31:00 +00:00
|
|
|
vim config/bbgo.yaml
|
|
|
|
```
|
|
|
|
|
2020-12-18 03:29:18 +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
|
|
|
|
|
|
|
```
|
2020-12-18 03:29:18 +00:00
|
|
|
helm install bbgo-grid ./charts/bbgo
|
2020-12-17 07:31:00 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Delete chart:
|
|
|
|
|
|
|
|
```
|
|
|
|
helm delete bbgo
|
|
|
|
```
|
|
|
|
|
2021-02-15 12:30:53 +00:00
|
|
|
## Development
|
|
|
|
|
|
|
|
### Adding new migration
|
|
|
|
|
|
|
|
```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-18 01:24:24 +00:00
|
|
|
### Setup frontend development environment
|
|
|
|
|
|
|
|
```
|
|
|
|
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
|
|
|
## Support
|
|
|
|
|
2020-10-22 03:16:28 +00:00
|
|
|
### By contributing pull requests
|
2020-10-11 08:31:58 +00:00
|
|
|
|
|
|
|
Any pull request is welcome, documentation, format fixing, testing, features.
|
|
|
|
|
2020-10-22 03:16:28 +00:00
|
|
|
### By registering account with referral ID
|
2020-10-11 08:31:58 +00:00
|
|
|
|
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-22 03:16:28 +00:00
|
|
|
### By 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
|
|
|
|
2021-02-06 04:40:48 +00:00
|
|
|
|
|
|
|
## Community
|
|
|
|
|
|
|
|
You can join our telegram channel <https://t.me/bbgocrypto>, it's in Chinese, but English is fine as well.
|
|
|
|
|
|
|
|
## Contribution
|
|
|
|
|
|
|
|
BBGO has a token BBG for the ecosystem (contract address: <https://etherscan.io/address/0x3afe98235d680e8d7a52e1458a59d60f45f935c0>).
|
|
|
|
|
|
|
|
Each issue has its BBG label, by completing the issue with a pull request, you can get correspond amount of BBG.
|
|
|
|
|
|
|
|
If you have feature request, you can offer your BBG for contributors.
|
|
|
|
|
|
|
|
For further request, please contact us: <https://t.me/c123456789s>
|
|
|
|
|
2020-10-08 12:49:05 +00:00
|
|
|
## License
|
|
|
|
|
|
|
|
MIT License
|