exchange/order/limits: Migrate to new package and integrate with exchanges (#1860)

* move limits, transition to key gen

* rollout NewExchangePairAssetKey everywhere

* test improvements

* self-review fixes

* ok, lets go

* fix merge issue

* slower value func,assertify,drop IsValidPairString

* remove binance reference for backtesting test

* Redundant nil checks removed due to redundancy

* Update order_test.go

* Move limits back into /exchanges/

* puts limits in a different box again

* SHAZBERT SPECIAL SUGGESTIONS

* Update gateio_wrapper.go

* fixes all build issues

* Many niteroos!

* something has gone awry

* bugfix

* gk's everywhere nits

* lint

* extra lint

* re-remove IsValidPairString

* lint fix

* standardise test

* revert some bads

* dupe rm

* another revert 360 mcgee

* un-in-revertify

* Update exchange/order/limits/levels_test.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

* fix

* Update exchanges/binance/binance_test.go

HERE'S HOPING GITHUB FORMATS THIS CORRECTLY!

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* update text

* rn func, same line err gk4202000

---------

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>
This commit is contained in:
Scott
2025-08-26 12:30:21 +10:00
committed by GitHub
parent fc0f262c42
commit 85403fe801
103 changed files with 1751 additions and 2168 deletions

View File

@@ -3822,23 +3822,18 @@ func TestGetLatestFundingRates(t *testing.T) {
func TestUpdateOrderExecutionLimits(t *testing.T) {
t.Parallel()
err := e.UpdateOrderExecutionLimits(t.Context(), asset.Spot)
require.NoErrorf(t, err, "Error fetching %s pairs for test: %v", asset.Spot, err)
instrumentInfo, err := e.GetInstruments(t.Context(), currency.BTC, e.GetAssetKind(asset.Spot), false)
require.NoError(t, err)
require.NotEmpty(t, instrumentInfo, "instrument information must not be empty")
limits, err := e.GetOrderExecutionLimits(asset.Spot, spotTradablePair)
require.NoErrorf(t, err, "Asset: %s Pair: %s Err: %v", asset.Spot, spotTradablePair, err)
var instrumentDetail *InstrumentData
for a := range instrumentInfo {
if instrumentInfo[a].InstrumentName == spotTradablePair.String() {
instrumentDetail = instrumentInfo[a]
break
}
for _, a := range e.GetAssetTypes(false) {
t.Run(a.String(), func(t *testing.T) {
t.Parallel()
require.NoError(t, e.UpdateOrderExecutionLimits(t.Context(), a), "UpdateOrderExecutionLimits must not error")
pairs, err := e.CurrencyPairs.GetPairs(a, true)
require.NoError(t, err, "GetPairs must not error")
l, err := e.GetOrderExecutionLimits(a, pairs[0])
require.NoError(t, err, "GetOrderExecutionLimits must not error")
assert.Positive(t, l.MinimumBaseAmount, "MinimumBaseAmount should be positive")
assert.Positive(t, l.PriceStepIncrementSize, "PriceStepIncrementSize should be positive")
})
}
require.NotNil(t, instrumentDetail, "instrument required to be found")
require.Equalf(t, instrumentDetail.TickSize, limits.PriceStepIncrementSize, "Asset: %s Pair: %s Expected: %f Got: %f", asset.Spot, spotTradablePair, instrumentDetail.TickSize, limits.MinimumBaseAmount)
assert.Equalf(t, instrumentDetail.MinimumTradeAmount, limits.MinimumBaseAmount, "Pair: %s Expected: %f Got: %f", spotTradablePair, instrumentDetail.MinimumTradeAmount, limits.MinimumBaseAmount)
}
func TestGetLockedStatus(t *testing.T) {

View File

@@ -14,6 +14,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/common/key"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchange/order/limits"
"github.com/thrasher-corp/gocryptotrader/exchange/websocket"
"github.com/thrasher-corp/gocryptotrader/exchange/websocket/buffer"
exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
@@ -1220,13 +1221,13 @@ func (e *Exchange) UpdateOrderExecutionLimits(ctx context.Context, a asset.Item)
if !e.SupportsAsset(a) {
return fmt.Errorf("%s: %w - %v", e.Name, asset.ErrNotSupported, a)
}
for _, x := range baseCurrencies {
for _, bc := range baseCurrencies {
var instrumentsData []*InstrumentData
var err error
if e.Websocket.IsConnected() {
instrumentsData, err = e.WSRetrieveInstrumentsData(ctx, currency.NewCode(x), e.GetAssetKind(a), false)
instrumentsData, err = e.WSRetrieveInstrumentsData(ctx, currency.NewCode(bc), e.GetAssetKind(a), false)
} else {
instrumentsData, err = e.GetInstruments(ctx, currency.NewCode(x), e.GetAssetKind(a), false)
instrumentsData, err = e.GetInstruments(ctx, currency.NewCode(bc), e.GetAssetKind(a), false)
}
if err != nil {
return err
@@ -1234,21 +1235,20 @@ func (e *Exchange) UpdateOrderExecutionLimits(ctx context.Context, a asset.Item)
continue
}
limits := make([]order.MinMaxLevel, len(instrumentsData))
for x, inst := range instrumentsData {
l := make([]limits.MinMaxLevel, len(instrumentsData))
for i, inst := range instrumentsData {
var pair currency.Pair
pair, err = currency.NewPairFromString(inst.InstrumentName)
if err != nil {
return err
}
limits[x] = order.MinMaxLevel{
Pair: pair,
Asset: a,
l[i] = limits.MinMaxLevel{
Key: key.NewExchangeAssetPair(e.Name, a, pair),
PriceStepIncrementSize: inst.TickSize,
MinimumBaseAmount: inst.MinimumTradeAmount,
}
}
err = e.LoadLimits(limits)
err = limits.Load(l)
if err != nil {
return err
}
@@ -1364,12 +1364,7 @@ func (e *Exchange) GetOpenInterest(ctx context.Context, k ...key.PairAsset) ([]f
}
for a := range oi {
result = append(result, futures.OpenInterest{
Key: key.ExchangePairAsset{
Exchange: e.Name,
Base: k[i].Base,
Quote: k[i].Quote,
Asset: k[i].Asset,
},
Key: key.NewExchangeAssetPair(e.Name, k[i].Asset, k[i].Pair()),
OpenInterest: oi[a].OpenInterest,
})
break
@@ -1413,7 +1408,7 @@ func (e *Exchange) GetCurrencyTradeURL(_ context.Context, a asset.Item, cp curre
case asset.OptionCombo:
return tradeBaseURL + tradeOptionsCombo + cp.Base.Upper().String(), nil
default:
return "", fmt.Errorf("%w %v", asset.ErrNotSupported, a)
return "", fmt.Errorf("%w %q", asset.ErrNotSupported, a)
}
}