Bitstamp: Fix currency pair handling (#762)

* Fix Bitstamp pair handling

* Fix spelling

* Populate namerinos

* Address nitterinos

* Revert trade currency code, introduces races between engine / this and rely on OB test instead

* One liner
This commit is contained in:
Adrian Gallagher
2021-08-26 11:40:14 +10:00
committed by GitHub
parent 9bb4348613
commit 056a809d93
7 changed files with 1047 additions and 124 deletions

View File

@@ -1,4 +1,5 @@
//+build mock_test_off
//go:build mock_test_off
// +build mock_test_off
// This will build if build tag mock_test_off is parsed and will do live testing
// using all tests in (exchange)_test.go

View File

@@ -1,4 +1,5 @@
//+build !mock_test_off
//go:build !mock_test_off
// +build !mock_test_off
// This will build if build tag mock_test_off is not parsed and will try to mock
// all tests in _test.go

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,7 @@
package bitstamp
import "errors"
// Transaction types
const (
Deposit = iota
@@ -14,6 +16,8 @@ const (
SellOrder
)
var errWSPairParsingError = errors.New("unable to parse currency pair from wsResponse.Channel")
// Ticker holds ticker information
type Ticker struct {
Last float64 `json:"last,string"`

View File

@@ -88,8 +88,24 @@ func (b *Bitstamp) wsHandleData(respRaw []byte) error {
if err != nil {
return err
}
currencyPair := strings.Split(wsResponse.Channel, currency.UnderscoreDelimiter)
p, err := currency.NewPairFromString(strings.ToUpper(currencyPair[2]))
var currencyPair string
splitter := strings.Split(wsResponse.Channel, currency.UnderscoreDelimiter)
if len(splitter) == 3 {
currencyPair = splitter[2]
} else {
return errWSPairParsingError
}
pFmt, err := b.GetPairFormat(asset.Spot, true)
if err != nil {
return err
}
enabledPairs, err := b.GetEnabledPairs(asset.Spot)
if err != nil {
return err
}
p, err := currency.NewPairFromFormattedPairs(currencyPair, enabledPairs, pFmt)
if err != nil {
return err
}
@@ -107,8 +123,25 @@ func (b *Bitstamp) wsHandleData(respRaw []byte) error {
if err != nil {
return err
}
currencyPair := strings.Split(wsResponse.Channel, currency.UnderscoreDelimiter)
p, err := currency.NewPairFromString(strings.ToUpper(currencyPair[2]))
var currencyPair string
splitter := strings.Split(wsResponse.Channel, currency.UnderscoreDelimiter)
if len(splitter) == 3 {
currencyPair = splitter[2]
} else {
return errWSPairParsingError
}
pFmt, err := b.GetPairFormat(asset.Spot, true)
if err != nil {
return err
}
enabledPairs, err := b.GetEnabledPairs(asset.Spot)
if err != nil {
return err
}
p, err := currency.NewPairFromFormattedPairs(currencyPair, enabledPairs, pFmt)
if err != nil {
return err
}
@@ -151,8 +184,12 @@ func (b *Bitstamp) generateDefaultSubscriptions() ([]stream.ChannelSubscription,
var subscriptions []stream.ChannelSubscription
for i := range channels {
for j := range enabledCurrencies {
p, err := b.FormatExchangeCurrency(enabledCurrencies[j], asset.Spot)
if err != nil {
return nil, err
}
subscriptions = append(subscriptions, stream.ChannelSubscription{
Channel: channels[i] + enabledCurrencies[j].Lower().String(),
Channel: channels[i] + p.String(),
Asset: asset.Spot,
})
}
@@ -256,7 +293,11 @@ func (b *Bitstamp) seedOrderBook() error {
}
for x := range p {
orderbookSeed, err := b.GetOrderbook(p[x].String())
pairFmt, err := b.FormatExchangeCurrency(p[x], asset.Spot)
if err != nil {
return err
}
orderbookSeed, err := b.GetOrderbook(pairFmt.String())
if err != nil {
return err
}

View File

@@ -56,8 +56,11 @@ func (b *Bitstamp) SetDefaults() {
b.API.CredentialsValidator.RequiresKey = true
b.API.CredentialsValidator.RequiresSecret = true
b.API.CredentialsValidator.RequiresClientID = true
requestFmt := &currency.PairFormat{Uppercase: true}
configFmt := &currency.PairFormat{Uppercase: true}
requestFmt := &currency.PairFormat{}
configFmt := &currency.PairFormat{
Uppercase: true,
Delimiter: currency.ForwardSlashDelimiter,
}
err := b.SetGlobalPairsManager(requestFmt, configFmt, asset.Spot)
if err != nil {
log.Errorln(log.ExchangeSys, err)
@@ -204,11 +207,61 @@ func (b *Bitstamp) Run() {
b.PrintEnabledPairs()
}
if !b.GetEnabledFeatures().AutoPairUpdates {
forceUpdate := false
format, err := b.GetPairFormat(asset.Spot, false)
if err != nil {
log.Errorf(log.ExchangeSys, "%s failed to get pair format. Err %s\n",
b.Name,
err)
return
}
err := b.UpdateTradablePairs(false)
enabled, err := b.CurrencyPairs.GetPairs(asset.Spot, true)
if err != nil {
log.Errorf(log.ExchangeSys, "%s failed to get enabled currencies. Err %s\n",
b.Name,
err)
return
}
avail, err := b.CurrencyPairs.GetPairs(asset.Spot, false)
if err != nil {
log.Errorf(log.ExchangeSys, "%s failed to get available currencies. Err %s\n",
b.Name,
err)
return
}
if !common.StringDataContains(enabled.Strings(), format.Delimiter) ||
!common.StringDataContains(avail.Strings(), format.Delimiter) {
var enabledPairs currency.Pairs
enabledPairs, err = currency.NewPairsFromStrings([]string{
currency.BTC.String() + format.Delimiter + currency.USD.String(),
})
if err != nil {
log.Errorf(log.ExchangeSys, "%s failed to update currencies. Err %s\n",
b.Name,
err)
} else {
log.Warn(log.ExchangeSys,
"Bitstamp: Enabled and available pairs reset due to config upgrade, please enable the ones you would like to use again")
forceUpdate = true
err = b.UpdatePairs(enabledPairs, asset.Spot, true, true)
if err != nil {
log.Errorf(log.ExchangeSys,
"%s failed to update currencies. Err: %s\n",
b.Name,
err)
}
}
}
if !b.GetEnabledFeatures().AutoPairUpdates && !forceUpdate {
return
}
err = b.UpdateTradablePairs(forceUpdate)
if err != nil {
log.Errorf(log.ExchangeSys,
"%s failed to update tradable pairs. Err: %s",
@@ -229,9 +282,7 @@ func (b *Bitstamp) FetchTradablePairs(asset asset.Item) ([]string, error) {
if pairs[x].Trading != "Enabled" {
continue
}
pair := strings.Split(pairs[x].Name, "/")
products = append(products, pair[0]+pair[1])
products = append(products, pairs[x].Name)
}
return products, nil
@@ -672,9 +723,16 @@ func (b *Bitstamp) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
"%s GetActiveOrders unable to parse time: %s\n", b.Name, err)
}
pair, err := currency.NewPairFromString(resp[i].Currency)
if err != nil {
return nil, err
var p currency.Pair
if currPair == "all" {
// Currency pairs are returned as format "currency_pair": "BTC/USD"
// only when all is specified
p, err = currency.NewPairFromString(resp[i].Currency)
if err != nil {
return nil, err
}
} else {
p = req.Pairs[0]
}
orders = append(orders, order.Detail{
@@ -684,7 +742,7 @@ func (b *Bitstamp) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
Type: order.Limit,
Side: orderSide,
Date: tm,
Pair: pair,
Pair: p,
Exchange: b.Name,
})
}

File diff suppressed because it is too large Load Diff