mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-09 15:11:10 +00:00
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:
@@ -19,8 +19,10 @@ import (
|
||||
"github.com/thrasher-corp/gocryptotrader/common"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/convert"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/crypto"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/key"
|
||||
"github.com/thrasher-corp/gocryptotrader/currency"
|
||||
"github.com/thrasher-corp/gocryptotrader/encoding/json"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchange/order/limits"
|
||||
exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/nonce"
|
||||
@@ -293,11 +295,11 @@ func (e *Exchange) GetV2MarginFunding(ctx context.Context, symbol, amount string
|
||||
}
|
||||
|
||||
// GetV2FundingInfo gets funding info for margin pairs
|
||||
func (e *Exchange) GetV2FundingInfo(ctx context.Context, key string) (MarginFundingDataV2, error) {
|
||||
func (e *Exchange) GetV2FundingInfo(ctx context.Context, k string) (MarginFundingDataV2, error) {
|
||||
var resp []any
|
||||
var response MarginFundingDataV2
|
||||
err := e.SendAuthenticatedHTTPRequestV2(ctx, exchange.RestSpot, http.MethodPost,
|
||||
fmt.Sprintf(bitfinexV2FundingInfo, key),
|
||||
fmt.Sprintf(bitfinexV2FundingInfo, k),
|
||||
nil,
|
||||
&resp,
|
||||
getAccountFees)
|
||||
@@ -454,9 +456,9 @@ func (e *Exchange) GetPairs(ctx context.Context, a asset.Item) ([]string, error)
|
||||
return nil, err
|
||||
}
|
||||
var pairs []string
|
||||
for key := range funding {
|
||||
symbol := key[1:]
|
||||
if key[0] != 'f' || strings.Contains(symbol, ":") || len(symbol) > 6 {
|
||||
for k := range funding {
|
||||
symbol := k[1:]
|
||||
if k[0] != 'f' || strings.Contains(symbol, ":") || len(symbol) > 6 {
|
||||
continue
|
||||
}
|
||||
pairs = append(pairs, symbol)
|
||||
@@ -490,7 +492,7 @@ func (e *Exchange) GetSiteListConfigData(ctx context.Context, set string) ([]str
|
||||
// GetSiteInfoConfigData returns site configuration data by pub:info:{AssetType} as a map
|
||||
// path should be bitfinexInfoPairs or bitfinexInfoPairsFuture???
|
||||
// NOTE: See https://docs.bitfinex.com/reference/rest-public-conf
|
||||
func (e *Exchange) GetSiteInfoConfigData(ctx context.Context, assetType asset.Item) ([]order.MinMaxLevel, error) {
|
||||
func (e *Exchange) GetSiteInfoConfigData(ctx context.Context, assetType asset.Item) ([]limits.MinMaxLevel, error) {
|
||||
var path string
|
||||
switch assetType {
|
||||
case asset.Spot:
|
||||
@@ -500,7 +502,6 @@ func (e *Exchange) GetSiteInfoConfigData(ctx context.Context, assetType asset.It
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid asset type for GetSiteInfoConfigData: %s", assetType)
|
||||
}
|
||||
|
||||
var resp [][][]any
|
||||
err := e.SendHTTPRequest(ctx, exchange.RestSpot, bitfinexAPIVersion2+path, &resp, status)
|
||||
if err != nil {
|
||||
@@ -510,7 +511,7 @@ func (e *Exchange) GetSiteInfoConfigData(ctx context.Context, assetType asset.It
|
||||
return nil, errors.New("response did not contain only one item")
|
||||
}
|
||||
data := resp[0]
|
||||
pairs := make([]order.MinMaxLevel, 0, len(data))
|
||||
l := make([]limits.MinMaxLevel, 0, len(data))
|
||||
for i := range data {
|
||||
if len(data[i]) != 2 {
|
||||
return nil, errors.New("response contained a tuple without exactly 2 items")
|
||||
@@ -542,14 +543,13 @@ func (e *Exchange) GetSiteInfoConfigData(ctx context.Context, assetType asset.It
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pairs = append(pairs, order.MinMaxLevel{
|
||||
Asset: assetType,
|
||||
Pair: pair,
|
||||
l = append(l, limits.MinMaxLevel{
|
||||
Key: key.NewExchangeAssetPair(e.Name, assetType, pair),
|
||||
MinimumBaseAmount: minOrder,
|
||||
MaximumBaseAmount: maxOrder,
|
||||
})
|
||||
}
|
||||
return pairs, nil
|
||||
return l, nil
|
||||
}
|
||||
|
||||
// GetDerivativeStatusInfo gets status data for the queried derivative
|
||||
@@ -992,7 +992,7 @@ func (e *Exchange) GetLiquidationFeed() error {
|
||||
// profit
|
||||
// Allowed time frames are 3h, 1w and 1M
|
||||
// Allowed symbols are trading pairs (e.g. tBTCUSD, tETHUSD and tGLOBAL:USD)
|
||||
func (e *Exchange) GetLeaderboard(ctx context.Context, key, timeframe, symbol string, sort, limit int, start, end string) ([]LeaderboardEntry, error) {
|
||||
func (e *Exchange) GetLeaderboard(ctx context.Context, k, timeframe, symbol string, sort, limit int, start, end string) ([]LeaderboardEntry, error) {
|
||||
validLeaderboardKey := func(input string) bool {
|
||||
switch input {
|
||||
case LeaderboardUnrealisedProfitPeriodDelta,
|
||||
@@ -1005,12 +1005,12 @@ func (e *Exchange) GetLeaderboard(ctx context.Context, key, timeframe, symbol st
|
||||
}
|
||||
}
|
||||
|
||||
if !validLeaderboardKey(key) {
|
||||
if !validLeaderboardKey(k) {
|
||||
return nil, errors.New("invalid leaderboard key")
|
||||
}
|
||||
|
||||
path := fmt.Sprintf("%s/%s:%s:%s/hist", bitfinexAPIVersion2+bitfinexLeaderboard,
|
||||
key,
|
||||
k,
|
||||
timeframe,
|
||||
symbol)
|
||||
vals := url.Values{}
|
||||
|
||||
@@ -141,27 +141,21 @@ func TestUpdateTradablePairs(t *testing.T) {
|
||||
|
||||
func TestUpdateOrderExecutionLimits(t *testing.T) {
|
||||
t.Parallel()
|
||||
tests := map[asset.Item][]currency.Pair{
|
||||
asset.Spot: {
|
||||
currency.NewPair(currency.ETH, currency.UST),
|
||||
currency.NewPair(currency.BTC, currency.UST),
|
||||
},
|
||||
}
|
||||
for assetItem, pairs := range tests {
|
||||
if err := e.UpdateOrderExecutionLimits(t.Context(), assetItem); err != nil {
|
||||
t.Errorf("Error fetching %s pairs for test: %v", assetItem, err)
|
||||
continue
|
||||
}
|
||||
for _, pair := range pairs {
|
||||
limits, err := e.GetOrderExecutionLimits(assetItem, pair)
|
||||
if err != nil {
|
||||
t.Errorf("GetOrderExecutionLimits() error during TestExecutionLimits; Asset: %s Pair: %s Err: %v", assetItem, pair, err)
|
||||
continue
|
||||
for _, a := range e.GetAssetTypes(false) {
|
||||
t.Run(a.String(), func(t *testing.T) {
|
||||
t.Parallel()
|
||||
switch a {
|
||||
case asset.Spot:
|
||||
require.NoError(t, e.UpdateOrderExecutionLimits(t.Context(), a), "UpdateOrderExecutionLimits must not error")
|
||||
pairs, err := e.CurrencyPairs.GetPairs(a, false)
|
||||
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")
|
||||
default:
|
||||
require.ErrorIs(t, e.UpdateOrderExecutionLimits(t.Context(), a), common.ErrNotYetImplemented)
|
||||
}
|
||||
if limits.MinimumBaseAmount == 0 {
|
||||
t.Errorf("UpdateOrderExecutionLimits empty minimum base amount; Pair: %s Expected Limit: %v", pair, limits.MinimumBaseAmount)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
exchange "github.com/thrasher-corp/gocryptotrader/exchanges"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/account"
|
||||
@@ -273,11 +274,11 @@ func (e *Exchange) UpdateOrderExecutionLimits(ctx context.Context, a asset.Item)
|
||||
if a != asset.Spot {
|
||||
return common.ErrNotYetImplemented
|
||||
}
|
||||
limits, err := e.GetSiteInfoConfigData(ctx, a)
|
||||
l, err := e.GetSiteInfoConfigData(ctx, a)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := e.LoadLimits(limits); err != nil {
|
||||
if err := limits.Load(l); err != nil {
|
||||
return fmt.Errorf("%s Error loading exchange limits: %v", e.Name, err)
|
||||
}
|
||||
return nil
|
||||
@@ -489,7 +490,7 @@ func (e *Exchange) GetRecentTrades(ctx context.Context, p currency.Pair, assetTy
|
||||
// GetHistoricTrades returns historic trade data within the timeframe provided
|
||||
func (e *Exchange) GetHistoricTrades(ctx context.Context, p currency.Pair, a asset.Item, timestampStart, timestampEnd time.Time) ([]trade.Data, error) {
|
||||
if a == asset.MarginFunding {
|
||||
return nil, fmt.Errorf("%w %v", asset.ErrNotSupported, a)
|
||||
return nil, fmt.Errorf("%w %q", asset.ErrNotSupported, a)
|
||||
}
|
||||
if err := common.StartEndTimeCheck(timestampStart, timestampEnd); err != nil {
|
||||
return nil, fmt.Errorf("invalid time range supplied. Start: %v End %v %w", timestampStart, timestampEnd, err)
|
||||
@@ -1201,6 +1202,6 @@ func (e *Exchange) GetCurrencyTradeURL(_ context.Context, a asset.Item, cp curre
|
||||
case asset.Spot:
|
||||
return tradeBaseURL + "/t/" + symbol, nil
|
||||
default:
|
||||
return "", fmt.Errorf("%w %v", asset.ErrNotSupported, a)
|
||||
return "", fmt.Errorf("%w %q", asset.ErrNotSupported, a)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user