exchanges/futures: Implement open interest (#1417)

* adds open interest to exchanges

* ADDS TESTING YEAH

* New endpoints, BTSE, RPCS, cached

* slight design change, begin gateio

You will need to get cached for
each exchange that supports it

* gateio, huobi, rpc

* fix up kraken, cache retrieval

* okx, gateio

* finalising all implementations and tests

* definitely my final ever commit on this

* Well, well, well

* final v2

* quick fix of bug

* test coverage, assert notempty, test helper

Added a new testhelper for currency
management because its very annoying
in a parallel test setting which wastes
so much space otherwise

* minimises REST requests for Open Interest

* types.Number merge misses

* Minimises Kraken REST calls

* len change, value -> pointer receiver

* further fixup

* fixes gateio, batch calculates open interest

* single gateio, lint const fixes

* rejig and more thorough oi for huobi

* formatting expansion

* minor fix for handling expiring contracts

* rm unused Binance strings

* add bybit support, fix bybit issues

* oopsie doopsie, dont look at my whoopsie

* Fix issue, remove feature

* move an irrelevant function for the pr

* mini bybit upgrades

* fixes cli request bug
This commit is contained in:
Scott
2024-01-12 15:27:35 +11:00
committed by GitHub
parent 614042110a
commit b71bf1f3d1
62 changed files with 22660 additions and 10095 deletions

View File

@@ -6,6 +6,7 @@ import (
"fmt"
"net"
"net/url"
"sort"
"strconv"
"strings"
"time"
@@ -13,6 +14,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/common/convert"
"github.com/thrasher-corp/gocryptotrader/common/key"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
@@ -26,6 +28,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/exchanges/protocol"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/stream"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/exchanges/trade"
"github.com/thrasher-corp/gocryptotrader/log"
"github.com/thrasher-corp/gocryptotrader/portfolio/banking"
@@ -1333,6 +1336,57 @@ func (e *Endpoints) GetURLMap() map[string]string {
return urlMap
}
// GetCachedOpenInterest returns open interest data if the exchange
// supports open interest in ticker data
func (b *Base) GetCachedOpenInterest(_ context.Context, k ...key.PairAsset) ([]futures.OpenInterest, error) {
if !b.Features.Supports.FuturesCapabilities.OpenInterest.Supported ||
!b.Features.Supports.FuturesCapabilities.OpenInterest.SupportedViaTicker {
return nil, common.ErrFunctionNotSupported
}
if len(k) == 0 {
ticks, err := ticker.GetExchangeTickers(b.Name)
if err != nil {
return nil, err
}
resp := make([]futures.OpenInterest, 0, len(ticks))
for i := range ticks {
if ticks[i].OpenInterest <= 0 {
continue
}
resp = append(resp, futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: b.Name,
Base: ticks[i].Pair.Base.Item,
Quote: ticks[i].Pair.Quote.Item,
Asset: ticks[i].AssetType,
},
OpenInterest: ticks[i].OpenInterest,
})
}
sort.Slice(resp, func(i, j int) bool {
return resp[i].Key.Base.Symbol < resp[j].Key.Base.Symbol
})
return resp, nil
}
resp := make([]futures.OpenInterest, len(k))
for i := range k {
t, err := ticker.GetTicker(b.Name, k[i].Pair(), k[i].Asset)
if err != nil {
return nil, err
}
resp[i] = futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: b.Name,
Base: t.Pair.Base.Item,
Quote: t.Pair.Quote.Item,
Asset: t.AssetType,
},
OpenInterest: t.OpenInterest,
}
}
return resp, nil
}
// FormatSymbol formats the given pair to a string suitable for exchange API requests
func (b *Base) FormatSymbol(pair currency.Pair, assetType asset.Item) (string, error) {
pairFmt, err := b.GetPairFormat(assetType, true)
@@ -1752,3 +1806,8 @@ func (b *Base) MatchSymbolCheckEnabled(symbol string, a asset.Item, hasDelimiter
func (b *Base) IsPairEnabled(pair currency.Pair, a asset.Item) (bool, error) {
return b.CurrencyPairs.IsPairEnabled(pair, a)
}
// GetOpenInterest returns the open interest rate for a given asset pair
func (b *Base) GetOpenInterest(context.Context, ...key.PairAsset) ([]futures.OpenInterest, error) {
return nil, common.ErrFunctionNotSupported
}