mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-20 15:10:10 +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:
@@ -24,6 +24,7 @@ import (
|
||||
"github.com/thrasher-corp/gocryptotrader/common/crypto"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/file"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/file/archive"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/key"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/timeperiods"
|
||||
"github.com/thrasher-corp/gocryptotrader/currency"
|
||||
"github.com/thrasher-corp/gocryptotrader/database"
|
||||
@@ -5948,3 +5949,53 @@ func (s *RPCServer) ChangePositionMargin(ctx context.Context, r *gctrpc.ChangePo
|
||||
MarginSide: r.MarginSide,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// GetOpenInterest fetches the open interest from the exchange
|
||||
func (s *RPCServer) GetOpenInterest(ctx context.Context, r *gctrpc.GetOpenInterestRequest) (*gctrpc.GetOpenInterestResponse, error) {
|
||||
if r == nil {
|
||||
return nil, fmt.Errorf("%w GetOpenInterestRequest", common.ErrNilPointer)
|
||||
}
|
||||
exch, err := s.GetExchangeByName(r.Exchange)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !exch.IsEnabled() {
|
||||
return nil, fmt.Errorf("%s %w", r.Exchange, errExchangeNotEnabled)
|
||||
}
|
||||
feat := exch.GetSupportedFeatures()
|
||||
if !feat.FuturesCapabilities.OpenInterest.Supported {
|
||||
return nil, common.ErrFunctionNotSupported
|
||||
}
|
||||
keys := make([]key.PairAsset, len(r.Data))
|
||||
for i := range r.Data {
|
||||
var a asset.Item
|
||||
a, err = asset.New(r.Data[i].Asset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
keys[i].Base = currency.NewCode(r.Data[i].Pair.Base).Item
|
||||
keys[i].Quote = currency.NewCode(r.Data[i].Pair.Quote).Item
|
||||
keys[i].Asset = a
|
||||
}
|
||||
|
||||
openInterest, err := exch.GetOpenInterest(ctx, keys...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := make([]*gctrpc.OpenInterestDataResponse, len(openInterest))
|
||||
for i := range openInterest {
|
||||
resp[i] = &gctrpc.OpenInterestDataResponse{
|
||||
Exchange: openInterest[i].Key.Exchange,
|
||||
Pair: &gctrpc.CurrencyPair{
|
||||
Base: openInterest[i].Key.Base.String(),
|
||||
Quote: openInterest[i].Key.Quote.String(),
|
||||
},
|
||||
Asset: openInterest[i].Key.Asset.String(),
|
||||
OpenInterest: openInterest[i].OpenInterest,
|
||||
}
|
||||
}
|
||||
return &gctrpc.GetOpenInterestResponse{
|
||||
Data: resp,
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user