Merge pull request #734 from zenixls2/feature/lint_fmt_check

fix: apply gofmt on all files, add revive action
This commit is contained in:
Yo-An Lin 2022-06-17 18:51:34 +08:00 committed by GitHub
commit f25f2f076f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
98 changed files with 2810 additions and 2720 deletions

View File

@ -17,7 +17,7 @@ jobs:
env:
MYSQL_DATABASE: bbgo
MYSQL_USER: "root"
MYSQL_PASSWORD: "root"
MYSQL_PASSWORD: "root" # pragma: allowlist secret
steps:
@ -44,10 +44,17 @@ jobs:
# auto-start: "false"
- name: Set up Go
uses: actions/setup-go@v2
uses: actions/setup-go@v3
with:
go-version: 1.18
- name: Run pre-commit
run: |
pip install pre-commit
pre-commit install-hooks
pre-commit run markdownlint --files=README.md --verbose
pre-commit run detect-secrets --all-files --verbose
- name: Install Migration Tool
run: go install github.com/c9s/rockhopper/cmd/rockhopper@v1.2.1
@ -72,6 +79,12 @@ jobs:
go test -race -coverprofile coverage_dnum.txt -covermode atomic -tags dnum ./pkg/...
sed -i -e '/_requestgen.go/d' coverage_dnum.txt
- name: Revive Check
uses: morphy2k/revive-action@v2
with:
reporter: github-pr-review
fail_on_error: true
- name: Upload Coverage Report
uses: codecov/codecov-action@v3
with:

22
.github/workflows/golang-lint.yml vendored Normal file
View File

@ -0,0 +1,22 @@
name: golang-lint
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
permissions:
contents: read
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v3
with:
go-version: 1.18
- uses: actions/checkout@v3
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: v1.46.2

7
.golangci.yml Normal file
View File

@ -0,0 +1,7 @@
run:
issues-exit-code: 0
tests: false
linters:
disable-all: true
enable:
- gofmt

5
.markdownlint.yaml Normal file
View File

@ -0,0 +1,5 @@
default: true
extends: null
MD033: false
MD010: false
MD013: false

14
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,14 @@
---
repos:
# Secret Detection
- repo: https://github.com/Yelp/detect-secrets
rev: v1.2.0
hooks:
- id: detect-secrets
args: ['--exclude-secrets', '3899a918953e01bfe218116cdfeccbed579e26275c4a89abcbc70d2cb9e9bbb8']
exclude: pacakge.lock.json
# Markdown
- repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.31.1
hooks:
- id: markdownlint

View File

