stream/websocket: Consolidate fields by using exchange config pointer (#809)

* stream: add exchange config pointer to setup WebsocketSetup struct to reduce and consolidate setting of variables.

* config: reduce stutter

* config: reduce minor stutter

* glorious: nits addr.

* Update exchanges/stream/websocket.go

Co-authored-by: Scott <gloriousCode@users.noreply.github.com>

* websocket: implement fix

* engine/helpers: fix test

* exchanges: fix after merge issues

* exchange_template: fix output

Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
This commit is contained in:
Ryan O'Hara-Reid
2021-10-20 15:45:06 +11:00
committed by GitHub
parent a70224d123
commit 099ffa1a60
53 changed files with 611 additions and 692 deletions

View File

@@ -51,7 +51,7 @@ func TestMain(m *testing.M) {
func newBotWithExchange() *engine.Engine {
bot := &engine.Engine{
Config: &gctconfig.Config{
Exchanges: []gctconfig.ExchangeConfig{
Exchanges: []gctconfig.Exchange{
{
Name: testExchange,
Enabled: true,

View File

@@ -30,10 +30,10 @@ func main() {
wg.Wait()
log.Println("Done.")
var cfgs []config.ExchangeConfig
var cfgs []config.Exchange
exchanges := engine.Bot.GetExchanges()
for x := range exchanges {
var cfg *config.ExchangeConfig
var cfg *config.Exchange
cfg, err = exchanges[x].GetDefaultConfig()
if err != nil {
log.Printf("Failed to get exchanges default config. Err: %s", err)

View File

@@ -93,7 +93,7 @@ func main() {
exchangeDirectory := filepath.Join(targetPath, exch.Name)
configTestFile := config.GetConfig()
var newConfig *config.ExchangeConfig
var newConfig *config.Exchange
newConfig, err = makeExchange(exchangeDirectory, configTestFile, &exch)
if err != nil {
log.Fatal(err)
@@ -122,7 +122,7 @@ func checkExchangeName(exchName string) error {
return nil
}
func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch *exchange) (*config.ExchangeConfig, error) {
func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch *exchange) (*config.Exchange, error) {
err := configTestFile.LoadConfig(exchangeConfigPath, true)
if err != nil {
return nil, err
@@ -147,7 +147,7 @@ func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch
exch.CapitalName = strings.Title(exch.Name)
exch.Variable = exch.Name[0:2]
newExchConfig := &config.ExchangeConfig{}
newExchConfig := &config.Exchange{}
newExchConfig.Name = exch.CapitalName
newExchConfig.Enabled = true
newExchConfig.API.Credentials.Key = "Key"
@@ -229,7 +229,7 @@ func makeExchange(exchangeDirectory string, configTestFile *config.Config, exch
return newExchConfig, nil
}
func saveConfig(exchangeDirectory string, configTestFile *config.Config, newExchConfig *config.ExchangeConfig) error {
func saveConfig(exchangeDirectory string, configTestFile *config.Config, newExchConfig *config.Exchange) error {
cmd := exec.Command("go", "fmt")
cmd.Dir = exchangeDirectory
out, err := cmd.Output()

View File

@@ -3,6 +3,7 @@ package {{.Name}}
import (
"sync"
"context"
"time"
"github.com/thrasher-corp/gocryptotrader/common"
@@ -11,6 +12,7 @@ import (
exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
"github.com/thrasher-corp/gocryptotrader/exchanges/account"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/deposit"
"github.com/thrasher-corp/gocryptotrader/exchanges/kline"
"github.com/thrasher-corp/gocryptotrader/exchanges/order"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
@@ -24,9 +26,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.ExchangeConfig, error) {
func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.Exchange, error) {
{{.Variable}}.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = {{.Variable}}.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = {{.Variable}}.BaseCurrencies
@@ -34,7 +36,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetDefaultConfig() (*config.ExchangeConfi
{{.Variable}}.SetupDefaults(exchCfg)
if {{.Variable}}.Features.Supports.RESTCapabilities.AutoPairUpdates {
err := {{.Variable}}.UpdateTradablePairs(true)
err := {{.Variable}}.UpdateTradablePairs(context.TODO(), true)
if err != nil {
return nil, err
}
@@ -126,7 +128,7 @@ func ({{.Variable}} *{{.CapitalName}}) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error {
func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.Exchange) error {
if !exch.Enabled {
{{.Variable}}.SetEnabled(false)
return nil
@@ -144,17 +146,13 @@ func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error
err = {{.Variable}}.Websocket.Setup(
&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: {{.Name}}WSAPIURL,
ExchangeName: exch.Name,
RunningURL: wsRunningEndpoint,
Connector: {{.Variable}}.WsConnect,
Subscriber: {{.Variable}}.Subscribe,
UnSubscriber: {{.Variable}}.Unsubscribe,
Features: &{{.Variable}}.Features.Supports.WebsocketCapabilities,
ExchangeConfig: exch,
DefaultURL: {{.Name}}WSAPIURL,
RunningURL: wsRunningEndpoint,
Connector: {{.Variable}}.WsConnect,
Subscriber: {{.Variable}}.Subscribe,
UnSubscriber: {{.Variable}}.Unsubscribe,
Features: &{{.Variable}}.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err
@@ -168,15 +166,6 @@ func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error
ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout,
ResponseMaxLimit: exch.WebsocketResponseMaxLimit,
}
// NOTE: PLEASE ENSURE YOU SET THE ORDERBOOK BUFFER SETTINGS CORRECTLY
{{.Variable}}.Websocket.Orderbook.Setup(
exch.OrderbookConfig.WebsocketBufferLimit,
true,
true,
false,
false,
exch.Name)
*/
return nil
}
@@ -204,7 +193,7 @@ func ({{.Variable}} *{{.CapitalName}}) Run() {
return
}
err := {{.Variable}}.UpdateTradablePairs(false)
err := {{.Variable}}.UpdateTradablePairs(context.TODO(), false)
if err != nil {
log.Errorf(log.ExchangeSys,
"%s failed to update tradable pairs. Err: %s",
@@ -222,7 +211,7 @@ func ({{.Variable}} *{{.CapitalName}}) FetchTradablePairs(ctx context.Context, a
// UpdateTradablePairs updates the exchanges available pairs and stores
// them in the exchanges config
func ({{.Variable}} *{{.CapitalName}}) UpdateTradablePairs(ctx context.Context, forceUpdate bool) error {
pairs, err := {{.Variable}}.FetchTradablePairs(asset.Spot)
pairs, err := {{.Variable}}.FetchTradablePairs(ctx, asset.Spot)
if err != nil {
return err
}
@@ -263,7 +252,7 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateTicker(ctx context.Context, p curre
}
// UpdateTickers updates all currency pairs of a given asset type
func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(assetType asset.Item) error {
func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(ctx context.Context, assetType asset.Item) error {
// NOTE: EXAMPLE FOR GETTING TICKER PRICE
/*
tick, err := {{.Variable}}.GetTickers()
@@ -301,25 +290,25 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateTickers(assetType asset.Item) error
func ({{.Variable}} *{{.CapitalName}}) FetchTicker(ctx context.Context, p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker({{.Variable}}.Name, p, assetType)
if err != nil {
return {{.Variable}}.UpdateTicker(p, assetType)
return {{.Variable}}.UpdateTicker(ctx, p, assetType)
}
return tickerNew, nil
}
// FetchOrderbook returns orderbook base on the currency pair
func ({{.Variable}} *{{.CapitalName}}) FetchOrderbook(ctx context.Context, c currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get({{.Variable}}.Name, currency, assetType)
func ({{.Variable}} *{{.CapitalName}}) FetchOrderbook(ctx context.Context, pair currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get({{.Variable}}.Name, pair, assetType)
if err != nil {
return {{.Variable}}.UpdateOrderbook(currency, assetType)
return {{.Variable}}.UpdateOrderbook(ctx, pair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, pair currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
book := &orderbook.Base{
Exchange: {{.Variable}}.Name,
Pair: p,
Pair: pair,
Asset: assetType,
VerifyOrderbook: {{.Variable}}.CanVerifyOrderbook,
}
@@ -351,7 +340,7 @@ func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(ctx context.Context, p cu
return book, err
}
return orderbook.Get({{.Variable}}.Name, p, assetType)
return orderbook.Get({{.Variable}}.Name, pair, assetType)
}
// UpdateAccountInfo retrieves balances for all enabled currencies
@@ -381,7 +370,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetRecentTrades(ctx context.Context, p cu
}
// GetHistoricTrades returns historic trade data within the timeframe provided
func ({{.Variable}} *{{.CapitalName}}) GetHistoricTrades (p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) {
func ({{.Variable}} *{{.CapitalName}}) GetHistoricTrades (ctx context.Context, p currency.Pair, assetType asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) {
return nil, common.ErrNotYetImplemented
}
@@ -396,11 +385,11 @@ func ({{.Variable}} *{{.CapitalName}}) SubmitOrder(ctx context.Context, s *order
// ModifyOrder will allow of changing orderbook placement and limit to
// market conversion
func ({{.Variable}} *{{.CapitalName}}) ModifyOrder(action *order.Modify) (string, error) {
func ({{.Variable}} *{{.CapitalName}}) ModifyOrder(ctx context.Context, action *order.Modify) (order.Modify, error) {
// if err := action.Validate(); err != nil {
// return "", err
// }
return "", common.ErrNotYetImplemented
return order.Modify{}, common.ErrNotYetImplemented
}
// CancelOrder cancels an order by its corresponding ID number
@@ -430,8 +419,8 @@ func ({{.Variable}} *{{.CapitalName}}) GetOrderInfo(ctx context.Context, orderID
}
// GetDepositAddress returns a deposit address for a specified currency
func ({{.Variable}} *{{.CapitalName}}) GetDepositAddress(ctx context.Context, c currency.Code, accountID string) (string, error) {
return "", common.ErrNotYetImplemented
func ({{.Variable}} *{{.CapitalName}}) GetDepositAddress(ctx context.Context, c currency.Code, accountID string, chain string) (*deposit.Address, error) {
return nil, common.ErrNotYetImplemented
}
// WithdrawCryptocurrencyFunds returns a withdrawal ID when a withdrawal is
@@ -485,7 +474,7 @@ func ({{.Variable}} *{{.CapitalName}}) GetFeeByType(ctx context.Context, feeBuil
// ValidateCredentials validates current credentials used for wrapper
func ({{.Variable}} *{{.CapitalName}}) ValidateCredentials(ctx context.Context, assetType asset.Item) error {
_, err := {{.Variable}}.UpdateAccountInfo(assetType)
_, err := {{.Variable}}.UpdateAccountInfo(ctx, assetType)
return {{.Variable}}.CheckTransientError(err)
}

View File

@@ -734,7 +734,7 @@ func (c *Config) GetCurrencyPairDisplayConfig() *CurrencyPairFormatConfig {
}
// GetAllExchangeConfigs returns all exchange configurations
func (c *Config) GetAllExchangeConfigs() []ExchangeConfig {
func (c *Config) GetAllExchangeConfigs() []Exchange {
m.Lock()
configs := c.Exchanges
m.Unlock()
@@ -742,7 +742,7 @@ func (c *Config) GetAllExchangeConfigs() []ExchangeConfig {
}
// GetExchangeConfig returns exchange configurations by its indivdual name
func (c *Config) GetExchangeConfig(name string) (*ExchangeConfig, error) {
func (c *Config) GetExchangeConfig(name string) (*Exchange, error) {
m.Lock()
defer m.Unlock()
for i := range c.Exchanges {
@@ -786,7 +786,7 @@ func (c *Config) GetPrimaryForexProvider() string {
}
// UpdateExchangeConfig updates exchange configurations
func (c *Config) UpdateExchangeConfig(e *ExchangeConfig) error {
func (c *Config) UpdateExchangeConfig(e *Exchange) error {
m.Lock()
defer m.Unlock()
for i := range c.Exchanges {
@@ -1015,20 +1015,20 @@ func (c *Config) CheckExchangeConfigValues() error {
defaultWebsocketTrafficTimeout)
c.Exchanges[i].WebsocketTrafficTimeout = defaultWebsocketTrafficTimeout
}
if c.Exchanges[i].OrderbookConfig.WebsocketBufferLimit <= 0 {
if c.Exchanges[i].Orderbook.WebsocketBufferLimit <= 0 {
log.Warnf(log.ConfigMgr,
"Exchange %s Websocket orderbook buffer limit value not set, defaulting to %v.",
c.Exchanges[i].Name,
defaultWebsocketOrderbookBufferLimit)
c.Exchanges[i].OrderbookConfig.WebsocketBufferLimit = defaultWebsocketOrderbookBufferLimit
c.Exchanges[i].Orderbook.WebsocketBufferLimit = defaultWebsocketOrderbookBufferLimit
}
if c.Exchanges[i].OrderbookConfig.PublishPeriod == nil || c.Exchanges[i].OrderbookConfig.PublishPeriod.Nanoseconds() < 0 {
if c.Exchanges[i].Orderbook.PublishPeriod == nil || c.Exchanges[i].Orderbook.PublishPeriod.Nanoseconds() < 0 {
log.Warnf(log.ConfigMgr,
"Exchange %s Websocket orderbook publish period value not set, defaulting to %v.",
c.Exchanges[i].Name,
DefaultOrderbookPublishPeriod)
publishPeriod := DefaultOrderbookPublishPeriod
c.Exchanges[i].OrderbookConfig.PublishPeriod = &publishPeriod
c.Exchanges[i].Orderbook.PublishPeriod = &publishPeriod
}
err := c.CheckPairConsistency(c.Exchanges[i].Name)
if err != nil {

View File

@@ -79,7 +79,7 @@ func TestGetExchangeBankAccounts(t *testing.T) {
t.Parallel()
cfg := &Config{
Exchanges: []ExchangeConfig{{
Exchanges: []Exchange{{
Name: bfx,
Enabled: true,
BankAccounts: []banking.Account{
@@ -140,7 +140,7 @@ func TestCheckBankAccountConfig(t *testing.T) {
func TestUpdateExchangeBankAccounts(t *testing.T) {
t.Parallel()
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Name: bfx,
Enabled: true,
@@ -273,7 +273,7 @@ func TestCheckClientBankAccounts(t *testing.T) {
func TestPurgeExchangeCredentials(t *testing.T) {
t.Parallel()
var c Config
c.Exchanges = []ExchangeConfig{
c.Exchanges = []Exchange{
{
Name: testString,
API: APIConfig{
@@ -483,7 +483,7 @@ func TestGetExchangeAssetTypes(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
CurrencyPairs: &currency.PairsManager{
Pairs: map[asset.Item]*currency.PairStore{
@@ -520,7 +520,7 @@ func TestSupportsExchangeAssetType(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
CurrencyPairs: &currency.PairsManager{
Pairs: map[asset.Item]*currency.PairStore{
@@ -566,7 +566,7 @@ func TestSetPairs(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
},
)
@@ -602,7 +602,7 @@ func TestGetCurrencyPairConfig(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
},
)
@@ -654,7 +654,7 @@ func TestCheckPairConfigFormats(t *testing.T) {
}
// Test nil pair store
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
},
)
@@ -754,7 +754,7 @@ func TestCheckPairConsistency(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
},
)
@@ -903,7 +903,7 @@ func TestSupportsPair(t *testing.T) {
t.Parallel()
fmt := &currency.PairFormat{}
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Name: bfx,
Enabled: true,
@@ -945,7 +945,7 @@ func TestGetPairFormat(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
},
)
@@ -1043,7 +1043,7 @@ func TestGetAvailablePairs(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
CurrencyPairs: &currency.PairsManager{},
},
@@ -1086,7 +1086,7 @@ func TestGetEnabledPairs(t *testing.T) {
}
c.Exchanges = append(c.Exchanges,
ExchangeConfig{
Exchange{
Name: testFakeExchangeName,
CurrencyPairs: &currency.PairsManager{},
},
@@ -1126,7 +1126,7 @@ func TestGetEnabledPairs(t *testing.T) {
func TestGetEnabledExchanges(t *testing.T) {
t.Parallel()
cfg := &Config{Exchanges: []ExchangeConfig{
cfg := &Config{Exchanges: []Exchange{
{
Name: bfx,
Enabled: true,
@@ -1143,7 +1143,7 @@ func TestGetEnabledExchanges(t *testing.T) {
func TestGetDisabledExchanges(t *testing.T) {
t.Parallel()
cfg := &Config{Exchanges: []ExchangeConfig{
cfg := &Config{Exchanges: []Exchange{
{
Name: bfx,
Enabled: true,
@@ -1180,7 +1180,7 @@ func TestGetDisabledExchanges(t *testing.T) {
func TestCountEnabledExchanges(t *testing.T) {
t.Parallel()
cfg := &Config{Exchanges: []ExchangeConfig{
cfg := &Config{Exchanges: []Exchange{
{
Enabled: true,
},
@@ -1212,7 +1212,7 @@ func TestGetCurrencyPairDisplayConfig(t *testing.T) {
func TestGetAllExchangeConfigs(t *testing.T) {
t.Parallel()
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{},
},
}
@@ -1224,7 +1224,7 @@ func TestGetAllExchangeConfigs(t *testing.T) {
func TestGetExchangeConfig(t *testing.T) {
t.Parallel()
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Name: bfx,
},
@@ -1312,14 +1312,14 @@ func TestUpdateExchangeConfig(t *testing.T) {
t.Parallel()
ok := "OKEX"
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Name: ok,
API: APIConfig{Credentials: APICredentialsConfig{}},
},
},
}
e := &ExchangeConfig{}
e := &Exchange{}
err := cfg.UpdateExchangeConfig(e)
if err == nil {
t.Error("Expected error from non-existent exchange")
@@ -1525,7 +1525,7 @@ func TestCheckExchangeConfigValues(t *testing.T) {
// Test websocket and HTTP timeout values
cfg.Exchanges[0].WebsocketResponseMaxLimit = 0
cfg.Exchanges[0].WebsocketResponseCheckTimeout = 0
cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit = 0
cfg.Exchanges[0].Orderbook.WebsocketBufferLimit = 0
cfg.Exchanges[0].WebsocketTrafficTimeout = 0
cfg.Exchanges[0].HTTPTimeout = 0
err = cfg.CheckExchangeConfigValues()
@@ -1537,7 +1537,7 @@ func TestCheckExchangeConfigValues(t *testing.T) {
t.Errorf("expected exchange %s to have updated WebsocketResponseMaxLimit value",
cfg.Exchanges[0].Name)
}
if cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit == 0 {
if cfg.Exchanges[0].Orderbook.WebsocketBufferLimit == 0 {
t.Errorf("expected exchange %s to have updated WebsocketOrderbookBufferLimit value",
cfg.Exchanges[0].Name)
}
@@ -1705,7 +1705,7 @@ func TestRetrieveConfigCurrencyPairs(t *testing.T) {
cp1 := currency.NewPair(currency.DOGE, currency.XRP)
cp2 := currency.NewPair(currency.DOGE, currency.USD)
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Enabled: true,
BaseCurrencies: currency.Currencies{
@@ -1911,7 +1911,7 @@ func TestCheckConfig(t *testing.T) {
cp1 := currency.NewPair(currency.DOGE, currency.XRP)
cp2 := currency.NewPair(currency.DOGE, currency.USD)
cfg := &Config{
Exchanges: []ExchangeConfig{
Exchanges: []Exchange{
{
Name: testFakeExchangeName,
Enabled: true,
@@ -2187,7 +2187,7 @@ func TestRemoveExchange(t *testing.T) {
t.Parallel()
var c Config
const testExchangeName = "0xBAAAAAAD"
c.Exchanges = append(c.Exchanges, ExchangeConfig{
c.Exchanges = append(c.Exchanges, Exchange{
Name: testExchangeName,
})
_, err := c.GetExchangeConfig(testExchangeName)

View File

@@ -90,7 +90,7 @@ type Config struct {
Communications base.CommunicationsConfig `json:"communications"`
RemoteControl RemoteControlConfig `json:"remoteControl"`
Portfolio portfolio.Base `json:"portfolioAddresses"`
Exchanges []ExchangeConfig `json:"exchanges"`
Exchanges []Exchange `json:"exchanges"`
BankAccounts []banking.Account `json:"bankAccounts"`
// Deprecated config settings, will be removed at a future date
@@ -128,8 +128,8 @@ type ConnectionMonitorConfig struct {
CheckInterval time.Duration `json:"checkInterval"`
}
// ExchangeConfig holds all the information needed for each enabled Exchange.
type ExchangeConfig struct {
// Exchange holds all the information needed for each enabled Exchange.
type Exchange struct {
Name string `json:"name"`
Enabled bool `json:"enabled"`
Verbose bool `json:"verbose"`
@@ -146,7 +146,7 @@ type ExchangeConfig struct {
API APIConfig `json:"api"`
Features *FeaturesConfig `json:"features"`
BankAccounts []banking.Account `json:"bankAccounts,omitempty"`
OrderbookConfig `json:"orderbook"`
Orderbook Orderbook `json:"orderbook"`
// Deprecated settings which will be removed in a future update
AvailablePairs *currency.Pairs `json:"availablePairs,omitempty"`
@@ -332,8 +332,8 @@ type APIConfig struct {
Endpoints map[string]string `json:"urlEndpoints"`
}
// OrderbookConfig stores the orderbook configuration variables
type OrderbookConfig struct {
// Orderbook stores the orderbook configuration variables
type Orderbook struct {
VerificationBypass bool `json:"verificationBypass"`
WebsocketBufferLimit int `json:"websocketBufferLimit"`
WebsocketBufferEnabled bool `json:"websocketBufferEnabled"`

View File

@@ -1095,7 +1095,7 @@ Add websocket functionality if supported to Setup:
```go
// Setup takes in the supplied exchange configuration details and sets params
func (f *FTX) Setup(exch *config.ExchangeConfig) error {
func (f *FTX) Setup(exch *config.Exchange) error {
if !exch.Enabled {
f.SetEnabled(false)
return nil
@@ -1108,23 +1108,27 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error {
// Websocket details setup below
err = f.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: ftxWSURL, // Default ws endpoint so we can roll back via CLI if needed.
ExchangeName: exch.Name, // Sets websocket name to the exchange name.
RunningURL: exch.API.Endpoints.WebsocketURL,
Connector: f.WsConnect, // Connector function outlined above.
Subscriber: f.Subscribe, // Subscriber function outlined above.
UnSubscriber: f.Unsubscribe, // Unsubscriber function outlined above.
GenerateSubscriptions: f.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above.
Features: &f.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below.
ExchangeConfig: exch,
// DefaultURL defines the default endpoint in the event a rollback is
// needed via gctcli.
DefaultURL: ftxWSURL,
RunningURL: exch.API.Endpoints.WebsocketURL,
// Connector function outlined above.
Connector: f.WsConnect,
// Subscriber function outlined above.
Subscriber: f.Subscribe,
// Unsubscriber function outlined above.
UnSubscriber: f.Unsubscribe,
// GenerateDefaultSubscriptions function outlined above.
GenerateSubscriptions: f.GenerateDefaultSubscriptions,
// Defines the capabilities of the websocket outlined in supported
// features struct. This allows the websocket connection to be flushed
// appropriately if we have a pair/asset enable/disable change. This is
// outlined below.
Features: &f.Features.Supports.WebsocketCapabilities,
// Orderbook buffer specific variables for processing orderbook updates via websocket feed.
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
// Other orderbook buffer vars:
// BufferEnabled bool
// Orderbook buffer specific variables for processing orderbook updates
// via websocket feed:
// SortBuffer bool
// SortBufferByUpdateIDs bool
// UpdateEntriesByID bool

View File

@@ -926,7 +926,7 @@ func (bot *Engine) SetupExchanges() error {
continue
}
wg.Add(1)
go func(c config.ExchangeConfig) {
go func(c config.Exchange) {
defer wg.Done()
err := bot.LoadExchange(c.Name, &wg)
if err != nil {

View File

@@ -215,7 +215,7 @@ func TestUnloadExchange(t *testing.T) {
exch.SetEnabled(true)
em.Add(exch)
e := &Engine{ExchangeManager: em,
Config: &config.Config{Exchanges: []config.ExchangeConfig{{Name: testExchange}}},
Config: &config.Config{Exchanges: []config.Exchange{{Name: testExchange}}},
}
err = e.UnloadExchange("asdf")
if !errors.Is(err, config.ErrExchangeNotFound) {
@@ -240,7 +240,7 @@ func TestDryRunParamInteraction(t *testing.T) {
ExchangeManager: SetupExchangeManager(),
Settings: Settings{},
Config: &config.Config{
Exchanges: []config.ExchangeConfig{
Exchanges: []config.Exchange{
{
Name: testExchange,
WebsocketTrafficTimeout: time.Second,

View File

@@ -60,7 +60,7 @@ func CreateTestBot(t *testing.T) *Engine {
}
bot := &Engine{
ExchangeManager: SetupExchangeManager(),
Config: &config.Config{Exchanges: []config.ExchangeConfig{
Config: &config.Config{Exchanges: []config.Exchange{
{
Name: testExchange,
Enabled: true,
@@ -368,7 +368,7 @@ func TestGetSpecificAvailablePairs(t *testing.T) {
},
}
e.Config = &config.Config{
Exchanges: []config.ExchangeConfig{
Exchanges: []config.Exchange{
{
Enabled: true,
Name: testExchange,
@@ -714,7 +714,7 @@ func TestGetExchangeNamesByCurrency(t *testing.T) {
e := CreateTestBot(t)
bf := "Bitflyer"
e.Config.Exchanges = append(e.Config.Exchanges, config.ExchangeConfig{
e.Config.Exchanges = append(e.Config.Exchanges, config.Exchange{
Enabled: true,
Name: bf,
CurrencyPairs: &currency.PairsManager{Pairs: map[asset.Item]*currency.PairStore{
@@ -1063,7 +1063,7 @@ func createDepositEngine(opts *fakeDepositExchangeOpts) *Engine {
return &Engine{
Settings: Settings{Verbose: true},
Config: &config.Config{
Exchanges: []config.ExchangeConfig{
Exchanges: []config.Exchange{
{
Name: "fake",
Enabled: true,

View File

@@ -807,7 +807,7 @@ func TestProcessOrders(t *testing.T) {
},
},
}
exch.GetBase().Config = &config.ExchangeConfig{
exch.GetBase().Config = &config.Exchange{
CurrencyPairs: &currency.PairsManager{
UseGlobalFormat: true,
RequestFormat: &currency.PairFormat{

View File

@@ -849,7 +849,7 @@ func TestSetExchangeTradeProcessing(t *testing.T) {
}
exch.SetDefaults()
b := exch.GetBase()
b.Config = &config.ExchangeConfig{
b.Config = &config.Exchange{
Features: &config.FeaturesConfig{Enabled: config.FeaturesEnabledConfig{SaveTradeData: false}},
}
em.Add(exch)

View File

@@ -23,7 +23,7 @@ import (
)
// GetDefaultConfig returns a default exchange config for Alphapoint
func (a *Alphapoint) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (a *Alphapoint) GetDefaultConfig() (*config.Exchange, error) {
return nil, common.ErrFunctionNotSupported
}

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Binance) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Binance) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -207,7 +207,7 @@ func (b *Binance) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Binance) Setup(exch *config.ExchangeConfig) error {
func (b *Binance) Setup(exch *config.Exchange) error {
if !exch.Enabled {
return nil
}
@@ -221,23 +221,16 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error {
return err
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: binanceDefaultWebsocketURL,
ExchangeName: exch.Name,
RunningURL: ePoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
SortBufferByUpdateIDs: true,
ExchangeConfig: exch,
DefaultURL: binanceDefaultWebsocketURL,
RunningURL: ePoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Unsubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
SortBufferByUpdateIDs: true,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Bitfinex) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bitfinex) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -183,7 +183,7 @@ func (b *Bitfinex) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error {
func (b *Bitfinex) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -199,22 +199,15 @@ func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error {
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: publicBitfinexWebsocketEndpoint,
ExchangeName: exch.Name,
RunningURL: wsEndpoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
UpdateEntriesByID: true,
ExchangeConfig: exch,
DefaultURL: publicBitfinexWebsocketEndpoint,
RunningURL: wsEndpoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Unsubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
UpdateEntriesByID: true,
})
if err != nil {
return err

View File

@@ -27,9 +27,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Bitflyer) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bitflyer) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -107,7 +107,7 @@ func (b *Bitflyer) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Bitflyer) Setup(exch *config.ExchangeConfig) error {
func (b *Bitflyer) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil

View File

@@ -36,9 +36,9 @@ const wsRateLimitMillisecond = 1000
var errNotEnoughPairs = errors.New("at least one currency is required to fetch order history")
// GetDefaultConfig returns a default exchange config
func (b *Bithumb) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bithumb) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -147,7 +147,7 @@ func (b *Bithumb) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Bithumb) Setup(exch *config.ExchangeConfig) error {
func (b *Bithumb) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -167,20 +167,13 @@ func (b *Bithumb) Setup(exch *config.ExchangeConfig) error {
return err
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: wsEndpoint,
ExchangeName: exch.Name,
RunningURL: ePoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
GenerateSubscriptions: b.GenerateSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: wsEndpoint,
RunningURL: ePoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
GenerateSubscriptions: b.GenerateSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Bitmex) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bitmex) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -142,7 +142,7 @@ func (b *Bitmex) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Bitmex) Setup(exch *config.ExchangeConfig) error {
func (b *Bitmex) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -159,21 +159,15 @@ func (b *Bitmex) Setup(exch *config.ExchangeConfig) error {
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: bitmexWSURL,
ExchangeName: exch.Name,
RunningURL: wsEndpoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
UpdateEntriesByID: true,
ExchangeConfig: exch,
DefaultURL: bitmexWSURL,
RunningURL: wsEndpoint,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Unsubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
UpdateEntriesByID: true,
})
if err != nil {
return err

View File

@@ -28,9 +28,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Bitstamp) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bitstamp) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -146,7 +146,7 @@ func (b *Bitstamp) SetDefaults() {
}
// Setup sets configuration values to bitstamp
func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error {
func (b *Bitstamp) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -163,21 +163,14 @@ func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error {
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: bitstampWSURL,
ExchangeName: exch.Name,
RunningURL: wsURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe,
GenerateSubscriptions: b.generateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: bitstampWSURL,
RunningURL: wsURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Unsubscriber: b.Unsubscribe,
GenerateSubscriptions: b.generateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -29,9 +29,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *Bittrex) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *Bittrex) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -141,7 +141,7 @@ func (b *Bittrex) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *Bittrex) Setup(exch *config.ExchangeConfig) error {
func (b *Bittrex) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -159,27 +159,20 @@ func (b *Bittrex) Setup(exch *config.ExchangeConfig) error {
// Websocket details setup below
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: bittrexAPIWSURL, // Default ws endpoint so we can roll back via CLI if needed.
ExchangeName: exch.Name, // Sets websocket name to the exchange name.
RunningURL: wsRunningEndpoint,
Connector: b.WsConnect, // Connector function outlined above.
Subscriber: b.Subscribe, // Subscriber function outlined above.
UnSubscriber: b.Unsubscribe, // Unsubscriber function outlined above.
GenerateSubscriptions: b.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above.
Features: &b.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below.
ExchangeConfig: exch,
DefaultURL: bittrexAPIWSURL, // Default ws endpoint so we can roll back via CLI if needed.
RunningURL: wsRunningEndpoint,
Connector: b.WsConnect, // Connector function outlined above.
Subscriber: b.Subscribe, // Subscriber function outlined above.
Unsubscriber: b.Unsubscribe, // Unsubscriber function outlined above.
GenerateSubscriptions: b.GenerateDefaultSubscriptions, // GenerateDefaultSubscriptions function outlined above.
Features: &b.Features.Supports.WebsocketCapabilities, // Defines the capabilities of the websocket outlined in supported features struct. This allows the websocket connection to be flushed appropriately if we have a pair/asset enable/disable change. This is outlined below.
// Orderbook buffer specific variables for processing orderbook updates via websocket feed.
// Other orderbook buffer vars:
// UpdateEntriesByID bool
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
SortBufferByUpdateIDs: true,
SortBuffer: true,
SortBufferByUpdateIDs: true,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *BTCMarkets) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *BTCMarkets) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -137,7 +137,7 @@ func (b *BTCMarkets) SetDefaults() {
}
// Setup takes in an exchange configuration and sets all parameters
func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error {
func (b *BTCMarkets) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -154,21 +154,14 @@ func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error {
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: btcMarketsWSURL,
ExchangeName: exch.Name,
RunningURL: wsURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
GenerateSubscriptions: b.generateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
ExchangeConfig: exch,
DefaultURL: btcMarketsWSURL,
RunningURL: wsURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
GenerateSubscriptions: b.generateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (b *BTSE) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (b *BTSE) GetDefaultConfig() (*config.Exchange, error) {
b.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = b.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = b.BaseCurrencies
@@ -168,7 +168,7 @@ func (b *BTSE) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (b *BTSE) Setup(exch *config.ExchangeConfig) error {
func (b *BTSE) Setup(exch *config.Exchange) error {
if !exch.Enabled {
b.SetEnabled(false)
return nil
@@ -185,21 +185,14 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error {
}
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: btseWebsocket,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
UnSubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: btseWebsocket,
RunningURL: wsRunningURL,
Connector: b.WsConnect,
Subscriber: b.Subscribe,
Unsubscriber: b.Unsubscribe,
GenerateSubscriptions: b.GenerateDefaultSubscriptions,
Features: &b.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (c *CoinbasePro) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (c *CoinbasePro) GetDefaultConfig() (*config.Exchange, error) {
c.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = c.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = c.BaseCurrencies
@@ -149,7 +149,7 @@ func (c *CoinbasePro) SetDefaults() {
}
// Setup initialises the exchange parameters with the current configuration
func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error {
func (c *CoinbasePro) Setup(exch *config.Exchange) error {
if !exch.Enabled {
c.SetEnabled(false)
return nil
@@ -166,22 +166,15 @@ func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error {
}
err = c.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: coinbaseproWebsocketURL,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
UnSubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
ExchangeConfig: exch,
DefaultURL: coinbaseproWebsocketURL,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
Unsubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (c *Coinbene) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (c *Coinbene) GetDefaultConfig() (*config.Exchange, error) {
c.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = c.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = c.BaseCurrencies
@@ -169,7 +169,7 @@ func (c *Coinbene) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (c *Coinbene) Setup(exch *config.ExchangeConfig) error {
func (c *Coinbene) Setup(exch *config.Exchange) error {
if !exch.Enabled {
c.SetEnabled(false)
return nil
@@ -186,22 +186,15 @@ func (c *Coinbene) Setup(exch *config.ExchangeConfig) error {
}
err = c.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: wsContractURL,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
UnSubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
ExchangeConfig: exch,
DefaultURL: wsContractURL,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
Unsubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (c *COINUT) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (c *COINUT) GetDefaultConfig() (*config.Exchange, error) {
c.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = c.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = c.BaseCurrencies
@@ -131,7 +131,7 @@ func (c *COINUT) SetDefaults() {
}
// Setup sets the current exchange configuration
func (c *COINUT) Setup(exch *config.ExchangeConfig) error {
func (c *COINUT) Setup(exch *config.Exchange) error {
if !exch.Enabled {
c.SetEnabled(false)
return nil
@@ -148,23 +148,16 @@ func (c *COINUT) Setup(exch *config.ExchangeConfig) error {
}
err = c.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: coinutWebsocketURL,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
UnSubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
SortBufferByUpdateIDs: true,
ExchangeConfig: exch,
DefaultURL: coinutWebsocketURL,
RunningURL: wsRunningURL,
Connector: c.WsConnect,
Subscriber: c.Subscribe,
Unsubscriber: c.Unsubscribe,
GenerateSubscriptions: c.GenerateDefaultSubscriptions,
Features: &c.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
SortBufferByUpdateIDs: true,
})
if err != nil {
return err

View File

@@ -558,7 +558,7 @@ func (b *Base) SetAPIKeys(apiKey, apiSecret, clientID string) {
}
// SetupDefaults sets the exchange settings based on the supplied config
func (b *Base) SetupDefaults(exch *config.ExchangeConfig) error {
func (b *Base) SetupDefaults(exch *config.Exchange) error {
b.Enabled = true
b.LoadedByConfig = true
b.Config = exch
@@ -614,12 +614,12 @@ func (b *Base) SetupDefaults(exch *config.ExchangeConfig) error {
}
b.BaseCurrencies = exch.BaseCurrencies
if exch.OrderbookConfig.VerificationBypass {
if exch.Orderbook.VerificationBypass {
log.Warnf(log.ExchangeSys,
"%s orderbook verification has been bypassed via config.",
b.Name)
}
b.CanVerifyOrderbook = !exch.OrderbookConfig.VerificationBypass
b.CanVerifyOrderbook = !exch.Orderbook.VerificationBypass
b.States = currencystate.NewCurrencyStates()
return err
}

View File

@@ -300,7 +300,7 @@ func TestSetFeatureDefaults(t *testing.T) {
// Test nil features with basic support capabilities
b := Base{
Config: &config.ExchangeConfig{
Config: &config.Exchange{
CurrencyPairs: &currency.PairsManager{},
},
Features: Features{
@@ -345,7 +345,7 @@ func TestSetAPICredentialDefaults(t *testing.T) {
t.Parallel()
b := Base{
Config: &config.ExchangeConfig{},
Config: &config.Exchange{},
}
b.API.CredentialsValidator.RequiresKey = true
b.API.CredentialsValidator.RequiresSecret = true
@@ -366,7 +366,7 @@ func TestSetAPICredentialDefaults(t *testing.T) {
func TestSetAutoPairDefaults(t *testing.T) {
t.Parallel()
bs := "Bitstamp"
cfg := &config.Config{Exchanges: []config.ExchangeConfig{
cfg := &config.Config{Exchanges: []config.Exchange{
{
Name: bs,
CurrencyPairs: &currency.PairsManager{},
@@ -499,7 +499,7 @@ func TestSetCurrencyPairFormat(t *testing.T) {
t.Parallel()
b := Base{
Config: &config.ExchangeConfig{},
Config: &config.Exchange{},
}
b.SetCurrencyPairFormat()
if b.Config.CurrencyPairs == nil {
@@ -580,7 +580,7 @@ func TestLoadConfigPairs(t *testing.T) {
},
},
},
Config: &config.ExchangeConfig{
Config: &config.Exchange{
CurrencyPairs: &currency.PairsManager{},
},
}
@@ -1266,7 +1266,7 @@ func TestSetupDefaults(t *testing.T) {
t.Parallel()
var b = Base{Name: "awesomeTest"}
cfg := config.ExchangeConfig{
cfg := config.Exchange{
HTTPTimeout: time.Duration(-1),
API: config.APIConfig{
AuthenticatedSupport: true,
@@ -1319,12 +1319,14 @@ func TestSetupDefaults(t *testing.T) {
b.Websocket = stream.New()
b.Features.Supports.Websocket = true
err = b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: false,
WebsocketTimeout: time.Second * 30,
ExchangeConfig: &config.Exchange{
WebsocketTrafficTimeout: time.Second * 30,
Name: "test",
Features: &config.FeaturesConfig{},
},
Features: &protocol.Features{},
DefaultURL: "ws://something.com",
RunningURL: "ws://something.com",
ExchangeName: "test",
Connector: func() error { return nil },
GenerateSubscriptions: func() ([]stream.ChannelSubscription, error) { return []stream.ChannelSubscription{}, nil },
Subscriber: func(cs []stream.ChannelSubscription) error { return nil },
@@ -1450,7 +1452,7 @@ func TestSetPairs(t *testing.T) {
Uppercase: true,
},
},
Config: &config.ExchangeConfig{
Config: &config.Exchange{
CurrencyPairs: &currency.PairsManager{
UseGlobalFormat: true,
ConfigFormat: &currency.PairFormat{
@@ -1500,7 +1502,7 @@ func TestSetPairs(t *testing.T) {
func TestUpdatePairs(t *testing.T) {
t.Parallel()
cfg := &config.Config{
Exchanges: []config.ExchangeConfig{
Exchanges: []config.Exchange{
{
Name: defaultTestExchange,
CurrencyPairs: &currency.PairsManager{},
@@ -1667,12 +1669,19 @@ func TestIsWebsocketEnabled(t *testing.T) {
b.Websocket = stream.New()
err := b.Websocket.Setup(&stream.WebsocketSetup{
Enabled: true,
WebsocketTimeout: time.Second * 30,
ExchangeConfig: &config.Exchange{
Enabled: true,
WebsocketTrafficTimeout: time.Second * 30,
Name: "test",
Features: &config.FeaturesConfig{
Enabled: config.FeaturesEnabledConfig{
Websocket: true,
},
},
},
Features: &protocol.Features{},
DefaultURL: "ws://something.com",
RunningURL: "ws://something.com",
ExchangeName: "test",
Connector: func() error { return nil },
GenerateSubscriptions: func() ([]stream.ChannelSubscription, error) { return nil, nil },
Subscriber: func(cs []stream.ChannelSubscription) error { return nil },
@@ -1827,7 +1836,7 @@ func TestGetAssetType(t *testing.T) {
func TestGetFormattedPairAndAssetType(t *testing.T) {
t.Parallel()
b := Base{
Config: &config.ExchangeConfig{},
Config: &config.Exchange{},
}
b.SetCurrencyPairFormat()
b.Config.CurrencyPairs.UseGlobalFormat = true
@@ -1865,7 +1874,7 @@ func TestGetFormattedPairAndAssetType(t *testing.T) {
func TestStoreAssetPairFormat(t *testing.T) {
b := Base{
Config: &config.ExchangeConfig{Name: "kitties"},
Config: &config.Exchange{Name: "kitties"},
}
err := b.StoreAssetPairFormat(asset.Item(""), currency.PairStore{})
@@ -1901,7 +1910,7 @@ func TestStoreAssetPairFormat(t *testing.T) {
func TestSetGlobalPairsManager(t *testing.T) {
b := Base{
Config: &config.ExchangeConfig{Name: "kitties"},
Config: &config.Exchange{Name: "kitties"},
}
err := b.SetGlobalPairsManager(nil, nil, "")
@@ -2162,7 +2171,7 @@ func TestSetSaveTradeDataStatus(t *testing.T) {
SaveTradeData: false,
},
},
Config: &config.ExchangeConfig{
Config: &config.Exchange{
Features: &config.FeaturesConfig{
Enabled: config.FeaturesEnabledConfig{},
},
@@ -2190,7 +2199,7 @@ func TestAddTradesToBuffer(t *testing.T) {
Features: Features{
Enabled: FeaturesEnabled{},
},
Config: &config.ExchangeConfig{
Config: &config.Exchange{
Features: &config.FeaturesConfig{
Enabled: config.FeaturesEnabledConfig{},
},
@@ -2284,7 +2293,7 @@ func TestSetAPIURL(t *testing.T) {
b := Base{
Name: "SomeExchange",
}
b.Config = &config.ExchangeConfig{}
b.Config = &config.Exchange{}
var mappy struct {
Mappymap map[string]string `json:"urlEndpoints"`
}

View File

@@ -225,7 +225,7 @@ type Base struct {
WebsocketOrderbookBufferLimit int64
Websocket *stream.Websocket
*request.Requester
Config *config.ExchangeConfig
Config *config.Exchange
settingsMutex sync.RWMutex
// CanVerifyOrderbook determines if the orderbook verification can be bypassed,
// increasing potential update speed but decreasing confidence in orderbook

View File

@@ -29,9 +29,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (e *EXMO) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (e *EXMO) GetDefaultConfig() (*config.Exchange, error) {
e.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = e.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = e.BaseCurrencies
@@ -123,7 +123,7 @@ func (e *EXMO) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (e *EXMO) Setup(exch *config.ExchangeConfig) error {
func (e *EXMO) Setup(exch *config.Exchange) error {
if !exch.Enabled {
e.SetEnabled(false)
return nil

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (f *FTX) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (f *FTX) GetDefaultConfig() (*config.Exchange, error) {
f.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = f.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = f.BaseCurrencies
@@ -165,7 +165,7 @@ func (f *FTX) SetDefaults() {
}
// Setup takes in the supplied exchange configuration details and sets params
func (f *FTX) Setup(exch *config.ExchangeConfig) error {
func (f *FTX) Setup(exch *config.Exchange) error {
if !exch.Enabled {
f.SetEnabled(false)
return nil
@@ -182,21 +182,14 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error {
}
err = f.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: ftxWSURL,
ExchangeName: exch.Name,
RunningURL: wsEndpoint,
Connector: f.WsConnect,
Subscriber: f.Subscribe,
UnSubscriber: f.Unsubscribe,
GenerateSubscriptions: f.GenerateDefaultSubscriptions,
Features: &f.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
ExchangeConfig: exch,
DefaultURL: ftxWSURL,
RunningURL: wsEndpoint,
Connector: f.WsConnect,
Subscriber: f.Subscribe,
Unsubscriber: f.Unsubscribe,
GenerateSubscriptions: f.GenerateDefaultSubscriptions,
Features: &f.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (g *Gateio) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (g *Gateio) GetDefaultConfig() (*config.Exchange, error) {
g.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = g.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = g.BaseCurrencies
@@ -148,7 +148,7 @@ func (g *Gateio) SetDefaults() {
}
// Setup sets user configuration
func (g *Gateio) Setup(exch *config.ExchangeConfig) error {
func (g *Gateio) Setup(exch *config.Exchange) error {
if !exch.Enabled {
g.SetEnabled(false)
return nil
@@ -165,20 +165,13 @@ func (g *Gateio) Setup(exch *config.ExchangeConfig) error {
}
err = g.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: gateioWebsocketEndpoint,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: g.WsConnect,
Subscriber: g.Subscribe,
GenerateSubscriptions: g.GenerateDefaultSubscriptions,
Features: &g.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: gateioWebsocketEndpoint,
RunningURL: wsRunningURL,
Connector: g.WsConnect,
Subscriber: g.Subscribe,
GenerateSubscriptions: g.GenerateDefaultSubscriptions,
Features: &g.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (g *Gemini) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (g *Gemini) GetDefaultConfig() (*config.Exchange, error) {
g.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = g.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = g.BaseCurrencies
@@ -131,7 +131,7 @@ func (g *Gemini) SetDefaults() {
}
// Setup sets exchange configuration parameters
func (g *Gemini) Setup(exch *config.ExchangeConfig) error {
func (g *Gemini) Setup(exch *config.Exchange) error {
if !exch.Enabled {
g.SetEnabled(false)
return nil
@@ -155,21 +155,14 @@ func (g *Gemini) Setup(exch *config.ExchangeConfig) error {
}
err = g.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: geminiWebsocketEndpoint,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: g.WsConnect,
Subscriber: g.Subscribe,
UnSubscriber: g.Unsubscribe,
GenerateSubscriptions: g.GenerateDefaultSubscriptions,
Features: &g.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: geminiWebsocketEndpoint,
RunningURL: wsRunningURL,
Connector: g.WsConnect,
Subscriber: g.Subscribe,
Unsubscriber: g.Unsubscribe,
GenerateSubscriptions: g.GenerateDefaultSubscriptions,
Features: &g.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (h *HitBTC) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (h *HitBTC) GetDefaultConfig() (*config.Exchange, error) {
h.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = h.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = h.BaseCurrencies
@@ -147,7 +147,7 @@ func (h *HitBTC) SetDefaults() {
}
// Setup sets user exchange configuration settings
func (h *HitBTC) Setup(exch *config.ExchangeConfig) error {
func (h *HitBTC) Setup(exch *config.Exchange) error {
if !exch.Enabled {
h.SetEnabled(false)
return nil
@@ -164,23 +164,16 @@ func (h *HitBTC) Setup(exch *config.ExchangeConfig) error {
}
err = h.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: hitbtcWebsocketAddress,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: h.WsConnect,
Subscriber: h.Subscribe,
UnSubscriber: h.Unsubscribe,
GenerateSubscriptions: h.GenerateDefaultSubscriptions,
Features: &h.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
SortBufferByUpdateIDs: true,
ExchangeConfig: exch,
DefaultURL: hitbtcWebsocketAddress,
RunningURL: wsRunningURL,
Connector: h.WsConnect,
Subscriber: h.Subscribe,
Unsubscriber: h.Unsubscribe,
GenerateSubscriptions: h.GenerateDefaultSubscriptions,
Features: &h.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
SortBufferByUpdateIDs: true,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (h *HUOBI) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (h *HUOBI) GetDefaultConfig() (*config.Exchange, error) {
h.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = h.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = h.BaseCurrencies
@@ -178,7 +178,7 @@ func (h *HUOBI) SetDefaults() {
}
// Setup sets user configuration
func (h *HUOBI) Setup(exch *config.ExchangeConfig) error {
func (h *HUOBI) Setup(exch *config.Exchange) error {
if !exch.Enabled {
h.SetEnabled(false)
return nil
@@ -195,21 +195,14 @@ func (h *HUOBI) Setup(exch *config.ExchangeConfig) error {
}
err = h.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: wsMarketURL,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: h.WsConnect,
Subscriber: h.Subscribe,
UnSubscriber: h.Unsubscribe,
GenerateSubscriptions: h.GenerateDefaultSubscriptions,
Features: &h.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: wsMarketURL,
RunningURL: wsRunningURL,
Connector: h.WsConnect,
Subscriber: h.Subscribe,
Unsubscriber: h.Unsubscribe,
GenerateSubscriptions: h.GenerateDefaultSubscriptions,
Features: &h.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err
@@ -277,7 +270,7 @@ func (h *HUOBI) Run() {
if common.StringDataContains(h.BaseCurrencies.Strings(), currency.CNY.String()) {
cfg := config.GetConfig()
var exchCfg *config.ExchangeConfig
var exchCfg *config.Exchange
exchCfg, err = cfg.GetExchangeConfig(h.Name)
if err != nil {
log.Errorf(log.ExchangeSys,

View File

@@ -23,7 +23,7 @@ import (
// IBotExchange enforces standard functions for all exchanges supported in
// GoCryptoTrader
type IBotExchange interface {
Setup(exch *config.ExchangeConfig) error
Setup(exch *config.Exchange) error
Start(wg *sync.WaitGroup)
SetDefaults()
GetName() string
@@ -73,7 +73,7 @@ type IBotExchange interface {
SetClientProxyAddress(addr string) error
SupportsREST() bool
GetSubscriptions() ([]stream.ChannelSubscription, error)
GetDefaultConfig() (*config.ExchangeConfig, error)
GetDefaultConfig() (*config.Exchange, error)
GetBase() *Base
SupportsAsset(assetType asset.Item) bool
GetHistoricCandles(ctx context.Context, p currency.Pair, a asset.Item, timeStart, timeEnd time.Time, interval kline.Interval) (kline.Item, error)

View File

@@ -29,9 +29,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (i *ItBit) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (i *ItBit) GetDefaultConfig() (*config.Exchange, error) {
i.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = i.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = i.BaseCurrencies
@@ -106,7 +106,7 @@ func (i *ItBit) SetDefaults() {
}
// Setup sets the exchange parameters from exchange config
func (i *ItBit) Setup(exch *config.ExchangeConfig) error {
func (i *ItBit) Setup(exch *config.Exchange) error {
if !exch.Enabled {
i.SetEnabled(false)
return nil

View File

@@ -31,9 +31,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (k *Kraken) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (k *Kraken) GetDefaultConfig() (*config.Exchange, error) {
k.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = k.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = k.BaseCurrencies
@@ -190,7 +190,7 @@ func (k *Kraken) SetDefaults() {
}
// Setup sets current exchange configuration
func (k *Kraken) Setup(exch *config.ExchangeConfig) error {
func (k *Kraken) Setup(exch *config.Exchange) error {
if !exch.Enabled {
k.SetEnabled(false)
return nil
@@ -211,22 +211,15 @@ func (k *Kraken) Setup(exch *config.ExchangeConfig) error {
return err
}
err = k.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: krakenWSURL,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: k.WsConnect,
Subscriber: k.Subscribe,
UnSubscriber: k.Unsubscribe,
GenerateSubscriptions: k.GenerateDefaultSubscriptions,
Features: &k.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
ExchangeConfig: exch,
DefaultURL: krakenWSURL,
RunningURL: wsRunningURL,
Connector: k.WsConnect,
Subscriber: k.Subscribe,
Unsubscriber: k.Unsubscribe,
GenerateSubscriptions: k.GenerateDefaultSubscriptions,
Features: &k.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
})
if err != nil {
return err

View File

@@ -28,9 +28,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (l *Lbank) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (l *Lbank) GetDefaultConfig() (*config.Exchange, error) {
l.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = l.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = l.BaseCurrencies
@@ -120,7 +120,7 @@ func (l *Lbank) SetDefaults() {
}
// Setup sets exchange configuration profile
func (l *Lbank) Setup(exch *config.ExchangeConfig) error {
func (l *Lbank) Setup(exch *config.Exchange) error {
if !exch.Enabled {
l.SetEnabled(false)
return nil

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (l *LocalBitcoins) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (l *LocalBitcoins) GetDefaultConfig() (*config.Exchange, error) {
l.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = l.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = l.BaseCurrencies
@@ -105,7 +105,7 @@ func (l *LocalBitcoins) SetDefaults() {
}
// Setup sets exchange configuration parameters
func (l *LocalBitcoins) Setup(exch *config.ExchangeConfig) error {
func (l *LocalBitcoins) Setup(exch *config.Exchange) error {
if !exch.Enabled {
l.SetEnabled(false)
return nil

View File

@@ -23,9 +23,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (o *OKCoin) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (o *OKCoin) GetDefaultConfig() (*config.Exchange, error) {
o.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = o.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = o.BaseCurrencies

View File

@@ -25,9 +25,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (o *OKEX) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (o *OKEX) GetDefaultConfig() (*config.Exchange, error) {
o.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = o.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = o.BaseCurrencies

View File

@@ -30,7 +30,7 @@ import (
// When circumstances change, wrapper funcs can be split appropriately
// Setup sets user exchange configuration settings
func (o *OKGroup) Setup(exch *config.ExchangeConfig) error {
func (o *OKGroup) Setup(exch *config.Exchange) error {
if !exch.Enabled {
o.SetEnabled(false)
return nil
@@ -46,21 +46,14 @@ func (o *OKGroup) Setup(exch *config.ExchangeConfig) error {
return err
}
err = o.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: wsEndpoint,
ExchangeName: exch.Name,
RunningURL: wsEndpoint,
Connector: o.WsConnect,
Subscriber: o.Subscribe,
UnSubscriber: o.Unsubscribe,
GenerateSubscriptions: o.GenerateDefaultSubscriptions,
Features: &o.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: wsEndpoint,
RunningURL: wsEndpoint,
Connector: o.WsConnect,
Subscriber: o.Subscribe,
Unsubscriber: o.Unsubscribe,
GenerateSubscriptions: o.GenerateDefaultSubscriptions,
Features: &o.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (p *Poloniex) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (p *Poloniex) GetDefaultConfig() (*config.Exchange, error) {
p.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = p.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = p.BaseCurrencies
@@ -151,7 +151,7 @@ func (p *Poloniex) SetDefaults() {
}
// Setup sets user exchange configuration settings
func (p *Poloniex) Setup(exch *config.ExchangeConfig) error {
func (p *Poloniex) Setup(exch *config.Exchange) error {
if !exch.Enabled {
p.SetEnabled(false)
return nil
@@ -168,23 +168,16 @@ func (p *Poloniex) Setup(exch *config.ExchangeConfig) error {
}
err = p.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: poloniexWebsocketAddress,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: p.WsConnect,
Subscriber: p.Subscribe,
UnSubscriber: p.Unsubscribe,
GenerateSubscriptions: p.GenerateDefaultSubscriptions,
Features: &p.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
SortBuffer: true,
SortBufferByUpdateIDs: true,
ExchangeConfig: exch,
DefaultURL: poloniexWebsocketAddress,
RunningURL: wsRunningURL,
Connector: p.WsConnect,
Subscriber: p.Subscribe,
Unsubscriber: p.Unsubscribe,
GenerateSubscriptions: p.GenerateDefaultSubscriptions,
Features: &p.Features.Supports.WebsocketCapabilities,
SortBuffer: true,
SortBufferByUpdateIDs: true,
})
if err != nil {
return err

View File

@@ -24,7 +24,7 @@ type CustomEx struct {
exchange.Base
}
func (c *CustomEx) Setup(exch *config.ExchangeConfig) error {
func (c *CustomEx) Setup(exch *config.Exchange) error {
return nil
}
@@ -216,7 +216,7 @@ func (c *CustomEx) GetSubscriptions() ([]stream.ChannelSubscription, error) {
return nil, nil
}
func (c *CustomEx) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (c *CustomEx) GetDefaultConfig() (*config.Exchange, error) {
return nil, nil
}

View File

@@ -6,6 +6,7 @@ import (
"sort"
"time"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
@@ -15,7 +16,7 @@ import (
const packageError = "websocket orderbook buffer error: %w"
var (
errUnsetExchangeName = errors.New("exchange name unset")
errExchangeConfigNil = errors.New("exchange config is nil")
errUnsetDataHandler = errors.New("datahandler unset")
errIssueBufferEnabledButNoLimit = errors.New("buffer enabled but no limit set")
errUpdateIsNil = errors.New("update is nil")
@@ -25,34 +26,35 @@ var (
)
// Setup sets private variables
func (w *Orderbook) Setup(obBufferLimit int,
bufferEnabled,
sortBuffer,
sortBufferByUpdateIDs,
updateEntriesByID,
verbose bool,
publishPeriod time.Duration,
exchangeName string,
dataHandler chan interface{}) error {
if exchangeName == "" {
return fmt.Errorf(packageError, errUnsetExchangeName)
func (w *Orderbook) Setup(cfg *config.Exchange, sortBuffer, sortBufferByUpdateIDs, updateEntriesByID bool, dataHandler chan interface{}) error {
if cfg == nil { // exchange config fields are checked in stream package
// prior to calling this, so further checks are not needed.
return fmt.Errorf(packageError, errExchangeConfigNil)
}
if dataHandler == nil {
return fmt.Errorf(packageError, errUnsetDataHandler)
}
if bufferEnabled && obBufferLimit < 1 {
if cfg.Orderbook.WebsocketBufferEnabled &&
cfg.Orderbook.WebsocketBufferLimit < 1 {
return fmt.Errorf(packageError, errIssueBufferEnabledButNoLimit)
}
w.obBufferLimit = obBufferLimit
w.bufferEnabled = bufferEnabled
w.bufferEnabled = cfg.Orderbook.WebsocketBufferEnabled
w.obBufferLimit = cfg.Orderbook.WebsocketBufferLimit
w.sortBuffer = sortBuffer
w.sortBufferByUpdateIDs = sortBufferByUpdateIDs
w.updateEntriesByID = updateEntriesByID
w.exchangeName = exchangeName
w.exchangeName = cfg.Name
w.dataHandler = dataHandler
w.ob = make(map[currency.Code]map[currency.Code]map[asset.Item]*orderbookHolder)
w.verbose = verbose
w.publishPeriod = publishPeriod
w.verbose = cfg.Verbose
// set default publish period if missing
orderbookPublishPeriod := config.DefaultOrderbookPublishPeriod
if cfg.Orderbook.PublishPeriod != nil {
orderbookPublishPeriod = *cfg.Orderbook.PublishPeriod
}
w.publishPeriod = orderbookPublishPeriod
return nil
}

View File

@@ -6,21 +6,24 @@ import (
"testing"
"time"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
)
var itemArray = [][]orderbook.Item{
{{Price: 1000, Amount: 1, ID: 1000}},
{{Price: 2000, Amount: 1, ID: 2000}},
{{Price: 3000, Amount: 1, ID: 3000}},
{{Price: 3000, Amount: 2, ID: 4000}},
{{Price: 4000, Amount: 0, ID: 6000}},
{{Price: 5000, Amount: 1, ID: 5000}},
}
var (
itemArray = [][]orderbook.Item{
{{Price: 1000, Amount: 1, ID: 1000}},
{{Price: 2000, Amount: 1, ID: 2000}},
{{Price: 3000, Amount: 1, ID: 3000}},
{{Price: 3000, Amount: 2, ID: 4000}},
{{Price: 4000, Amount: 0, ID: 6000}},
{{Price: 5000, Amount: 1, ID: 5000}},
}
var cp, _ = currency.NewPairFromString("BTCUSD")
cp, _ = currency.NewPairFromString("BTCUSD")
)
const (
exchangeName = "exchangeTest"
@@ -712,22 +715,27 @@ func TestGetOrderbook(t *testing.T) {
func TestSetup(t *testing.T) {
t.Parallel()
w := Orderbook{}
err := w.Setup(0, false, false, false, false, true, 0, "", nil)
if !errors.Is(err, errUnsetExchangeName) {
t.Fatalf("expected error %v but received %v", errUnsetExchangeName, err)
err := w.Setup(nil, false, false, false, nil)
if !errors.Is(err, errExchangeConfigNil) {
t.Fatalf("expected error %v but received %v", errExchangeConfigNil, err)
}
err = w.Setup(0, false, false, false, false, false, 0, "test", nil)
exchangeConfig := &config.Exchange{}
err = w.Setup(exchangeConfig, false, false, false, nil)
if !errors.Is(err, errUnsetDataHandler) {
t.Fatalf("expected error %v but received %v", errUnsetDataHandler, err)
}
err = w.Setup(0, true, false, false, false, true, 0, "test", make(chan interface{}))
exchangeConfig.Orderbook.WebsocketBufferEnabled = true
err = w.Setup(exchangeConfig, false, false, false, make(chan interface{}))
if !errors.Is(err, errIssueBufferEnabledButNoLimit) {
t.Fatalf("expected error %v but received %v", errIssueBufferEnabledButNoLimit, err)
}
err = w.Setup(1337, true, true, true, true, false, 0, "test", make(chan interface{}))
exchangeConfig.Orderbook.WebsocketBufferLimit = 1337
exchangeConfig.Orderbook.WebsocketBufferEnabled = true
exchangeConfig.Name = "test"
err = w.Setup(exchangeConfig, true, true, true, make(chan interface{}))
if err != nil {
t.Fatal(err)
}
@@ -1002,7 +1010,7 @@ func TestUpdateByIDAndAction(t *testing.T) {
func TestFlushOrderbook(t *testing.T) {
t.Parallel()
w := &Orderbook{}
err := w.Setup(5, false, false, false, false, false, 0, "test", make(chan interface{}, 2))
err := w.Setup(&config.Exchange{Name: "test"}, false, false, false, make(chan interface{}, 2))
if err != nil {
t.Fatal(err)
}

View File

@@ -24,10 +24,26 @@ const (
)
var (
errClosedConnection = errors.New("use of closed network connection")
// ErrSubscriptionFailure defines an error when a subscription fails
ErrSubscriptionFailure = errors.New("subscription failure")
errAlreadyRunning = errors.New("connection monitor is already running")
errAlreadyRunning = errors.New("connection monitor is already running")
errExchangeConfigIsNil = errors.New("exchange config is nil")
errWebsocketIsNil = errors.New("websocket is nil")
errWebsocketSetupIsNil = errors.New("websocket setup is nil")
errWebsocketAlreadyInitialised = errors.New("websocket already initialised")
errWebsocketFeaturesIsUnset = errors.New("websocket features is unset")
errConfigFeaturesIsNil = errors.New("exchange config features is nil")
errDefaultURLIsEmpty = errors.New("default url is empty")
errRunningURLIsEmpty = errors.New("running url cannot be empty")
errInvalidWebsocketURL = errors.New("invalid websocket url")
errExchangeConfigNameUnset = errors.New("exchange config name unset")
errInvalidTrafficTimeout = errors.New("invalid traffic timeout")
errWebsocketSubscriberUnset = errors.New("websocket subscriber function needs to be set")
errWebsocketUnsubscriberUnset = errors.New("websocket unsubscriber functionality allowed but unsubscriber function not set")
errWebsocketConnectorUnset = errors.New("websocket connector function not set")
errWebsocketSubscriptionsGeneratorUnset = errors.New("websocket subscriptions generator function needs to be set")
errClosedConnection = errors.New("use of closed network connection")
)
// New initialises the websocket struct
@@ -44,97 +60,95 @@ func New() *Websocket {
}
}
var (
errSubscriberUnset = errors.New("subscriber function needs to be set")
errGenerateSubsciptionsUnset = errors.New("generate subscriptions function needs to be set")
)
// Setup sets main variables for websocket connection
func (w *Websocket) Setup(s *WebsocketSetup) error {
if w == nil {
return errors.New("websocket is nil")
return errWebsocketIsNil
}
if s == nil {
return errors.New("websocket setup is nil")
return errWebsocketSetupIsNil
}
if !w.Init {
return fmt.Errorf("%s Websocket already initialised",
s.ExchangeName)
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketAlreadyInitialised)
}
w.verbose = s.Verbose
if s.ExchangeConfig == nil {
return errExchangeConfigIsNil
}
if s.ExchangeConfig.Name == "" {
return errExchangeConfigNameUnset
}
w.exchangeName = s.ExchangeConfig.Name
w.verbose = s.ExchangeConfig.Verbose
if s.Features == nil {
return errors.New("websocket features is unset")
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketFeaturesIsUnset)
}
w.features = s.Features
if s.ExchangeConfig.Features == nil {
return fmt.Errorf("%s %w", w.exchangeName, errConfigFeaturesIsNil)
}
w.enabled = s.ExchangeConfig.Features.Enabled.Websocket
if s.Connector == nil {
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketConnectorUnset)
}
w.connector = s.Connector
if s.Subscriber == nil {
return errSubscriberUnset
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketSubscriberUnset)
}
w.Subscriber = s.Subscriber
if w.features.Unsubscribe && s.UnSubscriber == nil {
return errors.New("features have been set yet channel unsubscriber is not set")
if w.features.Unsubscribe && s.Unsubscriber == nil {
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketUnsubscriberUnset)
}
w.Unsubscriber = s.UnSubscriber
w.Unsubscriber = s.Unsubscriber
if s.GenerateSubscriptions == nil {
return errGenerateSubsciptionsUnset
return fmt.Errorf("%s %w", w.exchangeName, errWebsocketSubscriptionsGeneratorUnset)
}
w.GenerateSubs = s.GenerateSubscriptions
w.enabled = s.Enabled
if s.DefaultURL == "" {
return errors.New("default url is empty")
return fmt.Errorf("%s websocket %w", w.exchangeName, errDefaultURLIsEmpty)
}
w.defaultURL = s.DefaultURL
if s.RunningURL == "" {
return errors.New("running URL cannot be nil")
return fmt.Errorf("%s websocket %w", w.exchangeName, errRunningURLIsEmpty)
}
err := w.SetWebsocketURL(s.RunningURL, false, false)
if err != nil {
return err
return fmt.Errorf("%s %w", w.exchangeName, err)
}
if s.RunningURLAuth != "" {
err = w.SetWebsocketURL(s.RunningURLAuth, true, false)
if err != nil {
return err
return fmt.Errorf("%s %w", w.exchangeName, err)
}
}
w.connector = s.Connector
if s.ExchangeName == "" {
return errors.New("exchange name unset")
if s.ExchangeConfig.WebsocketTrafficTimeout < time.Second {
return fmt.Errorf("%s %w cannot be less than %s",
w.exchangeName,
errInvalidTrafficTimeout,
time.Second)
}
w.exchangeName = s.ExchangeName
if s.WebsocketTimeout < time.Second {
return fmt.Errorf("traffic timeout cannot be less than %s", time.Second)
}
w.trafficTimeout = s.WebsocketTimeout
w.trafficTimeout = s.ExchangeConfig.WebsocketTrafficTimeout
w.ShutdownC = make(chan struct{})
w.Wg = new(sync.WaitGroup)
w.SetCanUseAuthenticatedEndpoints(s.AuthenticatedWebsocketAPISupport)
w.SetCanUseAuthenticatedEndpoints(s.ExchangeConfig.API.AuthenticatedWebsocketSupport)
// default publish period if missing
orderbookPublishPeriod := config.DefaultOrderbookPublishPeriod
if s.OrderbookPublishPeriod != nil {
orderbookPublishPeriod = *s.OrderbookPublishPeriod
}
return w.Orderbook.Setup(s.OrderbookBufferLimit,
s.BufferEnabled,
return w.Orderbook.Setup(s.ExchangeConfig,
s.SortBuffer,
s.SortBufferByUpdateIDs,
s.UpdateEntriesByID,
s.Verbose,
orderbookPublishPeriod,
w.exchangeName,
w.DataHandler)
}
@@ -948,7 +962,7 @@ func checkWebsocketURL(s string) error {
return err
}
if u.Scheme != "ws" && u.Scheme != "wss" {
return fmt.Errorf("cannot set invalid websocket URL %s", s)
return fmt.Errorf("cannot set %w %s", errInvalidWebsocketURL, s)
}
return nil
}

View File

@@ -16,6 +16,7 @@ import (
"time"
"github.com/gorilla/websocket"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
)
@@ -52,15 +53,21 @@ type testResponse struct {
}
var defaultSetup = &WebsocketSetup{
Enabled: true,
AuthenticatedWebsocketAPISupport: true,
WebsocketTimeout: time.Second * 5,
DefaultURL: "testDefaultURL",
ExchangeName: "exchangeName",
RunningURL: "wss://testRunningURL",
Connector: func() error { return nil },
Subscriber: func(_ []ChannelSubscription) error { return nil },
UnSubscriber: func(_ []ChannelSubscription) error { return nil },
ExchangeConfig: &config.Exchange{
Features: &config.FeaturesConfig{
Enabled: config.FeaturesEnabledConfig{Websocket: true},
},
API: config.APIConfig{
AuthenticatedWebsocketSupport: true,
},
WebsocketTrafficTimeout: time.Second * 5,
Name: "exchangeName",
},
DefaultURL: "testDefaultURL",
RunningURL: "wss://testRunningURL",
Connector: func() error { return nil },
Subscriber: func(_ []ChannelSubscription) error { return nil },
Unsubscriber: func(_ []ChannelSubscription) error { return nil },
GenerateSubscriptions: func() ([]ChannelSubscription, error) {
return []ChannelSubscription{
{Channel: "TestSub"},
@@ -90,75 +97,104 @@ func TestSetup(t *testing.T) {
t.Parallel()
var w *Websocket
err := w.Setup(nil)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errWebsocketIsNil) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketIsNil)
}
w = &Websocket{DataHandler: make(chan interface{})}
err = w.Setup(nil)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errWebsocketSetupIsNil) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSetupIsNil)
}
w.Init = true
websocketSetup := &WebsocketSetup{}
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errWebsocketAlreadyInitialised) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketAlreadyInitialised)
}
w.Init = true
err = w.Setup(websocketSetup)
if !errors.Is(err, errExchangeConfigIsNil) {
t.Fatalf("received: '%v' but expected: '%v'", err, errExchangeConfigIsNil)
}
websocketSetup.ExchangeConfig = &config.Exchange{}
err = w.Setup(websocketSetup)
if !errors.Is(err, errExchangeConfigNameUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errExchangeConfigNameUnset)
}
websocketSetup.ExchangeConfig.Name = "testname"
err = w.Setup(websocketSetup)
if !errors.Is(err, errWebsocketFeaturesIsUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketFeaturesIsUnset)
}
websocketSetup.Features = &protocol.Features{}
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errConfigFeaturesIsNil) {
t.Fatalf("received: '%v' but expected: '%v'", err, errConfigFeaturesIsNil)
}
websocketSetup.Features.Subscribe = true
websocketSetup.ExchangeConfig.Features = &config.FeaturesConfig{}
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errWebsocketConnectorUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketConnectorUnset)
}
websocketSetup.Connector = func() error { return nil }
err = w.Setup(websocketSetup)
if !errors.Is(err, errWebsocketSubscriberUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSubscriberUnset)
}
websocketSetup.Subscriber = func([]ChannelSubscription) error { return nil }
websocketSetup.Features.Unsubscribe = true
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
if !errors.Is(err, errWebsocketUnsubscriberUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketUnsubscriberUnset)
}
websocketSetup.UnSubscriber = func([]ChannelSubscription) error { return nil }
websocketSetup.Unsubscriber = func([]ChannelSubscription) error { return nil }
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.DefaultURL = "test"
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.RunningURL = "http://www.google.com"
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.RunningURL = "wss://www.google.com"
websocketSetup.RunningURLAuth = "http://www.google.com"
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.RunningURLAuth = "wss://www.google.com"
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.ExchangeName = "testname"
err = w.Setup(websocketSetup)
if err == nil {
t.Fatal("error cannot be nil")
}
websocketSetup.WebsocketTimeout = time.Minute
err = w.Setup(websocketSetup)
if !errors.Is(err, errGenerateSubsciptionsUnset) {
t.Fatalf("received: %v but expected: %v", err, errGenerateSubsciptionsUnset)
if !errors.Is(err, errWebsocketSubscriptionsGeneratorUnset) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketSubscriptionsGeneratorUnset)
}
websocketSetup.GenerateSubscriptions = func() ([]ChannelSubscription, error) { return nil, nil }
err = w.Setup(websocketSetup)
if !errors.Is(err, errDefaultURLIsEmpty) {
t.Fatalf("received: '%v' but expected: '%v'", err, errDefaultURLIsEmpty)
}
websocketSetup.DefaultURL = "test"
err = w.Setup(websocketSetup)
if !errors.Is(err, errRunningURLIsEmpty) {
t.Fatalf("received: '%v' but expected: '%v'", err, errRunningURLIsEmpty)
}
websocketSetup.RunningURL = "http://www.google.com"
err = w.Setup(websocketSetup)
if !errors.Is(err, errInvalidWebsocketURL) {
t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidWebsocketURL)
}
websocketSetup.RunningURL = "wss://www.google.com"
websocketSetup.RunningURLAuth = "http://www.google.com"
err = w.Setup(websocketSetup)
if !errors.Is(err, errInvalidWebsocketURL) {
t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidWebsocketURL)
}
websocketSetup.RunningURLAuth = "wss://www.google.com"
err = w.Setup(websocketSetup)
if !errors.Is(err, errInvalidTrafficTimeout) {
t.Fatalf("received: '%v' but expected: '%v'", err, errInvalidTrafficTimeout)
}
websocketSetup.ExchangeConfig.WebsocketTrafficTimeout = time.Minute
err = w.Setup(websocketSetup)
if !errors.Is(err, nil) {
t.Fatalf("received: %v but expected: %v", err, nil)
}
@@ -294,11 +330,15 @@ func TestWebsocket(t *testing.T) {
t.Parallel()
wsInit := Websocket{}
err := wsInit.Setup(&WebsocketSetup{
ExchangeName: "test",
Enabled: true,
ExchangeConfig: &config.Exchange{
Features: &config.FeaturesConfig{
Enabled: config.FeaturesEnabledConfig{Websocket: true},
},
Name: "test",
},
})
if err != nil && err.Error() != "test Websocket already initialised" {
t.Errorf("Expected 'test Websocket already initialised', received %v", err)
if !errors.Is(err, errWebsocketAlreadyInitialised) {
t.Fatalf("received: '%v' but expected: '%v'", err, errWebsocketAlreadyInitialised)
}
ws := *New()

View File

@@ -5,6 +5,7 @@ import (
"time"
"github.com/gorilla/websocket"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/stream/buffer"
)
@@ -86,28 +87,19 @@ type Websocket struct {
// WebsocketSetup defines variables for setting up a websocket connection
type WebsocketSetup struct {
Enabled bool
Verbose bool
AuthenticatedWebsocketAPISupport bool
WebsocketTimeout time.Duration
DefaultURL string
ExchangeName string
RunningURL string
RunningURLAuth string
Connector func() error
Subscriber func([]ChannelSubscription) error
UnSubscriber func([]ChannelSubscription) error
GenerateSubscriptions func() ([]ChannelSubscription, error)
Features *protocol.Features
ExchangeConfig *config.Exchange
DefaultURL string
RunningURL string
RunningURLAuth string
Connector func() error
Subscriber func([]ChannelSubscription) error
Unsubscriber func([]ChannelSubscription) error
GenerateSubscriptions func() ([]ChannelSubscription, error)
Features *protocol.Features
// Local orderbook buffer config values
OrderbookBufferLimit int
BufferEnabled bool
SortBuffer bool
SortBufferByUpdateIDs bool
UpdateEntriesByID bool
// OrderbookPublishPeriod is a pointer for the same reason as it is in `OrderbookConfig`:
// to allow distinguishing between a zeroed out value and a missing one
OrderbookPublishPeriod *time.Duration
}
// WebsocketConnection contains all the data needed to send a message to a WS

View File

@@ -29,9 +29,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (y *Yobit) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (y *Yobit) GetDefaultConfig() (*config.Exchange, error) {
y.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = y.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = y.BaseCurrencies
@@ -111,7 +111,7 @@ func (y *Yobit) SetDefaults() {
}
// Setup sets exchange configuration parameters for Yobit
func (y *Yobit) Setup(exch *config.ExchangeConfig) error {
func (y *Yobit) Setup(exch *config.Exchange) error {
if !exch.Enabled {
y.SetEnabled(false)
return nil

View File

@@ -25,7 +25,7 @@ func TestMain(m *testing.M) {
if err != nil {
log.Fatal("ZB load config error", err)
}
var zbConfig *config.ExchangeConfig
var zbConfig *config.Exchange
zbConfig, err = cfg.GetExchangeConfig("ZB")
if err != nil {
log.Fatal("ZB Setup() init error", err)

View File

@@ -30,9 +30,9 @@ import (
)
// GetDefaultConfig returns a default exchange config
func (z *ZB) GetDefaultConfig() (*config.ExchangeConfig, error) {
func (z *ZB) GetDefaultConfig() (*config.Exchange, error) {
z.SetDefaults()
exchCfg := new(config.ExchangeConfig)
exchCfg := new(config.Exchange)
exchCfg.Name = z.Name
exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout
exchCfg.BaseCurrencies = z.BaseCurrencies
@@ -148,7 +148,7 @@ func (z *ZB) SetDefaults() {
}
// Setup sets user configuration
func (z *ZB) Setup(exch *config.ExchangeConfig) error {
func (z *ZB) Setup(exch *config.Exchange) error {
if !exch.Enabled {
z.SetEnabled(false)
return nil
@@ -165,20 +165,13 @@ func (z *ZB) Setup(exch *config.ExchangeConfig) error {
}
err = z.Websocket.Setup(&stream.WebsocketSetup{
Enabled: exch.Features.Enabled.Websocket,
Verbose: exch.Verbose,
AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport,
WebsocketTimeout: exch.WebsocketTrafficTimeout,
DefaultURL: zbWebsocketAPI,
ExchangeName: exch.Name,
RunningURL: wsRunningURL,
Connector: z.WsConnect,
GenerateSubscriptions: z.GenerateDefaultSubscriptions,
Subscriber: z.Subscribe,
Features: &z.Features.Supports.WebsocketCapabilities,
OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit,
OrderbookPublishPeriod: exch.OrderbookConfig.PublishPeriod,
BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled,
ExchangeConfig: exch,
DefaultURL: zbWebsocketAPI,
RunningURL: wsRunningURL,
Connector: z.WsConnect,
GenerateSubscriptions: z.GenerateDefaultSubscriptions,
Subscriber: z.Subscribe,
Features: &z.Features.Supports.WebsocketCapabilities,
})
if err != nil {
return err