diff --git a/cmd/exchange_template/wrapper_file.tmpl b/cmd/exchange_template/wrapper_file.tmpl index f1913003..511623d2 100644 --- a/cmd/exchange_template/wrapper_file.tmpl +++ b/cmd/exchange_template/wrapper_file.tmpl @@ -161,7 +161,7 @@ func ({{.Variable}} *{{.CapitalName}}) Setup(exch *config.ExchangeConfig) error // NOTE: PLEASE ENSURE YOU SET THE ORDERBOOK BUFFER SETTINGS CORRECTLY {{.Variable}}.Websocket.Orderbook.Setup( - exch.WebsocketOrderbookBufferLimit, + exch.OrderbookConfig.WebsocketBufferLimit, true, true, false, @@ -272,7 +272,13 @@ func ({{.Variable}} *{{.CapitalName}}) FetchOrderbook(currency currency.Pair, as // UpdateOrderbook updates and returns the orderbook for a currency pair func ({{.Variable}} *{{.CapitalName}}) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: {{.Variable}}.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: {{.Variable}}.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: {{.Variable}}.OrderbookVerificationBypass, + } + // NOTE: UPDATE ORDERBOOK EXAMPLE /* orderbookNew, err := {{.Variable}}.GetOrderBook(exchange.FormatExchangeCurrency({{.Variable}}.Name, p).String(), 1000) diff --git a/config/config.go b/config/config.go index 73414639..ebcef1e2 100644 --- a/config/config.go +++ b/config/config.go @@ -1041,12 +1041,12 @@ func (c *Config) CheckExchangeConfigValues() error { defaultWebsocketTrafficTimeout) c.Exchanges[i].WebsocketTrafficTimeout = defaultWebsocketTrafficTimeout } - if c.Exchanges[i].WebsocketOrderbookBufferLimit <= 0 { + if c.Exchanges[i].OrderbookConfig.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].WebsocketOrderbookBufferLimit = defaultWebsocketOrderbookBufferLimit + c.Exchanges[i].OrderbookConfig.WebsocketBufferLimit = defaultWebsocketOrderbookBufferLimit } err := c.CheckPairConsistency(c.Exchanges[i].Name) if err != nil { diff --git a/config/config_test.go b/config/config_test.go index 8282a09d..8ded9e79 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1459,7 +1459,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].WebsocketOrderbookBufferLimit = 0 + cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit = 0 cfg.Exchanges[0].WebsocketTrafficTimeout = 0 cfg.Exchanges[0].HTTPTimeout = 0 err = cfg.CheckExchangeConfigValues() @@ -1471,7 +1471,7 @@ func TestCheckExchangeConfigValues(t *testing.T) { t.Errorf("expected exchange %s to have updated WebsocketResponseMaxLimit value", cfg.Exchanges[0].Name) } - if cfg.Exchanges[0].WebsocketOrderbookBufferLimit == 0 { + if cfg.Exchanges[0].OrderbookConfig.WebsocketBufferLimit == 0 { t.Errorf("expected exchange %s to have updated WebsocketOrderbookBufferLimit value", cfg.Exchanges[0].Name) } diff --git a/config/config_types.go b/config/config_types.go index 973648fa..ed269e4f 100644 --- a/config/config_types.go +++ b/config/config_types.go @@ -113,24 +113,23 @@ type ConnectionMonitorConfig struct { // ExchangeConfig holds all the information needed for each enabled Exchange. type ExchangeConfig struct { - Name string `json:"name"` - Enabled bool `json:"enabled"` - Verbose bool `json:"verbose"` - UseSandbox bool `json:"useSandbox,omitempty"` - HTTPTimeout time.Duration `json:"httpTimeout"` - HTTPUserAgent string `json:"httpUserAgent,omitempty"` - HTTPDebugging bool `json:"httpDebugging,omitempty"` - WebsocketResponseCheckTimeout time.Duration `json:"websocketResponseCheckTimeout"` - WebsocketResponseMaxLimit time.Duration `json:"websocketResponseMaxLimit"` - WebsocketTrafficTimeout time.Duration `json:"websocketTrafficTimeout"` - WebsocketOrderbookBufferLimit int `json:"websocketOrderbookBufferLimit"` - WebsocketOrderbookBufferEnabled bool `json:"websocketOrderbookBufferEnabled"` - ProxyAddress string `json:"proxyAddress,omitempty"` - BaseCurrencies currency.Currencies `json:"baseCurrencies"` - CurrencyPairs *currency.PairsManager `json:"currencyPairs"` - API APIConfig `json:"api"` - Features *FeaturesConfig `json:"features"` - BankAccounts []banking.Account `json:"bankAccounts,omitempty"` + Name string `json:"name"` + Enabled bool `json:"enabled"` + Verbose bool `json:"verbose"` + UseSandbox bool `json:"useSandbox,omitempty"` + HTTPTimeout time.Duration `json:"httpTimeout"` + HTTPUserAgent string `json:"httpUserAgent,omitempty"` + HTTPDebugging bool `json:"httpDebugging,omitempty"` + WebsocketResponseCheckTimeout time.Duration `json:"websocketResponseCheckTimeout"` + WebsocketResponseMaxLimit time.Duration `json:"websocketResponseMaxLimit"` + WebsocketTrafficTimeout time.Duration `json:"websocketTrafficTimeout"` + ProxyAddress string `json:"proxyAddress,omitempty"` + BaseCurrencies currency.Currencies `json:"baseCurrencies"` + CurrencyPairs *currency.PairsManager `json:"currencyPairs"` + API APIConfig `json:"api"` + Features *FeaturesConfig `json:"features"` + BankAccounts []banking.Account `json:"bankAccounts,omitempty"` + OrderbookConfig `json:"orderbook"` // Deprecated settings which will be removed in a future update AvailablePairs *currency.Pairs `json:"availablePairs,omitempty"` @@ -380,3 +379,10 @@ type APIConfig struct { Credentials APICredentialsConfig `json:"credentials"` CredentialsValidator *APICredentialsValidatorConfig `json:"credentialsValidator,omitempty"` } + +// OrderbookConfig stores the orderbook configuration variables +type OrderbookConfig struct { + VerificationBypass bool `json:"verificationBypass"` + WebsocketBufferLimit int `json:"websocketBufferLimit"` + WebsocketBufferEnabled bool `json:"websocketBufferEnabled"` +} diff --git a/docs/ADD_NEW_EXCHANGE.md b/docs/ADD_NEW_EXCHANGE.md index aeaedef4..8a89a3c1 100644 --- a/docs/ADD_NEW_EXCHANGE.md +++ b/docs/ADD_NEW_EXCHANGE.md @@ -1095,7 +1095,7 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error { 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. // Orderbook buffer specific variables for processing orderbook updates via websocket feed. - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, // Other orderbook buffer vars: // BufferEnabled bool // SortBuffer bool diff --git a/exchanges/binance/binance_websocket.go b/exchanges/binance/binance_websocket.go index a7135e3a..df648deb 100644 --- a/exchanges/binance/binance_websocket.go +++ b/exchanges/binance/binance_websocket.go @@ -459,6 +459,7 @@ func (b *Binance) SeedLocalCacheWithBook(p currency.Pair, orderbookNew *OrderBoo newOrderBook.AssetType = asset.Spot newOrderBook.ExchangeName = b.Name newOrderBook.LastUpdateID = orderbookNew.LastUpdateID + newOrderBook.VerificationBypass = b.OrderbookVerificationBypass return b.Websocket.Orderbook.LoadSnapshot(&newOrderBook) } diff --git a/exchanges/binance/binance_wrapper.go b/exchanges/binance/binance_wrapper.go index 50210b3b..42e269af 100644 --- a/exchanges/binance/binance_wrapper.go +++ b/exchanges/binance/binance_wrapper.go @@ -182,8 +182,8 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error { UnSubscriber: b.Unsubscribe, GenerateSubscriptions: b.GenerateSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, SortBufferByUpdateIDs: true, }) @@ -401,7 +401,12 @@ func (b *Binance) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderb // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Binance) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } orderbookNew, err := b.GetOrderBook(OrderBookDataRequestParams{ Symbol: p, Limit: 1000}) diff --git a/exchanges/bitfinex/bitfinex_websocket.go b/exchanges/bitfinex/bitfinex_websocket.go index e5713ac5..1eac2b8d 100644 --- a/exchanges/bitfinex/bitfinex_websocket.go +++ b/exchanges/bitfinex/bitfinex_websocket.go @@ -968,6 +968,7 @@ func (b *Bitfinex) WsInsertSnapshot(p currency.Pair, assetType asset.Item, books book.NotAggregated = true book.HasChecksumValidation = true book.IsFundingRate = fundingRate + book.VerificationBypass = b.OrderbookVerificationBypass return b.Websocket.Orderbook.LoadSnapshot(&book) } diff --git a/exchanges/bitfinex/bitfinex_wrapper.go b/exchanges/bitfinex/bitfinex_wrapper.go index 8dcaa44e..01712392 100644 --- a/exchanges/bitfinex/bitfinex_wrapper.go +++ b/exchanges/bitfinex/bitfinex_wrapper.go @@ -198,8 +198,8 @@ func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error { UnSubscriber: b.Unsubscribe, GenerateSubscriptions: b.GenerateDefaultSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, UpdateEntriesByID: true, }) if err != nil { @@ -387,10 +387,12 @@ func (b *Bitfinex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*order // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { o := &orderbook.Base{ - ExchangeName: b.Name, - Pair: p, - AssetType: assetType, - NotAggregated: true} + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + NotAggregated: true, + VerificationBypass: b.OrderbookVerificationBypass, + } fPair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { diff --git a/exchanges/bitflyer/bitflyer_wrapper.go b/exchanges/bitflyer/bitflyer_wrapper.go index 8f33e8e8..b190f908 100644 --- a/exchanges/bitflyer/bitflyer_wrapper.go +++ b/exchanges/bitflyer/bitflyer_wrapper.go @@ -250,7 +250,12 @@ func (b *Bitflyer) FetchOrderbook(p currency.Pair, assetType asset.Item) (*order // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bitflyer) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } fPair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { diff --git a/exchanges/bithumb/bithumb_wrapper.go b/exchanges/bithumb/bithumb_wrapper.go index 76a2c69f..ecd740fb 100644 --- a/exchanges/bithumb/bithumb_wrapper.go +++ b/exchanges/bithumb/bithumb_wrapper.go @@ -242,7 +242,12 @@ func (b *Bithumb) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderb // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bithumb) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } curr := p.Base.String() orderbookNew, err := b.GetOrderBook(curr) diff --git a/exchanges/bitmex/bitmex_websocket.go b/exchanges/bitmex/bitmex_websocket.go index 3b0909c6..8f4de3fe 100644 --- a/exchanges/bitmex/bitmex_websocket.go +++ b/exchanges/bitmex/bitmex_websocket.go @@ -512,6 +512,7 @@ func (b *Bitmex) processOrderbook(data []OrderBookL2, action string, p currency. book.AssetType = a book.Pair = p book.ExchangeName = b.Name + book.VerificationBypass = b.OrderbookVerificationBypass err := b.Websocket.Orderbook.LoadSnapshot(&book) if err != nil { diff --git a/exchanges/bitmex/bitmex_wrapper.go b/exchanges/bitmex/bitmex_wrapper.go index b0a0e3f5..41c8a0a9 100644 --- a/exchanges/bitmex/bitmex_wrapper.go +++ b/exchanges/bitmex/bitmex_wrapper.go @@ -154,8 +154,8 @@ func (b *Bitmex) Setup(exch *config.ExchangeConfig) error { UnSubscriber: b.Unsubscribe, GenerateSubscriptions: b.GenerateDefaultSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, UpdateEntriesByID: true, }) if err != nil { @@ -334,9 +334,10 @@ func (b *Bitmex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bitmex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { book := &orderbook.Base{ - ExchangeName: b.Name, - Pair: p, - AssetType: assetType, + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, } if assetType == asset.Index { diff --git a/exchanges/bitstamp/bitstamp_websocket.go b/exchanges/bitstamp/bitstamp_websocket.go index 5285960a..58c56268 100644 --- a/exchanges/bitstamp/bitstamp_websocket.go +++ b/exchanges/bitstamp/bitstamp_websocket.go @@ -239,12 +239,13 @@ func (b *Bitstamp) wsUpdateOrderbook(update websocketOrderBook, p currency.Pair, bids = append(bids, orderbook.Item{Price: target, Amount: amount}) } return b.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{ - Bids: bids, - Asks: asks, - Pair: p, - LastUpdated: time.Unix(update.Timestamp, 0), - AssetType: assetType, - ExchangeName: b.Name, + Bids: bids, + Asks: asks, + Pair: p, + LastUpdated: time.Unix(update.Timestamp, 0), + AssetType: assetType, + ExchangeName: b.Name, + VerificationBypass: b.OrderbookVerificationBypass, }) } @@ -276,6 +277,7 @@ func (b *Bitstamp) seedOrderBook() error { newOrderBook.Pair = p[x] newOrderBook.AssetType = asset.Spot newOrderBook.ExchangeName = b.Name + newOrderBook.VerificationBypass = b.OrderbookVerificationBypass err = b.Websocket.Orderbook.LoadSnapshot(&newOrderBook) if err != nil { diff --git a/exchanges/bitstamp/bitstamp_wrapper.go b/exchanges/bitstamp/bitstamp_wrapper.go index 8ee4e6c0..838f58fb 100644 --- a/exchanges/bitstamp/bitstamp_wrapper.go +++ b/exchanges/bitstamp/bitstamp_wrapper.go @@ -164,8 +164,8 @@ func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error { UnSubscriber: b.Unsubscribe, GenerateSubscriptions: b.generateDefaultSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -316,7 +316,12 @@ func (b *Bitstamp) FetchOrderbook(p currency.Pair, assetType asset.Item) (*order // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bitstamp) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } fPair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/bittrex/bittrex_wrapper.go b/exchanges/bittrex/bittrex_wrapper.go index e48baf91..c1c3dd26 100644 --- a/exchanges/bittrex/bittrex_wrapper.go +++ b/exchanges/bittrex/bittrex_wrapper.go @@ -328,7 +328,12 @@ func (b *Bittrex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderb // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *Bittrex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } fpair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/btcmarkets/btcmarkets_websocket.go b/exchanges/btcmarkets/btcmarkets_websocket.go index 4c79f837..5df16d99 100644 --- a/exchanges/btcmarkets/btcmarkets_websocket.go +++ b/exchanges/btcmarkets/btcmarkets_websocket.go @@ -118,12 +118,13 @@ func (b *BTCMarkets) wsHandleData(respRaw []byte) error { } if ob.Snapshot { err = b.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{ - Pair: p, - Bids: orderbook.SortBids(bids), // Alignment completely out sort is needed - Asks: asks, - LastUpdated: ob.Timestamp, - AssetType: asset.Spot, - ExchangeName: b.Name, + Pair: p, + Bids: orderbook.SortBids(bids), // Alignment completely out sort is needed + Asks: asks, + LastUpdated: ob.Timestamp, + AssetType: asset.Spot, + ExchangeName: b.Name, + VerificationBypass: b.OrderbookVerificationBypass, }) } else { err = b.Websocket.Orderbook.Update(&buffer.Update{ diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index 2979d903..aaecf9a7 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -155,8 +155,8 @@ func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error { Subscriber: b.Subscribe, GenerateSubscriptions: b.generateDefaultSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, }) if err != nil { @@ -352,9 +352,12 @@ func (b *BTCMarkets) FetchOrderbook(p currency.Pair, assetType asset.Item) (*ord // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *BTCMarkets) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { book := &orderbook.Base{ - ExchangeName: b.Name, - Pair: p, - AssetType: assetType, NotAggregated: true} + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + NotAggregated: true, + VerificationBypass: b.OrderbookVerificationBypass, + } fpair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { diff --git a/exchanges/btse/btse_websocket.go b/exchanges/btse/btse_websocket.go index 3f937005..ee308f9d 100644 --- a/exchanges/btse/btse_websocket.go +++ b/exchanges/btse/btse_websocket.go @@ -282,6 +282,7 @@ func (b *BTSE) wsHandleData(respRaw []byte) error { newOB.AssetType = a newOB.ExchangeName = b.Name orderbook.Reverse(newOB.Asks) // Reverse asks for correct alignment + newOB.VerificationBypass = b.OrderbookVerificationBypass err = b.Websocket.Orderbook.LoadSnapshot(&newOB) if err != nil { return err diff --git a/exchanges/btse/btse_wrapper.go b/exchanges/btse/btse_wrapper.go index 99b620dc..0563cb11 100644 --- a/exchanges/btse/btse_wrapper.go +++ b/exchanges/btse/btse_wrapper.go @@ -184,8 +184,8 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error { UnSubscriber: b.Unsubscribe, GenerateSubscriptions: b.GenerateDefaultSubscriptions, Features: &b.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -319,7 +319,12 @@ func (b *BTSE) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook // UpdateOrderbook updates and returns the orderbook for a currency pair func (b *BTSE) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: b.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: b.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: b.OrderbookVerificationBypass, + } fPair, err := b.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/coinbasepro/coinbasepro_websocket.go b/exchanges/coinbasepro/coinbasepro_websocket.go index b0853848..621ab0bc 100644 --- a/exchanges/coinbasepro/coinbasepro_websocket.go +++ b/exchanges/coinbasepro/coinbasepro_websocket.go @@ -312,6 +312,7 @@ func (c *CoinbasePro) ProcessSnapshot(snapshot *WebsocketOrderbookSnapshot) erro base.AssetType = asset.Spot base.Pair = pair base.ExchangeName = c.Name + base.VerificationBypass = c.OrderbookVerificationBypass return c.Websocket.Orderbook.LoadSnapshot(&base) } diff --git a/exchanges/coinbasepro/coinbasepro_wrapper.go b/exchanges/coinbasepro/coinbasepro_wrapper.go index e6a0778c..17b53699 100644 --- a/exchanges/coinbasepro/coinbasepro_wrapper.go +++ b/exchanges/coinbasepro/coinbasepro_wrapper.go @@ -166,8 +166,8 @@ func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error { UnSubscriber: c.Unsubscribe, GenerateSubscriptions: c.GenerateDefaultSubscriptions, Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, }) if err != nil { @@ -400,7 +400,12 @@ func (c *CoinbasePro) FetchOrderbook(p currency.Pair, assetType asset.Item) (*or // UpdateOrderbook updates and returns the orderbook for a currency pair func (c *CoinbasePro) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: c.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: c.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: c.OrderbookVerificationBypass, + } fpair, err := c.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/coinbene/coinbene_websocket.go b/exchanges/coinbene/coinbene_websocket.go index bac636f6..407914c9 100644 --- a/exchanges/coinbene/coinbene_websocket.go +++ b/exchanges/coinbene/coinbene_websocket.go @@ -289,6 +289,7 @@ func (c *Coinbene) wsHandleData(respRaw []byte) error { newOB.Pair = newPair newOB.ExchangeName = c.Name newOB.LastUpdated = time.Unix(orderBook.Data[0].Timestamp, 0) + newOB.VerificationBypass = c.OrderbookVerificationBypass err = c.Websocket.Orderbook.LoadSnapshot(&newOB) if err != nil { return err diff --git a/exchanges/coinbene/coinbene_wrapper.go b/exchanges/coinbene/coinbene_wrapper.go index 63a87971..d79bb4aa 100644 --- a/exchanges/coinbene/coinbene_wrapper.go +++ b/exchanges/coinbene/coinbene_wrapper.go @@ -181,8 +181,8 @@ func (c *Coinbene) Setup(exch *config.ExchangeConfig) error { UnSubscriber: c.Unsubscribe, GenerateSubscriptions: c.GenerateDefaultSubscriptions, Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, }) if err != nil { @@ -405,7 +405,12 @@ func (c *Coinbene) FetchOrderbook(p currency.Pair, assetType asset.Item) (*order // UpdateOrderbook updates and returns the orderbook for a currency pair func (c *Coinbene) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: c.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: c.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: c.OrderbookVerificationBypass, + } if !c.SupportsAsset(assetType) { return book, fmt.Errorf("%s does not support asset type %s", c.Name, assetType) diff --git a/exchanges/coinut/coinut_websocket.go b/exchanges/coinut/coinut_websocket.go index e7c4fe29..77ac3cdf 100644 --- a/exchanges/coinut/coinut_websocket.go +++ b/exchanges/coinut/coinut_websocket.go @@ -530,6 +530,7 @@ func (c *COINUT) WsProcessOrderbookSnapshot(ob *WsOrderbookSnapshot) error { var newOrderBook orderbook.Base newOrderBook.Asks = asks newOrderBook.Bids = bids + newOrderBook.VerificationBypass = c.OrderbookVerificationBypass pairs, err := c.GetEnabledPairs(asset.Spot) if err != nil { diff --git a/exchanges/coinut/coinut_wrapper.go b/exchanges/coinut/coinut_wrapper.go index 3fd1278f..ef0fdbc4 100644 --- a/exchanges/coinut/coinut_wrapper.go +++ b/exchanges/coinut/coinut_wrapper.go @@ -149,8 +149,8 @@ func (c *COINUT) Setup(exch *config.ExchangeConfig) error { UnSubscriber: c.Unsubscribe, GenerateSubscriptions: c.GenerateDefaultSubscriptions, Features: &c.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, SortBufferByUpdateIDs: true, }) @@ -453,7 +453,12 @@ func (c *COINUT) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (c *COINUT) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: c.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: c.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: c.OrderbookVerificationBypass, + } err := c.loadInstrumentsIfNotLoaded() if err != nil { return book, err diff --git a/exchanges/exchange.go b/exchanges/exchange.go index db921159..3e943a62 100644 --- a/exchanges/exchange.go +++ b/exchanges/exchange.go @@ -590,6 +590,7 @@ func (e *Base) SetupDefaults(exch *config.ExchangeConfig) error { return err } e.BaseCurrencies = exch.BaseCurrencies + e.OrderbookVerificationBypass = exch.OrderbookConfig.VerificationBypass return nil } diff --git a/exchanges/exchange_types.go b/exchanges/exchange_types.go index f7418053..816c4654 100644 --- a/exchanges/exchange_types.go +++ b/exchanges/exchange_types.go @@ -218,6 +218,7 @@ type Base struct { WebsocketOrderbookBufferLimit int64 Websocket *stream.Websocket *request.Requester - Config *config.ExchangeConfig - settingsMutex sync.RWMutex + Config *config.ExchangeConfig + settingsMutex sync.RWMutex + OrderbookVerificationBypass bool } diff --git a/exchanges/exmo/exmo_wrapper.go b/exchanges/exmo/exmo_wrapper.go index 322fa746..f9580a74 100644 --- a/exchanges/exmo/exmo_wrapper.go +++ b/exchanges/exmo/exmo_wrapper.go @@ -235,7 +235,12 @@ func (e *EXMO) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook // UpdateOrderbook updates and returns the orderbook for a currency pair func (e *EXMO) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - callingBook := &orderbook.Base{ExchangeName: e.Name, Pair: p, AssetType: assetType} + callingBook := &orderbook.Base{ + ExchangeName: e.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: e.OrderbookVerificationBypass, + } enabledPairs, err := e.GetEnabledPairs(assetType) if err != nil { return callingBook, err @@ -253,9 +258,11 @@ func (e *EXMO) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderboo for i := range enabledPairs { book := &orderbook.Base{ - ExchangeName: e.Name, - Pair: enabledPairs[i], - AssetType: assetType} + ExchangeName: e.Name, + Pair: enabledPairs[i], + AssetType: assetType, + VerificationBypass: e.OrderbookVerificationBypass, + } curr, err := e.FormatExchangeCurrency(enabledPairs[i], assetType) if err != nil { diff --git a/exchanges/ftx/ftx_websocket.go b/exchanges/ftx/ftx_websocket.go index 3902f2be..13ee4aae 100644 --- a/exchanges/ftx/ftx_websocket.go +++ b/exchanges/ftx/ftx_websocket.go @@ -513,6 +513,7 @@ func (f *FTX) WsProcessPartialOB(data *WsOrderbookData, p currency.Pair, a asset Pair: p, ExchangeName: f.Name, HasChecksumValidation: true, + VerificationBypass: f.OrderbookVerificationBypass, } return f.Websocket.Orderbook.LoadSnapshot(&newOrderBook) } diff --git a/exchanges/ftx/ftx_wrapper.go b/exchanges/ftx/ftx_wrapper.go index afe8cf98..d040dee8 100644 --- a/exchanges/ftx/ftx_wrapper.go +++ b/exchanges/ftx/ftx_wrapper.go @@ -176,8 +176,8 @@ func (f *FTX) Setup(exch *config.ExchangeConfig) error { UnSubscriber: f.Unsubscribe, GenerateSubscriptions: f.GenerateDefaultSubscriptions, Features: &f.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -333,7 +333,12 @@ func (f *FTX) FetchOrderbook(currency currency.Pair, assetType asset.Item) (*ord // UpdateOrderbook updates and returns the orderbook for a currency pair func (f *FTX) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: f.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: f.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: f.OrderbookVerificationBypass, + } formattedPair, err := f.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/gateio/gateio_websocket.go b/exchanges/gateio/gateio_websocket.go index 2871bf4f..d7c70cc4 100644 --- a/exchanges/gateio/gateio_websocket.go +++ b/exchanges/gateio/gateio_websocket.go @@ -353,6 +353,7 @@ func (g *Gateio) wsHandleData(respRaw []byte) error { newOrderBook.AssetType = asset.Spot newOrderBook.Pair = p newOrderBook.ExchangeName = g.Name + newOrderBook.VerificationBypass = g.OrderbookVerificationBypass err = g.Websocket.Orderbook.LoadSnapshot(&newOrderBook) if err != nil { diff --git a/exchanges/gateio/gateio_wrapper.go b/exchanges/gateio/gateio_wrapper.go index 1973a73c..f8116211 100644 --- a/exchanges/gateio/gateio_wrapper.go +++ b/exchanges/gateio/gateio_wrapper.go @@ -163,8 +163,8 @@ func (g *Gateio) Setup(exch *config.ExchangeConfig) error { Subscriber: g.Subscribe, GenerateSubscriptions: g.GenerateDefaultSubscriptions, Features: &g.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -278,7 +278,12 @@ func (g *Gateio) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (g *Gateio) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: g.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: g.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: g.OrderbookVerificationBypass, + } curr, err := g.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/gemini/gemini_websocket.go b/exchanges/gemini/gemini_websocket.go index 157b4f8d..1eb9538a 100644 --- a/exchanges/gemini/gemini_websocket.go +++ b/exchanges/gemini/gemini_websocket.go @@ -397,6 +397,7 @@ func (g *Gemini) wsProcessUpdate(result WsMarketUpdateResponse, pair currency.Pa newOrderBook.AssetType = asset.Spot newOrderBook.Pair = pair newOrderBook.ExchangeName = g.Name + newOrderBook.VerificationBypass = g.OrderbookVerificationBypass err := g.Websocket.Orderbook.LoadSnapshot(&newOrderBook) if err != nil { g.Websocket.DataHandler <- err diff --git a/exchanges/gemini/gemini_wrapper.go b/exchanges/gemini/gemini_wrapper.go index ae9bde8c..f1c9d350 100644 --- a/exchanges/gemini/gemini_wrapper.go +++ b/exchanges/gemini/gemini_wrapper.go @@ -142,8 +142,8 @@ func (g *Gemini) Setup(exch *config.ExchangeConfig) error { RunningURL: exch.API.Endpoints.WebsocketURL, Connector: g.WsConnect, Features: &g.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, }) } @@ -294,7 +294,12 @@ func (g *Gemini) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (g *Gemini) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: g.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: g.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: g.OrderbookVerificationBypass, + } fPair, err := g.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/hitbtc/hitbtc_websocket.go b/exchanges/hitbtc/hitbtc_websocket.go index 8782db66..0a05e317 100644 --- a/exchanges/hitbtc/hitbtc_websocket.go +++ b/exchanges/hitbtc/hitbtc_websocket.go @@ -330,6 +330,7 @@ func (h *HitBTC) WsProcessOrderbookSnapshot(ob WsOrderbook) error { newOrderBook.AssetType = asset.Spot newOrderBook.Pair = p newOrderBook.ExchangeName = h.Name + newOrderBook.VerificationBypass = h.OrderbookVerificationBypass return h.Websocket.Orderbook.LoadSnapshot(&newOrderBook) } diff --git a/exchanges/hitbtc/hitbtc_wrapper.go b/exchanges/hitbtc/hitbtc_wrapper.go index d11111a5..fcbb7fc2 100644 --- a/exchanges/hitbtc/hitbtc_wrapper.go +++ b/exchanges/hitbtc/hitbtc_wrapper.go @@ -165,8 +165,8 @@ func (h *HitBTC) Setup(exch *config.ExchangeConfig) error { UnSubscriber: h.Unsubscribe, GenerateSubscriptions: h.GenerateDefaultSubscriptions, Features: &h.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, SortBufferByUpdateIDs: true, }) @@ -366,7 +366,12 @@ func (h *HitBTC) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (h *HitBTC) UpdateOrderbook(c currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: h.Name, Pair: c, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: h.Name, + Pair: c, + AssetType: assetType, + VerificationBypass: h.OrderbookVerificationBypass, + } fpair, err := h.FormatExchangeCurrency(c, assetType) if err != nil { return book, err diff --git a/exchanges/huobi/huobi_websocket.go b/exchanges/huobi/huobi_websocket.go index 8672943d..04295fdf 100644 --- a/exchanges/huobi/huobi_websocket.go +++ b/exchanges/huobi/huobi_websocket.go @@ -465,6 +465,7 @@ func (h *HUOBI) WsProcessOrderbook(update *WsDepth, symbol string) error { newOrderBook.Pair = p newOrderBook.AssetType = asset.Spot newOrderBook.ExchangeName = h.Name + newOrderBook.VerificationBypass = h.OrderbookVerificationBypass return h.Websocket.Orderbook.LoadSnapshot(&newOrderBook) } diff --git a/exchanges/huobi/huobi_wrapper.go b/exchanges/huobi/huobi_wrapper.go index 3dc9ab5f..b6095cc2 100644 --- a/exchanges/huobi/huobi_wrapper.go +++ b/exchanges/huobi/huobi_wrapper.go @@ -163,8 +163,8 @@ func (h *HUOBI) Setup(exch *config.ExchangeConfig) error { UnSubscriber: h.Unsubscribe, GenerateSubscriptions: h.GenerateDefaultSubscriptions, Features: &h.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -386,7 +386,12 @@ func (h *HUOBI) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderboo // UpdateOrderbook updates and returns the orderbook for a currency pair func (h *HUOBI) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: h.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: h.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: h.OrderbookVerificationBypass, + } fpair, err := h.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/itbit/itbit_wrapper.go b/exchanges/itbit/itbit_wrapper.go index 3e692f0b..5b743d27 100644 --- a/exchanges/itbit/itbit_wrapper.go +++ b/exchanges/itbit/itbit_wrapper.go @@ -186,7 +186,13 @@ func (i *ItBit) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderboo // UpdateOrderbook updates and returns the orderbook for a currency pair func (i *ItBit) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: i.Name, Pair: p, AssetType: assetType, NotAggregated: true} + book := &orderbook.Base{ + ExchangeName: i.Name, + Pair: p, + AssetType: assetType, + NotAggregated: true, + VerificationBypass: i.OrderbookVerificationBypass, + } fpair, err := i.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/kraken/kraken_websocket.go b/exchanges/kraken/kraken_websocket.go index 015ec5e3..9c40fafa 100644 --- a/exchanges/kraken/kraken_websocket.go +++ b/exchanges/kraken/kraken_websocket.go @@ -791,8 +791,9 @@ func (k *Kraken) wsProcessOrderBook(channelData *WebsocketChannelData, data map[ // wsProcessOrderBookPartial creates a new orderbook entry for a given currency pair func (k *Kraken) wsProcessOrderBookPartial(channelData *WebsocketChannelData, askData, bidData []interface{}) error { base := orderbook.Base{ - Pair: channelData.Pair, - AssetType: asset.Spot, + Pair: channelData.Pair, + AssetType: asset.Spot, + VerificationBypass: k.OrderbookVerificationBypass, } // Kraken ob data is timestamped per price, GCT orderbook data is // timestamped per entry using the highest last update time, we can attempt diff --git a/exchanges/kraken/kraken_wrapper.go b/exchanges/kraken/kraken_wrapper.go index 38fbd0bc..4d437ff5 100644 --- a/exchanges/kraken/kraken_wrapper.go +++ b/exchanges/kraken/kraken_wrapper.go @@ -186,8 +186,8 @@ func (k *Kraken) Setup(exch *config.ExchangeConfig) error { UnSubscriber: k.Unsubscribe, GenerateSubscriptions: k.GenerateDefaultSubscriptions, Features: &k.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, }) if err != nil { @@ -425,7 +425,12 @@ func (k *Kraken) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbo // UpdateOrderbook updates and returns the orderbook for a currency pair func (k *Kraken) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: k.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: k.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: k.OrderbookVerificationBypass, + } fpair, err := k.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/lakebtc/lakebtc_websocket.go b/exchanges/lakebtc/lakebtc_websocket.go index 0e624688..aadb8cb8 100644 --- a/exchanges/lakebtc/lakebtc_websocket.go +++ b/exchanges/lakebtc/lakebtc_websocket.go @@ -174,10 +174,11 @@ func (l *LakeBTC) processOrderbook(obUpdate, channel string) error { } book := orderbook.Base{ - Pair: p, - LastUpdated: time.Now(), - AssetType: asset.Spot, - ExchangeName: l.Name, + Pair: p, + LastUpdated: time.Now(), + AssetType: asset.Spot, + ExchangeName: l.Name, + VerificationBypass: l.OrderbookVerificationBypass, } for i := range update.Asks { diff --git a/exchanges/lakebtc/lakebtc_wrapper.go b/exchanges/lakebtc/lakebtc_wrapper.go index 52202f4e..99ca9b4a 100644 --- a/exchanges/lakebtc/lakebtc_wrapper.go +++ b/exchanges/lakebtc/lakebtc_wrapper.go @@ -137,8 +137,8 @@ func (l *LakeBTC) Setup(exch *config.ExchangeConfig) error { UnSubscriber: l.Unsubscribe, GenerateSubscriptions: l.GenerateDefaultSubscriptions, Features: &l.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) } @@ -269,7 +269,12 @@ func (l *LakeBTC) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderb // UpdateOrderbook updates and returns the orderbook for a currency pair func (l *LakeBTC) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: l.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: l.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: l.OrderbookVerificationBypass, + } fPair, err := l.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/lbank/lbank_wrapper.go b/exchanges/lbank/lbank_wrapper.go index abd5e45e..c3810eb6 100644 --- a/exchanges/lbank/lbank_wrapper.go +++ b/exchanges/lbank/lbank_wrapper.go @@ -243,7 +243,12 @@ func (l *Lbank) FetchOrderbook(currency currency.Pair, assetType asset.Item) (*o // UpdateOrderbook updates and returns the orderbook for a currency pair func (l *Lbank) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: l.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: l.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: l.OrderbookVerificationBypass, + } fpair, err := l.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/localbitcoins/localbitcoins_wrapper.go b/exchanges/localbitcoins/localbitcoins_wrapper.go index d3ed063a..a7b30072 100644 --- a/exchanges/localbitcoins/localbitcoins_wrapper.go +++ b/exchanges/localbitcoins/localbitcoins_wrapper.go @@ -214,7 +214,12 @@ func (l *LocalBitcoins) FetchOrderbook(p currency.Pair, assetType asset.Item) (* // UpdateOrderbook updates and returns the orderbook for a currency pair func (l *LocalBitcoins) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: l.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: l.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: l.OrderbookVerificationBypass, + } orderbookNew, err := l.GetOrderbook(p.Quote.String()) if err != nil { return book, err diff --git a/exchanges/okex/okex_wrapper.go b/exchanges/okex/okex_wrapper.go index 68e8a1bc..f81040a1 100644 --- a/exchanges/okex/okex_wrapper.go +++ b/exchanges/okex/okex_wrapper.go @@ -700,7 +700,7 @@ func (o *OKEX) GetWithdrawalsHistory(c currency.Code) (resp []exchange.Withdrawa return nil, common.ErrNotYetImplemented } -// GetHistoricTrades returns historic trade data within the timeframe provided +// GetRecentTrades returns recent trade data func (o *OKEX) GetRecentTrades(p currency.Pair, assetType asset.Item) ([]trade.Data, error) { var err error p, err = o.FormatExchangeCurrency(p, assetType) diff --git a/exchanges/okgroup/okgroup_websocket.go b/exchanges/okgroup/okgroup_websocket.go index 381f5d9f..bb3168cf 100644 --- a/exchanges/okgroup/okgroup_websocket.go +++ b/exchanges/okgroup/okgroup_websocket.go @@ -685,6 +685,7 @@ func (o *OKGroup) WsProcessPartialOrderBook(wsEventData *WebsocketOrderBook, ins Pair: instrument, ExchangeName: o.Name, HasChecksumValidation: true, + VerificationBypass: o.OrderbookVerificationBypass, } return o.Websocket.Orderbook.LoadSnapshot(&newOrderBook) } diff --git a/exchanges/okgroup/okgroup_wrapper.go b/exchanges/okgroup/okgroup_wrapper.go index 11e49b25..ef6b321c 100644 --- a/exchanges/okgroup/okgroup_wrapper.go +++ b/exchanges/okgroup/okgroup_wrapper.go @@ -49,8 +49,8 @@ func (o *OKGroup) Setup(exch *config.ExchangeConfig) error { UnSubscriber: o.Unsubscribe, GenerateSubscriptions: o.GenerateDefaultSubscriptions, Features: &o.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -79,9 +79,10 @@ func (o *OKGroup) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderb // UpdateOrderbook updates and returns the orderbook for a currency pair func (o *OKGroup) UpdateOrderbook(p currency.Pair, a asset.Item) (*orderbook.Base, error) { book := &orderbook.Base{ - ExchangeName: o.Name, - Pair: p, - AssetType: a, + ExchangeName: o.Name, + Pair: p, + AssetType: a, + VerificationBypass: o.OrderbookVerificationBypass, } if a == asset.Index { diff --git a/exchanges/orderbook/orderbook.go b/exchanges/orderbook/orderbook.go index ff11e77d..f5e664be 100644 --- a/exchanges/orderbook/orderbook.go +++ b/exchanges/orderbook/orderbook.go @@ -275,13 +275,12 @@ func (b *Base) Process() error { b.LastUpdated = time.Now() } - if !b.HasChecksumValidation { + if !b.VerificationBypass && !b.HasChecksumValidation { err := b.Verify() if err != nil { return err } } - return service.Update(b) } diff --git a/exchanges/orderbook/orderbook_types.go b/exchanges/orderbook/orderbook_types.go index eb3b33a9..48f53342 100644 --- a/exchanges/orderbook/orderbook_types.go +++ b/exchanges/orderbook/orderbook_types.go @@ -85,6 +85,9 @@ type Base struct { NotAggregated bool `json:"-"` IsFundingRate bool `json:"fundingRate"` + // VerificationBypass is a complete orderbook verification bypass set by + // user configuration + VerificationBypass bool `json:"-"` // HasChecksumValidation defines an allowance to bypass internal // verification if the book has been verified by checksum. HasChecksumValidation bool `json:"-"` diff --git a/exchanges/poloniex/poloniex_websocket.go b/exchanges/poloniex/poloniex_websocket.go index 6037570d..7ff3f25c 100644 --- a/exchanges/poloniex/poloniex_websocket.go +++ b/exchanges/poloniex/poloniex_websocket.go @@ -506,6 +506,7 @@ func (p *Poloniex) WsProcessOrderbookSnapshot(ob []interface{}, symbol string) e book.Asks = orderbook.SortAsks(book.Asks) book.Bids = orderbook.SortBids(book.Bids) book.AssetType = asset.Spot + book.VerificationBypass = p.OrderbookVerificationBypass var err error book.Pair, err = currency.NewPairFromString(symbol) diff --git a/exchanges/poloniex/poloniex_wrapper.go b/exchanges/poloniex/poloniex_wrapper.go index b2200a4a..9b72b325 100644 --- a/exchanges/poloniex/poloniex_wrapper.go +++ b/exchanges/poloniex/poloniex_wrapper.go @@ -166,8 +166,8 @@ func (p *Poloniex) Setup(exch *config.ExchangeConfig) error { UnSubscriber: p.Unsubscribe, GenerateSubscriptions: p.GenerateDefaultSubscriptions, Features: &p.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, SortBuffer: true, SortBufferByUpdateIDs: true, }) @@ -320,7 +320,12 @@ func (p *Poloniex) FetchOrderbook(currencyPair currency.Pair, assetType asset.It // UpdateOrderbook updates and returns the orderbook for a currency pair func (p *Poloniex) UpdateOrderbook(c currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - callingBook := &orderbook.Base{ExchangeName: p.Name, Pair: c, AssetType: assetType} + callingBook := &orderbook.Base{ + ExchangeName: p.Name, + Pair: c, + AssetType: assetType, + VerificationBypass: p.OrderbookVerificationBypass, + } orderbookNew, err := p.GetOrderbook("", poloniexMaxOrderbookDepth) if err != nil { return callingBook, err @@ -332,9 +337,11 @@ func (p *Poloniex) UpdateOrderbook(c currency.Pair, assetType asset.Item) (*orde } for i := range enabledPairs { book := &orderbook.Base{ - ExchangeName: p.Name, - Pair: enabledPairs[i], - AssetType: assetType} + ExchangeName: p.Name, + Pair: enabledPairs[i], + AssetType: assetType, + VerificationBypass: p.OrderbookVerificationBypass, + } fpair, err := p.FormatExchangeCurrency(enabledPairs[i], assetType) if err != nil { diff --git a/exchanges/yobit/yobit_wrapper.go b/exchanges/yobit/yobit_wrapper.go index ea2113e8..5e2b6042 100644 --- a/exchanges/yobit/yobit_wrapper.go +++ b/exchanges/yobit/yobit_wrapper.go @@ -236,7 +236,12 @@ func (y *Yobit) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderboo // UpdateOrderbook updates and returns the orderbook for a currency pair func (y *Yobit) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: y.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: y.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: y.OrderbookVerificationBypass, + } fpair, err := y.FormatExchangeCurrency(p, assetType) if err != nil { return book, err diff --git a/exchanges/zb/zb_websocket.go b/exchanges/zb/zb_websocket.go index a1d1e98c..09c9f7c2 100644 --- a/exchanges/zb/zb_websocket.go +++ b/exchanges/zb/zb_websocket.go @@ -147,6 +147,7 @@ func (z *ZB) wsHandleData(respRaw []byte) error { book.AssetType = asset.Spot book.Pair = cPair book.ExchangeName = z.Name + book.VerificationBypass = z.OrderbookVerificationBypass err = z.Websocket.Orderbook.LoadSnapshot(&book) if err != nil { diff --git a/exchanges/zb/zb_wrapper.go b/exchanges/zb/zb_wrapper.go index d6f186a9..79bcfdce 100644 --- a/exchanges/zb/zb_wrapper.go +++ b/exchanges/zb/zb_wrapper.go @@ -166,8 +166,8 @@ func (z *ZB) Setup(exch *config.ExchangeConfig) error { GenerateSubscriptions: z.GenerateDefaultSubscriptions, Subscriber: z.Subscribe, Features: &z.Features.Supports.WebsocketCapabilities, - OrderbookBufferLimit: exch.WebsocketOrderbookBufferLimit, - BufferEnabled: exch.WebsocketOrderbookBufferEnabled, + OrderbookBufferLimit: exch.OrderbookConfig.WebsocketBufferLimit, + BufferEnabled: exch.OrderbookConfig.WebsocketBufferEnabled, }) if err != nil { return err @@ -292,7 +292,12 @@ func (z *ZB) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.B // UpdateOrderbook updates and returns the orderbook for a currency pair func (z *ZB) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ExchangeName: z.Name, Pair: p, AssetType: assetType} + book := &orderbook.Base{ + ExchangeName: z.Name, + Pair: p, + AssetType: assetType, + VerificationBypass: z.OrderbookVerificationBypass, + } currFormat, err := z.FormatExchangeCurrency(p, assetType) if err != nil { return book, err