@ -5,6 +5,8 @@ A trading bot framework written in Go. The name bbgo comes from the BB8 bot in t
## Current Status
[![Go](https://github.com/c9s/bbgo/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/c9s/bbgo/actions/workflows/go.yml)
[![GoDoc](https://godoc.org/github.com/c9s/bbgo?status.svg)](https://pkg.go.dev/github.com/c9s/bbgo)
[![Go Report Card](https://goreportcard.com/badge/github.com/c9s/bbgo)](https://goreportcard.com/report/github.com/c9s/bbgo)
[![DockerHub](https://img.shields.io/docker/pulls/yoanlin/bbgo.svg)](https://hub.docker.com/r/yoanlin/bbgo)
[![Coverage Status](http://codecov.io/github/c9s/bbgo/coverage.svg?branch=main)](http://codecov.io/github/c9s/bbgo?branch=main)
<img alt="open collective badge" src="https://opencollective.com/bbgo/tiers/badge.svg">
@ -42,7 +44,38 @@ You can use BBGO's underlying common exchange API, currently it supports 4+ majo
- Built-in parameter optimization tool.
- Built-in Grid strategy and many other built-in strategies.
- Multi-exchange session support: you can connect to more than 2 exchanges with different accounts or subaccounts.
- Standard indicators, e.g., SMA, EMA, BOLL, VMA, MACD...
- Indicators with interface similar to `pandas.Series`([series](https://github.com/c9s/bbgo/blob/main/doc/development/series.md))([usage](https://github.com/c9s/bbgo/blob/main/doc/development/indicator.md)):
- [Accumulation/Distribution Indicator](./pkg/indicator/ad.go)
- [Arnaud Legoux Moving Average](./pkg/indicator/alma.go)
- [Average True Range](./pkg/indicator/atr.go)
- [Bollinger Bands](./pkg/indicator/boll.go)
- [Commodity Channel Index](./pkg/indicator/cci.go)
- [Cumulative Moving Average](./pkg/indicator/cma.go)
- [Double Exponential Moving Average](./pkg/indicator/dema.go)
- [Directional Movement Index](./pkg/indicator/dmi.go)
- [Brownian Motion's Drift Factor](./pkg/indicator/drift.go)
- [Ease of Movement](./pkg/indicator/emv.go)
- [Exponentially Weighted Moving Average](./pkg/indicator/ewma.go)
- [Hull Moving Average](./pkg/indicator/hull.go)
- [Trend Line (Tool)](./pkg/indicator/line.go)
- [Moving Average Convergence Divergence Indicator](./pkg/indicator/macd.go)
- [On-Balance Volume](./pkg/indicator/obv.go)
- [Pivot](./pkg/indicator/pivot.go)
- [Running Moving Average](./pkg/indicator/rma.go)
- [Relative Strength Index](./pkg/indicator/rsi.go)
- [Simple Moving Average](./pkg/indicator/sma.go)
- [Ehler's Super Smoother Filter](./pkg/indicator/ssf.go)
- [Stochastic Oscillator](./pkg/indicator/stoch.go)
- [SuperTrend](./pkg/indicator/supertrend.go)
- [Triple Exponential Moving Average](./pkg/indicator/tema.go)
- [Tillson T3 Moving Average](./pkg/indicator/till.go)
- [Triangular Moving Average](./pkg/indicator/tma.go)
- [Variable Index Dynamic Average](./pkg/indicator/vidya.go)
- [Volatility Indicator](./pkg/indicator/volatility.go)
- [Volume Weighted Average Price](./pkg/indicator/vwap.go)
- [Zero Lag Exponential Moving Average](./pkg/indicator/zlema.go)
- And more...
- HeikinAshi OHLC / Normal OHLC (check [this config](https://github.com/c9s/bbgo/blob/main/config/skeleton.yaml#L5))
- React-powered Web Dashboard.
- Docker image ready.
- Kubernetes support.
@ -63,8 +96,8 @@ You can use BBGO's underlying common exchange API, currently it supports 4+ majo
- Kucoin Spot Exchange
- MAX Spot Exchange (located in Taiwan)
## Documentation and General Topics
- Check the [documentation index](doc/README.md)
## BBGO Tokenomics
@ -105,6 +138,7 @@ bash <(curl -s https://raw.githubusercontent.com/c9s/bbgo/main/scripts/setup-bol
```
If you already have configuration somewhere, a download-only script might be suitable for you:
```sh
bash <(curl -s https://raw.githubusercontent.com/c9s/bbgo/main/scripts/download.sh)
```
@ -114,7 +148,7 @@ Or refer to the [Release Page](https://github.com/c9s/bbgo/releases) and downloa
Since v2, we've added new float point implementation from dnum to support decimals with higher precision.
To download & setup, please refer to [Dnum Installation](doc/topics/dnum-binary.md)
### One-click Linode StackScript:
### One-click Linode StackScript
- BBGO Grid Trading on Binance <https://cloud.linode.com/stackscripts/950715>
- BBGO USDT/TWD Grid Trading on MAX <https://cloud.linode.com/stackscripts/793380>
@ -165,14 +199,12 @@ Prepare your dotenv file `.env.local` and BBGO yaml config file `bbgo.yaml`.
To check the available environment variables, please see [Environment Variables](./doc/configuration/envvars.md)
The minimal bbgo.yaml could be generated by:
```sh
curl -o bbgo.yaml https://raw.githubusercontent.com/c9s/bbgo/main/config/minimal.yaml
```
To run strategy:
```sh
@ -185,14 +217,12 @@ To start bbgo with the frontend dashboard:
bbgo run --enable-webserver
```
If you want to switch to other dotenv file, you can add an `--dotenv` option or `--config`:
```sh
bbgo sync --dotenv .env.dev --config config/grid.yaml --session binance
```
To query transfer history:
```sh
@ -207,13 +237,13 @@ bbgo pnl --exchange binance --asset BTC --since "2019-01-01"
```
--->
## Advanced Configuration
### Testnet (Paper Trading)
Currently only supports binance testnet.
To run bbgo in testnet, apply new API keys from [Binance Test Network](https://testnet.binance.vision), and set the following env before you start bbgo:
```bash
export PAPER_TRADE=1
export DISABLE_MARKET_CACHE=1 # the symbols supported in testnet is far less than the mainnet

View File

@ -102,7 +102,7 @@ func main() {
return
}
if err := trader.LoadState() ; err != nil {
if err := trader.LoadState(); err != nil {
log.WithError(err).Error("failed to load strategy states")
return
}

View File

@ -110,7 +110,7 @@ func main() {
return
}
if err := trader.LoadState() ; err != nil {
if err := trader.LoadState(); err != nil {
log.WithError(err).Error("failed to load strategy states")
return
}
@ -123,7 +123,7 @@ func main() {
}
// find a free port for binding the server
ln, err := net.Listen("tcp", "127.0.0.1:" + strconv.Itoa(portNum))
ln, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(portNum))
if err != nil {
log.WithError(err).Error("can not bind listener")
return

View File

@ -1,12 +1,12 @@
package main
import (
"fmt"
"github.com/c9s/bbgo/pkg/cmd"
"github.com/spf13/cobra/doc"
"log"
"path"
"runtime"
"fmt"
"log"
)
func main() {

View File

@ -39,4 +39,3 @@ var accountsCmd = &cobra.Command{
return nil
},
}

View File

@ -32,7 +32,6 @@ func init() {
ordersCmd.AddCommand(historyOrdersCmd)
}
// go run ./examples/kucoin orders
var ordersCmd = &cobra.Command{
Use: "orders",
@ -73,7 +72,6 @@ var ordersCmd = &cobra.Command{
},
}
// go run ./examples/kucoin orders history
var historyOrdersCmd = &cobra.Command{
Use: "history [--symbol SYMBOL]",
@ -105,7 +103,6 @@ var historyOrdersCmd = &cobra.Command{
},
}
// usage:
// go run ./examples/kucoin orders place --symbol LTC-USDT --price 50 --size 1 --order-type limit --side buy
var placeOrderCmd = &cobra.Command{
@ -124,14 +121,12 @@ var placeOrderCmd = &cobra.Command{
req.OrderType(kucoinapi.OrderType(orderType))
side, err := cmd.Flags().GetString("side")
if err != nil {
return err
}
req.Side(kucoinapi.SideType(side))
symbol, err := cmd.Flags().GetString("symbol")
if err != nil {
return err
@ -155,7 +150,6 @@ var placeOrderCmd = &cobra.Command{
}
size, err := cmd.Flags().GetString("size")
if err != nil {
return err
@ -172,8 +166,6 @@ var placeOrderCmd = &cobra.Command{
},
}
// usage:
var cancelOrderCmd = &cobra.Command{
Use: "cancel",

View File

@ -25,4 +25,3 @@ var symbolsCmd = &cobra.Command{
return nil
},
}

View File

@ -36,7 +36,6 @@ var tickersCmd = &cobra.Command{
logrus.Infof("ticker: %+v", ticker)
tickerStats, err := client.MarketDataService.GetTicker24HStat(args[0])
if err != nil {
return err
@ -46,4 +45,3 @@ var tickersCmd = &cobra.Command{
return nil
},
}

View File

@ -86,7 +86,7 @@ var websocketCmd = &cobra.Command{
},
*/
{
Id: id+2,
Id: id + 2,
Type: "subscribe",
Topic: "/market/candles:ETH-USDT_1min",
PrivateChannel: false,
@ -131,7 +131,6 @@ var websocketCmd = &cobra.Command{
logrus.WithError(err).Error("websocket ping error", err)
}
case <-interrupt:
logrus.Infof("interrupt")

View File

@ -69,7 +69,6 @@ var rootCmd = &cobra.Command{
log.Infof("%+v", account)
log.Infof("ASSET BALANCES:")
assetBalances, err := client.AssetBalances()
if err != nil {

View File

@ -30,6 +30,7 @@ var klineMatchingLogger *logrus.Entry = nil
// FeeToken is used to simulate the exchange platform fee token
// This is to ease the back-testing environment for closing positions.
const FeeToken = "FEE"
var useFeeToken = true
func init() {

View File

@ -34,7 +34,6 @@ func TestStateRecorder(t *testing.T) {
assert.NoError(t, err)
assert.Len(t, recorder.writers, 1)
st.Position.AddTrade(types.Trade{
OrderID: 1,
Exchange: types.ExchangeBinance,

View File

@ -596,7 +596,7 @@ func (environ *Environment) syncWithUserConfig(ctx context.Context, userConfig *
syncSymbolMap, restSymbols := categorizeSyncSymbol(userConfig.Sync.Symbols)
for _, session := range sessions {
syncSymbols := restSymbols
if ss, ok := syncSymbolMap[session.Name] ; ok {
if ss, ok := syncSymbolMap[session.Name]; ok {
syncSymbols = append(syncSymbols, ss...)
}
@ -931,6 +931,7 @@ func (environ *Environment) setupInteraction(persistence service.PersistenceServ
Strict: authStrict,
Mode: authMode,
Token: authToken, // can be empty string here
// pragma: allowlist nextline secret
OneTimePasswordKey: key, // can be nil here
})
return nil

View File

@ -69,4 +69,3 @@ func (m *Notifiability) NotifyTo(channel string, obj interface{}, args ...interf
n.NotifyTo(channel, obj, args...)
}
}

View File

@ -1,2 +1 @@
package bbgo

View File

@ -100,4 +100,3 @@ func newTypeValueInterface(typ reflect.Type) interface{} {
dst := reflect.New(typ)
return dst.Interface()
}

View File

@ -1,4 +1,4 @@
// Code generated by "callbackgen -type StrategyController strategy_controller.go"; DO NOT EDIT.
// Code generated by "callbackgen -type StrategyController -interface"; DO NOT EDIT.
package bbgo
@ -33,3 +33,11 @@ func (s *StrategyController) EmitEmergencyStop() {
cb()
}
}
type StrategyControllerEventHub interface {
OnSuspend(cb func())
OnResume(cb func())
OnEmergencyStop(cb func())
}

View File

@ -1,2 +1 @@
package bbgo

View File

@ -1,2 +1 @@
package cmdutil

View File

@ -35,6 +35,7 @@ func New() *RestClient {
}
func (c *RestClient) Auth(apiKey string) {
// pragma: allowlist nextline secret
c.apiKey = apiKey
}

View File

@ -35,6 +35,7 @@ func NewRestClient() *RestClient {
}
func (c *RestClient) Auth(apiKey string) {
// pragma: allowlist nextline secret
c.apiKey = apiKey
}

View File

@ -3,6 +3,7 @@ package depth
import (
"fmt"
"sync"
"sync/atomic"
"time"
log "github.com/sirupsen/logrus"
@ -40,7 +41,7 @@ type Buffer struct {
updateTimeout time.Duration
// bufferingPeriod is used to buffer the update message before we get the full depth
bufferingPeriod time.Duration
bufferingPeriod atomic.Value
}
func NewBuffer(fetcher SnapshotFetcher) *Buffer {
@ -55,7 +56,7 @@ func (b *Buffer) SetUpdateTimeout(d time.Duration) {
}
func (b *Buffer) SetBufferingPeriod(d time.Duration) {
b.bufferingPeriod = d
b.bufferingPeriod.Store(d)
}
func (b *Buffer) resetSnapshot() {
@ -185,8 +186,8 @@ func (b *Buffer) fetchAndPush() error {
func (b *Buffer) tryFetch() {
for {
if b.bufferingPeriod > 0 {
<-time.After(b.bufferingPeriod)
if period := b.bufferingPeriod.Load(); period != nil {
<-time.After(period.(time.Duration))
}
err := b.fetchAndPush()

View File

@ -1,2 +1 @@
package batch

View File

@ -60,6 +60,7 @@ func NewClient(baseURL string) *RestClient {
func (c *RestClient) Auth(key, secret string) {
c.Key = key
// pragma: allowlist nextline secret
c.Secret = secret
}

View File

@ -84,7 +84,6 @@ func TestClient_NewSpotRebateHistoryRequest(t *testing.T) {
t.Logf("spot rebate history: %+v", history)
}
func TestClient_NewGetMarginInterestRateHistoryRequest(t *testing.T) {
client := getTestClientOrSkip(t)
ctx := context.Background()
@ -121,7 +120,7 @@ func TestClient_privateCall(t *testing.T) {
resp, err := client.SendRequest(req)
if assert.NoError(t, err) {
var feeStructs []struct{
var feeStructs []struct {
Symbol string `json:"symbol"`
MakerCommission string `json:"makerCommission"`
TakerCommission string `json:"takerCommission"`
@ -131,7 +130,7 @@ func TestClient_privateCall(t *testing.T) {
assert.NotEmpty(t, feeStructs)
}
} else {
dump, _ := httputil.DumpRequest(req, true);
dump, _ := httputil.DumpRequest(req, true)
log.Printf("request: %s", dump)
}
}

View File

@ -123,6 +123,7 @@ func New(key, secret string) *Exchange {
return &Exchange{
key: key,
// pragma: allowlist nextline secret
secret: secret,
client: client,
futuresClient: futuresClient,

View File

@ -119,4 +119,3 @@ func Test_toLocalOrderTypeWithMarket(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, ftxapi.OrderTypeMarket, orderType)
}

View File

@ -90,6 +90,7 @@ func NewExchange(key, secret string, subAccount string) *Exchange {
client: client,
restEndpoint: u,
key: key,
// pragma: allowlist nextline secret
secret: secret,
subAccount: subAccount,
}

View File

@ -66,7 +66,6 @@ func (c *RestClient) NewGetPositionsRequest() *GetPositionsRequest {
}
}
type Balance struct {
Coin string `json:"coin"`
Free fixedpoint.Value `json:"free"`

View File

@ -68,6 +68,7 @@ func NewClient() *RestClient {
func (c *RestClient) Auth(key, secret, subAccount string) {
c.Key = key
// pragma: allowlist nextline secret
c.Secret = secret
c.subAccount = subAccount
}
@ -200,5 +201,3 @@ func castPayload(payload interface{}) ([]byte, error) {
return nil, nil
}

View File

@ -37,7 +37,7 @@ func TestClient_Requests(t *testing.T) {
return
}
ctx, cancel := context.WithTimeout(context.TODO(), 15 * time.Second)
ctx, cancel := context.WithTimeout(context.TODO(), 15*time.Second)
defer cancel()
client := NewClient()
@ -46,12 +46,12 @@ func TestClient_Requests(t *testing.T) {
testCases := []struct {
name string
tt func(t *testing.T)
} {
}{
{
name: "GetMarketsRequest",
tt: func(t *testing.T) {
req := client.NewGetMarketsRequest()
markets ,err := req.Do(ctx)
markets, err := req.Do(ctx)
assert.NoError(t, err)
assert.NotNil(t, markets)
t.Logf("markets: %+v", markets)
@ -61,7 +61,7 @@ func TestClient_Requests(t *testing.T) {
name: "GetAccountRequest",
tt: func(t *testing.T) {
req := client.NewGetAccountRequest()
account ,err := req.Do(ctx)
account, err := req.Do(ctx)
assert.NoError(t, err)
assert.NotNil(t, account)
t.Logf("account: %+v", account)
@ -78,7 +78,7 @@ func TestClient_Requests(t *testing.T) {
Side(SideBuy).
Market("LTC/USDT")
createdOrder,err := req.Do(ctx)
createdOrder, err := req.Do(ctx)
if assert.NoError(t, err) {
assert.NotNil(t, createdOrder)
t.Logf("createdOrder: %+v", createdOrder)

View File

@ -33,6 +33,7 @@ type Market struct {
SizeIncrement fixedpoint.Value `json:"sizeIncrement"`
Restricted bool `json:"restricted"`
}
//go:generate GetRequest -url "api/markets" -type GetMarketsRequest -responseDataType []Market
type GetMarketsRequest struct {
client requestgen.APIClient

View File

@ -1,3 +1,4 @@
//go:build ignore
// +build ignore
package main

View File

@ -92,6 +92,7 @@ func newRestRequest(c *http.Client, baseURL *url.URL) *restRequest {
func (r *restRequest) Auth(key, secret string) *restRequest {
r.key = key
// pragma: allowlist nextline secret
r.secret = secret
return r
}

View File

@ -5,8 +5,8 @@ import (
"strings"
"time"
"github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
)
// ex: 2019-03-05T09:56:55.728933+00:00

View File

@ -42,4 +42,3 @@ func (r *walletRequest) DepositHistory(ctx context.Context, since time.Time, unt
return d, nil
}

View File

@ -39,6 +39,7 @@ func NewStream(key, secret string, subAccount string, e *Exchange) *Stream {
s := &Stream{
exchange: e,
key: key,
// pragma: allowlist nextline secret
secret: secret,
subAccount: subAccount,
StandardStream: &types.StandardStream{},

View File

@ -1,5 +1,6 @@
// Code generated by go generate; DO NOT EDIT.
package ftx
var symbolMap = map[string]string{
"1INCH-0325": "1INCH-0325",
"1INCH-PERP": "1INCH-PERP",

View File

@ -182,6 +182,7 @@ func Test_insertAt(t *testing.T) {
func Test_newLoginRequest(t *testing.T) {
// From API doc: https://docs.ftx.com/?javascript#authentication-2
r := newLoginRequest("", "Y2QTHI23f23f23jfjas23f23To0RfUwX3H42fvN-", time.Unix(0, 1557246346499*int64(time.Millisecond)), "")
// pragma: allowlist nextline secret
expectedSignature := "d10b5a67a1a941ae9463a60b285ae845cdeac1b11edc7da9977bef0228b96de9"
assert.Equal(t, expectedSignature, r.Login.Signature)
jsonStr, err := json.Marshal(r)

View File

@ -245,4 +245,3 @@ func toGlobalTrade(fill kucoinapi.Fill) types.Trade {
}
return trade
}

View File

@ -45,6 +45,7 @@ func New(key, secret, passphrase string) *Exchange {
return &Exchange{
key: key,
// pragma: allowlist nextline secret
secret: secret,
passphrase: passphrase,
client: client,

View File

@ -53,7 +53,7 @@ func main() {
defer resp.Body.Close()
r := &ApiResponse{}
if err := json.NewDecoder(resp.Body).Decode(r) ; err != nil {
if err := json.NewDecoder(resp.Body).Decode(r); err != nil {
log.Fatal(err)
}

View File

@ -61,7 +61,6 @@ type GetPublicBulletRequest struct {
client requestgen.APIClient
}
//go:generate requestgen -type GetPrivateBulletRequest -method "POST" -url "/api/v1/bullet-private" -responseType .APIResponse -responseDataField Data -responseDataType .Bullet
type GetPrivateBulletRequest struct {
client requestgen.AuthenticatedAPIClient

View File

@ -58,6 +58,7 @@ func NewClient() *RestClient {
func (c *RestClient) Auth(key, secret, passphrase string) {
c.Key = key
// pragma: allowlist nextline secret
c.Secret = secret
c.Passphrase = passphrase
}

View File

@ -9,9 +9,9 @@ import (
"github.com/c9s/bbgo/pkg/depth"
"github.com/c9s/bbgo/pkg/exchange/kucoin/kucoinapi"
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/util"
"github.com/c9s/bbgo/pkg/fixedpoint"
)
const readTimeout = 30 * time.Second

View File

@ -49,6 +49,7 @@ func New(key, secret string) *Exchange {
return &Exchange{
client: client,
key: key,
// pragma: allowlist nextline secret
secret: secret,
v3order: &v3.OrderService{Client: client},
v3margin: &v3.MarginService{Client: client},

View File

@ -110,4 +110,3 @@ func TestAccountService_NewGetDepositHistoryRequest(t *testing.T) {
assert.NotEmpty(t, deposits)
t.Logf("deposits: %+v", deposits)
}

View File

@ -22,5 +22,3 @@ func integrationTestConfigured(t *testing.T, prefix string) (key, secret string,
}
return key, secret, ok
}

View File

@ -130,7 +130,9 @@ func NewRestClient(baseURL string) *RestClient {
// Auth sets api key and secret for usage is requests that requires authentication.
func (c *RestClient) Auth(key string, secret string) *RestClient {
// pragma: allowlist nextline secret
c.APIKey = key
// pragma: allowlist nextline secret
c.APISecret = secret
return c
}

View File

@ -158,4 +158,3 @@ type MarginRepayRequest struct {
currency string `param:"currency,slug,required"`
amount string `param:"amount"`
}

View File

@ -28,4 +28,3 @@ type WebsocketCommand struct {
Action string `json:"action"`
Subscriptions []Subscription `json:"subscriptions,omitempty"`
}

View File

@ -44,6 +44,7 @@ func NewStream(key, secret string) *Stream {
stream := &Stream{
StandardStream: types.NewStandardStream(),
key: key,
// pragma: allowlist nextline secret
secret: secret,
}
stream.SetEndpointCreator(stream.getEndpoint)
@ -116,7 +117,9 @@ func (s *Stream) handleConnect() {
nonce := time.Now().UnixNano() / int64(time.Millisecond)
auth := &max.AuthMessage{
// pragma: allowlist nextline secret
Action: "auth",
// pragma: allowlist nextline secret
APIKey: s.key,
Nonce: nonce,
Signature: signPayload(fmt.Sprintf("%d", nonce), s.secret),

View File

@ -31,7 +31,6 @@ func TestExchange_QueryTickers_SomeSymbols(t *testing.T) {
return
}
e := New(key, secret)
got, err := e.QueryTickers(context.Background(), "BTCUSDT", "ETHUSDT")
if assert.NoError(t, err) {

View File

@ -39,6 +39,7 @@ func New(key, secret, passphrase string) *Exchange {
return &Exchange{
key: key,
// pragma: allowlist nextline secret
secret: secret,
passphrase: passphrase,
client: client,
@ -275,7 +276,7 @@ func (e *Exchange) NewStream() types.Stream {
}
func (e *Exchange) QueryKLines(ctx context.Context, symbol string, interval types.Interval, options types.KLineQueryOptions) ([]types.KLine, error) {
if err := marketDataLimiter.Wait(ctx) ; err != nil {
if err := marketDataLimiter.Wait(ctx); err != nil {
return nil, err
}

View File

@ -1,3 +1,4 @@
//go:build ignore
// +build ignore
package main

View File

@ -91,6 +91,7 @@ func NewClient() *RestClient {
func (c *RestClient) Auth(key, secret, passphrase string) {
c.Key = key
// pragma: allowlist nextline secret
c.Secret = secret
c.Passphrase = passphrase
}

View File

@ -514,4 +514,3 @@ var spotSymbolMap = map[string]string{
"ZRXUSDT": "ZRX-USDT",
"ZYROUSDT": "ZYRO-USDT",
}

View File

@ -349,11 +349,11 @@ func NewFromString(input string) (Value, error) {
}
}
if hasDecimal {
after := input[dotIndex+1 : len(input)]
after := input[dotIndex+1:]
if decimalCount >= 8 {
after = after[0:8] + "." + after[8:len(after)]
after = after[0:8] + "." + after[8:]
} else {
after = after[0:decimalCount] + strings.Repeat("0", 8-decimalCount) + after[decimalCount:len(after)]
after = after[0:decimalCount] + strings.Repeat("0", 8-decimalCount) + after[decimalCount:]
}
input = input[0:dotIndex] + after
v, err := strconv.ParseFloat(input, 64)
@ -368,7 +368,7 @@ func NewFromString(input string) (Value, error) {
return Value(int64(math.Trunc(v))), nil
} else if hasScientificNotion {
exp, err := strconv.ParseInt(input[scIndex+1:len(input)], 10, 32)
exp, err := strconv.ParseInt(input[scIndex+1:], 10, 32)
if err != nil {
return 0, err
}

View File

@ -282,7 +282,7 @@ func (dn Value) FormatString(prec int) string {
// decimal within
dec := nd + e
decimals := digits[dec:min(dec+prec, nd)]
return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec - len(decimals)))
return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec-len(decimals)))
} else if 0 < dn.exp && dn.exp <= digitsMax {
// decimal to the right
if prec > 0 {
@ -403,7 +403,7 @@ func (dn Value) FormatPercentage(prec int) string {
// decimal within
dec := nd + e
decimals := digits[dec:min(dec+prec, nd)]
return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec - len(decimals))) + "%"
return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec-len(decimals))) + "%"
} else if 0 < exp && exp <= digitsMax {
// decimal to the right
if prec > 0 {

View File

@ -1,10 +1,10 @@
package fixedpoint
import (
"encoding/json"
"github.com/stretchr/testify/assert"
"math/big"
"testing"
"github.com/stretchr/testify/assert"
"encoding/json"
)
const Delta = 1e-9
@ -167,7 +167,6 @@ func TestJson(t *testing.T) {
assert.Equal(t, "0.00000000", p.FormatString(8))
assert.Equal(t, "0.00000000", string(e))
_ = json.Unmarshal([]byte("0.00153917575"), &p)
assert.Equal(t, "0.00153917", p.FormatString(8))

View File

@ -2,8 +2,8 @@ package indicator
import (
"encoding/json"
"testing"
"fmt"
"testing"
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
@ -51,7 +51,11 @@ func Test_DMI(t *testing.T) {
return klines
}
type output struct{dip float64; dim float64; adx float64}
type output struct {
dip float64
dim float64
adx float64
}
tests := []struct {
name string

View File

@ -37,6 +37,7 @@ type AuthInteract struct {
func (it *AuthInteract) Commands(interact *Interact) {
if it.Strict {
// generate a one-time-use otp
// pragma: allowlist nextline secret
if it.OneTimePasswordKey == nil {
opts := totp.GenerateOpts{
Issuer: "interact",
@ -48,7 +49,7 @@ func (it *AuthInteract) Commands(interact *Interact) {
if err != nil {
panic(err)
}
// pragma: allowlist nextline secret
it.OneTimePasswordKey = key
}
interact.Command("/auth", "authorize", func(reply Reply, session Session) error {

View File

@ -14,7 +14,7 @@ func TestGetMigrationsMap(t *testing.T) {
func TestMergeMigrationsMap(t *testing.T) {
MergeMigrationsMap(map[int64]*rockhopper.Migration{
2: &rockhopper.Migration{},
3: &rockhopper.Migration{},
2: {},
3: {},
})
}

View File

@ -14,7 +14,7 @@ func TestGetMigrationsMap(t *testing.T) {
func TestMergeMigrationsMap(t *testing.T) {
MergeMigrationsMap(map[int64]*rockhopper.Migration{
2: &rockhopper.Migration{},
3: &rockhopper.Migration{},
2: {},
3: {},
})
}

View File

@ -17,11 +17,15 @@ func collectSessionEnvVars(sessions map[string]*bbgo.ExchangeSession) (envVars m
}
if len(session.EnvVarPrefix) > 0 {
// pragma: allowlist nextline secret
envVars[session.EnvVarPrefix+"_API_KEY"] = session.Key
// pragma: allowlist nextline secret
envVars[session.EnvVarPrefix+"_API_SECRET"] = session.Secret
} else if len(session.Name) > 0 {
sn := strings.ToUpper(session.Name)
// pragma: allowlist nextline secret
envVars[sn+"_API_KEY"] = session.Key
// pragma: allowlist nextline secret
envVars[sn+"_API_SECRET"] = session.Secret
} else {
err = fmt.Errorf("session %s name or env var prefix is not defined", session.Name)

View File

@ -76,4 +76,3 @@ func (store JsonStore) Save(val interface{}) error {
p := filepath.Join(store.Directory, store.ID) + ".json"
return ioutil.WriteFile(p, data, 0666)
}

View File

@ -19,6 +19,7 @@ func NewRedisPersistenceService(config *RedisPersistenceConfig) *RedisPersistenc
client := redis.NewClient(&redis.Options{
Addr: net.JoinHostPort(config.Host, config.Port),
// Username: "", // username is only for redis 6.0
// pragma: allowlist nextline secret
Password: config.Password, // no password set
DB: config.DB, // use default DB
})

View File

@ -93,8 +93,6 @@ func (s *RewardService) Sync(ctx context.Context, exchange types.Exchange) error
return <-errC
}
type CurrencyPositionMap map[string]fixedpoint.Value
func (s *RewardService) AggregateUnspentCurrencyPosition(ctx context.Context, ex types.ExchangeName, since time.Time) (CurrencyPositionMap, error) {

View File

@ -74,7 +74,6 @@ func TestRewardService_InsertAndQueryUnspent(t *testing.T) {
assert.Equal(t, types.RewardCommission, rewards[0].Type)
}
func TestRewardService_AggregateUnspentCurrencyPosition(t *testing.T) {
db, err := prepareDB(t)
if err != nil {
@ -126,7 +125,7 @@ func TestRewardService_AggregateUnspentCurrencyPosition(t *testing.T) {
})
assert.NoError(t, err)
currencyPositions, err := service.AggregateUnspentCurrencyPosition(ctx, types.ExchangeMax, now.Add(-10 * time.Second))
currencyPositions, err := service.AggregateUnspentCurrencyPosition(ctx, types.ExchangeMax, now.Add(-10*time.Second))
assert.NoError(t, err)
assert.NotEmpty(t, currencyPositions)
assert.Len(t, currencyPositions, 2)

View File

@ -7,8 +7,8 @@ import (
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
"github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
)
func TestWithdrawService(t *testing.T) {

View File

@ -154,7 +154,7 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
// s.pvDivergence.OnUpdate(func(corr float64) {
// //fmt.Printf("now we've got corr: %f\n", corr)
// })
windowSize := 360/s.Interval.Minutes()
windowSize := 360 / s.Interval.Minutes()
if windowSize == 0 {
windowSize = 3
}

View File

@ -340,7 +340,6 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
log.WithError(err).Errorf("can not place order")
}
if err := s.activeAdjustmentOrders.GracefulCancel(ctx, s.session.Exchange); err != nil {
log.WithError(err).Errorf("graceful cancel order error")
}

View File

@ -125,7 +125,7 @@ func Test_formatPrice(t *testing.T) {
binanceFormatRE := regexp.MustCompile("^([0-9]{1,20})(.[0-9]{1,20})?$")
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := formatPrice(tt.args.price, tt.args.tickSize);
got := formatPrice(tt.args.price, tt.args.tickSize)
if got != tt.want {
t.Errorf("formatPrice() = %v, want %v", got, tt.want)
}
@ -135,7 +135,6 @@ func Test_formatPrice(t *testing.T) {
}
}
func Test_formatQuantity(t *testing.T) {
type args struct {
quantity fixedpoint.Value
@ -183,7 +182,7 @@ func Test_formatQuantity(t *testing.T) {
binanceFormatRE := regexp.MustCompile("^([0-9]{1,20})(.[0-9]{1,20})?$")
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := formatQuantity(tt.args.quantity, tt.args.tickSize);
got := formatQuantity(tt.args.quantity, tt.args.tickSize)
if got != tt.want {
t.Errorf("formatQuantity() = %v, want %v", got, tt.want)
}

View File

@ -227,7 +227,6 @@ func NewProfitStats(market Market) *ProfitStats {
}
}
func (s *ProfitStats) Init(market Market) {
s.Symbol = market.Symbol
s.BaseCurrency = market.BaseCurrency

View File

@ -8,14 +8,14 @@ import (
)
func TestSortTradesAscending(t *testing.T) {
var trades = []Trade {
var trades = []Trade{
{
ID: 1,
Symbol: "BTCUSDT",
Side: SideTypeBuy,
IsBuyer: false,
IsMaker: false,
Time: Time(time.Unix(2000, 0 )),
Time: Time(time.Unix(2000, 0)),
},
{
ID: 2,
@ -23,9 +23,9 @@ func TestSortTradesAscending(t *testing.T) {
Side: SideTypeBuy,
IsBuyer: false,
IsMaker: false,
Time: Time(time.Unix(1000, 0 )),
Time: Time(time.Unix(1000, 0)),
},
}
trades = SortTradesAscending(trades)
assert.True(t ,trades[0].Time.Before(trades[1].Time.Time()))
assert.True(t, trades[0].Time.Before(trades[1].Time.Time()))
}

View File

@ -1,2 +1 @@
package util

View File

@ -1,3 +1,4 @@
//go:build !release
// +build !release
package version
@ -5,4 +6,3 @@ package version
const Version = "v1.35.0-daaa3352-dev"
const VersionGitRef = "daaa3352"

View File

@ -1,3 +1,4 @@
//go:build release
// +build release
package version
@ -5,4 +6,3 @@ package version
const Version = "v1.35.0-daaa3352"
const VersionGitRef = "daaa3352"