mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-02 15:10:46 +00:00
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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user