Skip to content

Commit

Permalink
GateIO: Abstract GetOpenInterest and rename GetSingle*Contracts
Browse files Browse the repository at this point in the history
  • Loading branch information
gbjk committed Jan 4, 2025
1 parent 8f662b1 commit da2beaa
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 127 deletions.
8 changes: 4 additions & 4 deletions exchanges/gateio/gateio.go
Original file line number Diff line number Diff line change
Expand Up @@ -1841,8 +1841,8 @@ func (g *Gateio) GetAllFutureContracts(ctx context.Context, settle currency.Code
return contracts, g.SendHTTPRequest(ctx, exchange.RestSpot, publicFuturesContractsEPL, futuresPath+settle.Item.Lower+"/contracts", &contracts)
}

// GetSingleContract returns a single contract info for the specified settle and Currency Pair (contract << in this case)
func (g *Gateio) GetSingleContract(ctx context.Context, settle currency.Code, contract string) (*FuturesContract, error) {
// GetFuturesContract returns a single futures contract info for the specified settle and Currency Pair (contract << in this case)
func (g *Gateio) GetFuturesContract(ctx context.Context, settle currency.Code, contract string) (*FuturesContract, error) {
if contract == "" {
return nil, currency.ErrCurrencyPairEmpty
}
Expand Down Expand Up @@ -2622,8 +2622,8 @@ func (g *Gateio) GetAllDeliveryContracts(ctx context.Context, settle currency.Co
return contracts, g.SendHTTPRequest(ctx, exchange.RestSpot, publicDeliveryContractsEPL, deliveryPath+settle.Item.Lower+"/contracts", &contracts)
}

// GetSingleDeliveryContracts retrieves a single delivery contract instance.
func (g *Gateio) GetSingleDeliveryContracts(ctx context.Context, settle currency.Code, contract currency.Pair) (*DeliveryContract, error) {
// GetDeliveryContract retrieves a single delivery contract instance
func (g *Gateio) GetDeliveryContract(ctx context.Context, settle currency.Code, contract currency.Pair) (*DeliveryContract, error) {
if settle.IsEmpty() {
return nil, errEmptyOrInvalidSettlementCurrency
}
Expand Down
180 changes: 57 additions & 123 deletions exchanges/gateio/gateio_wrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -2143,7 +2143,7 @@ func (g *Gateio) GetLatestFundingRates(ctx context.Context, r *fundingrate.Lates
if err != nil {
return nil, err
}
contract, err := g.GetSingleContract(ctx, settlementCurrency, fPair.String())
contract, err := g.GetFuturesContract(ctx, settlementCurrency, fPair.String())
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -2202,138 +2202,72 @@ func contractToFundingRate(name string, item asset.Item, fPair currency.Pair, co
}

// GetOpenInterest returns the open interest rate for a given asset pair
func (g *Gateio) GetOpenInterest(ctx context.Context, k ...key.PairAsset) ([]futures.OpenInterest, error) {
for i := range k {
if k[i].Asset != asset.DeliveryFutures && k[i].Asset != asset.Futures {
// avoid API calls or returning errors after a successful retrieval
return nil, fmt.Errorf("%w %v %v", asset.ErrNotSupported, k[i].Asset, k[i].Pair())
}
}
if len(k) == 1 {
p, isEnabled, err := g.MatchSymbolCheckEnabled(k[0].Pair().String(), k[0].Asset, false)
// If no pairs are provided, all enabled pairs will be used
func (g *Gateio) GetOpenInterest(ctx context.Context, keys ...key.PairAsset) ([]futures.OpenInterest, error) {
var errs error
for _, a := range []asset.Item{asset.DeliveryFutures, asset.CoinMarginedFutures, asset.USDTMarginedFutures} {
pairs, err := g.GetEnabledPairs(a)
if err != nil {
return nil, err
}
if !isEnabled {
return nil, fmt.Errorf("%w: %v", currency.ErrPairNotEnabled, k[0].Pair())
continue
}
switch k[0].Asset {
case asset.DeliveryFutures:
contractResp, err := g.GetSingleDeliveryContracts(ctx, currency.USDT, p)
if err != nil {
return nil, err
if len(keys) == 0 {
for _, p := range pairs {
keys = append(keys, key.PairAsset{
Asset: a,
Base: p.Base.Item,
Quote: p.Quote.Item,
})
}
openInterest := contractResp.QuantoMultiplier.Float64() * float64(contractResp.PositionSize) * contractResp.IndexPrice.Float64()
return []futures.OpenInterest{
{
Key: key.ExchangePairAsset{
Exchange: g.Name,
Base: k[0].Base,
Quote: k[0].Quote,
Asset: k[0].Asset,
},
OpenInterest: openInterest,
},
}, nil
case asset.Futures:
for _, s := range settlementCurrencies {
contractResp, err := g.GetSingleContract(ctx, s, p.String())
if err != nil {
continue
} else {
for _, k := range keys {
if p := k.Pair(); !pairs.Contains(p, true) {
return nil, fmt.Errorf("%w: %s %s", currency.ErrPairNotEnabled, a, p)
}
openInterest := contractResp.QuantoMultiplier.Float64() * float64(contractResp.PositionSize) * contractResp.IndexPrice.Float64()
return []futures.OpenInterest{
{
Key: key.ExchangePairAsset{
Exchange: g.Name,
Base: k[0].Base,
Quote: k[0].Quote,
Asset: k[0].Asset,
},
OpenInterest: openInterest,
},
}, nil
}
}
}
var resp []futures.OpenInterest
for _, a := range g.GetAssetTypes(true) {
switch a {
resp := make([]futures.OpenInterest, 0, len(keys))
for _, k := range keys {
p, isEnabled, err := g.MatchSymbolCheckEnabled(k.Pair().String(), k.Asset, false)
if !isEnabled {
err = currency.ErrPairNotEnabled
}
if err != nil {
errs = common.AppendError(errs, err)
err = fmt.Errorf("%w: %s", asset.ErrNotEnabled, k.Pair())
continue
}
settlementCurrency := currency.USDT
var openInterest float64
switch k.Asset {
case asset.DeliveryFutures:
contractResp, err := g.GetAllDeliveryContracts(ctx, currency.USDT)
if err != nil {
return nil, err
}

for i := range contractResp {
p, isEnabled, err := g.MatchSymbolCheckEnabled(contractResp[i].Name, a, true)
if err != nil && !errors.Is(err, currency.ErrPairNotFound) {
return nil, err
}
if !isEnabled {
continue
}
var appendData bool
for j := range k {
if k[j].Pair().Equal(p) {
appendData = true
break
}
}
if len(k) > 0 && !appendData {
continue
}
openInterest := contractResp[i].QuantoMultiplier.Float64() * float64(contractResp[i].PositionSize) * contractResp[i].IndexPrice.Float64()
resp = append(resp, futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: g.Name,
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
},
OpenInterest: openInterest,
})
}
case asset.Futures:
for _, s := range settlementCurrencies {
contractResp, err := g.GetAllFutureContracts(ctx, s)
if err != nil {
return nil, err
}

for i := range contractResp {
p, isEnabled, err := g.MatchSymbolCheckEnabled(contractResp[i].Name, a, true)
if err != nil && !errors.Is(err, currency.ErrPairNotFound) {
return nil, err
}
if !isEnabled {
continue
}
var appendData bool
for j := range k {
if k[j].Pair().Equal(p) {
appendData = true
break
}
}
if len(k) > 0 && !appendData {
continue
}
openInterest := contractResp[i].QuantoMultiplier.Float64() * float64(contractResp[i].PositionSize) * contractResp[i].IndexPrice.Float64()
resp = append(resp, futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: g.Name,
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
},
OpenInterest: openInterest,
})
}
}
contractResp, err2 := g.GetDeliveryContract(ctx, currency.USDT, p)
err = err2
openInterest = contractResp.QuantoMultiplier.Float64() * float64(contractResp.PositionSize) * contractResp.IndexPrice.Float64()
case asset.CoinMarginedFutures:
settlementCurrency = currency.BTC
fallthrough
case asset.USDTMarginedFutures:
contractResp, err2 := g.GetFuturesContract(ctx, settlementCurrency, p.String())
err = err2
openInterest = contractResp.QuantoMultiplier.Float64() * float64(contractResp.PositionSize) * contractResp.IndexPrice.Float64()
default:
err = fmt.Errorf("%w %s %s", asset.ErrNotSupported, k.Asset, k.Pair())
}
if err != nil {
return nil, err
}
resp = append(resp, futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: g.Name,
Base: k.Base,
Quote: k.Quote,
Asset: k.Asset,
},
OpenInterest: openInterest,
})
}
return resp, nil
return slices.Clip(resp), errs
}

// getClientOrderIDFromText returns the client order ID from the text response
Expand Down

0 comments on commit da2beaa

Please sign in to comment.