Merge pull request #945 from narumiruna/feature/marketcap/coinmarketcap

FEATURE: marketcap: get marketcap values from coinmarketcap
This commit is contained in:
Yo-An Lin 2022-09-14 10:58:08 +08:00 committed by GitHub
commit a3034546f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 14 deletions

View File

@ -13,6 +13,11 @@ exchangeStrategies:
targetCurrencies: targetCurrencies:
- BTC - BTC
- ETH - ETH
# - BNB
# - ADA
# - SOL
# - DOT
# - DOGE
- MATIC - MATIC
threshold: 2% threshold: 2%
# max amount to buy or sell per order # max amount to buy or sell per order

View File

@ -1,6 +1,10 @@
package coinmarketcap package coinmarketcap
import v1 "github.com/c9s/bbgo/pkg/datasource/coinmarketcap/v1" import (
"context"
v1 "github.com/c9s/bbgo/pkg/datasource/coinmarketcap/v1"
)
type DataSource struct { type DataSource struct {
client *v1.RestClient client *v1.RestClient
@ -11,3 +15,22 @@ func New(apiKey string) *DataSource {
client.Auth(apiKey) client.Auth(apiKey)
return &DataSource{client: client} return &DataSource{client: client}
} }
func (d *DataSource) QueryMarketCapInUSD(ctx context.Context, limit int) (map[string]float64, error) {
req := v1.ListingsLatestRequest{
Client: d.client,
Limit: &limit,
}
resp, err := req.Do(ctx)
if err != nil {
return nil, err
}
marketcaps := make(map[string]float64)
for _, data := range resp {
marketcaps[data.Symbol] = data.Quote["USD"].MarketCap
}
return marketcaps, nil
}

View File

@ -8,7 +8,7 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/c9s/bbgo/pkg/bbgo" "github.com/c9s/bbgo/pkg/bbgo"
"github.com/c9s/bbgo/pkg/datasource/glassnode" "github.com/c9s/bbgo/pkg/datasource/coinmarketcap"
"github.com/c9s/bbgo/pkg/datatype/floats" "github.com/c9s/bbgo/pkg/datatype/floats"
"github.com/c9s/bbgo/pkg/fixedpoint" "github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/types"
@ -23,15 +23,13 @@ func init() {
} }
type Strategy struct { type Strategy struct {
Notifiability *bbgo.Notifiability datasource *coinmarketcap.DataSource
glassnode *glassnode.DataSource
Interval types.Interval `json:"interval"` Interval types.Interval `json:"interval"`
BaseCurrency string `json:"baseCurrency"` BaseCurrency string `json:"baseCurrency"`
BaseWeight fixedpoint.Value `json:"baseWeight"` BaseWeight fixedpoint.Value `json:"baseWeight"`
TargetCurrencies []string `json:"targetCurrencies"` TargetCurrencies []string `json:"targetCurrencies"`
Threshold fixedpoint.Value `json:"threshold"` Threshold fixedpoint.Value `json:"threshold"`
Verbose bool `json:"verbose"`
DryRun bool `json:"dryRun"` DryRun bool `json:"dryRun"`
// max amount to buy or sell per order // max amount to buy or sell per order
MaxAmount fixedpoint.Value `json:"maxAmount"` MaxAmount fixedpoint.Value `json:"maxAmount"`
@ -40,8 +38,8 @@ type Strategy struct {
} }
func (s *Strategy) Initialize() error { func (s *Strategy) Initialize() error {
apiKey := os.Getenv("GLASSNODE_API_KEY") apiKey := os.Getenv("COINMARKETCAP_API_KEY")
s.glassnode = glassnode.New(apiKey) s.datasource = coinmarketcap.New(apiKey)
return nil return nil
} }
@ -177,14 +175,15 @@ func (s *Strategy) generateSubmitOrders(ctx context.Context, session *bbgo.Excha
func (s *Strategy) getTargetWeights(ctx context.Context) types.ValueMap { func (s *Strategy) getTargetWeights(ctx context.Context) types.ValueMap {
m := floats.Map{} m := floats.Map{}
// get market cap values // get marketcap from coinmarketcap
for _, currency := range s.TargetCurrencies { // set higher query limit to avoid target currency not in the list
marketCap, err := s.glassnode.QueryMarketCapInUSD(ctx, currency) marketcaps, err := s.datasource.QueryMarketCapInUSD(ctx, 100)
if err != nil { if err != nil {
log.WithError(err).Error("failed to query market cap") log.WithError(err).Error("failed to query market cap")
return nil
} }
m[currency] = marketCap
for _, currency := range s.TargetCurrencies {
m[currency] = marketcaps[currency]
} }
// normalize // normalize