mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
orders/gateio: Add GetTradeAmount method to order.Submit type (#1584)
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
This commit is contained in:
@@ -1013,19 +1013,14 @@ func (g *Gateio) SubmitOrder(ctx context.Context, s *order.Submit) (*order.Submi
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// When doing spot market orders when purchasing base currency, the
|
||||
// quote currency amount is used. When selling the base currency the
|
||||
// base currency amount is used.
|
||||
tradingAmount := s.Amount
|
||||
if tradingAmount == 0 && s.Type == order.Market {
|
||||
tradingAmount = s.QuoteAmount
|
||||
}
|
||||
|
||||
sOrder, err := g.PlaceSpotOrder(ctx, &CreateOrderRequestData{
|
||||
Side: s.Side.Lower(),
|
||||
Type: s.Type.Lower(),
|
||||
Account: g.assetTypeToString(s.AssetType),
|
||||
Amount: types.Number(tradingAmount),
|
||||
Side: s.Side.Lower(),
|
||||
Type: s.Type.Lower(),
|
||||
Account: g.assetTypeToString(s.AssetType),
|
||||
// When doing spot market orders when purchasing base currency, the
|
||||
// quote currency amount is used. When selling the base currency the
|
||||
// base currency amount is used.
|
||||
Amount: types.Number(s.GetTradeAmount(g.GetTradingRequirements())),
|
||||
Price: types.Number(s.Price),
|
||||
CurrencyPair: s.Pair,
|
||||
Text: s.ClientOrderID,
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/thrasher-corp/gocryptotrader/common"
|
||||
"github.com/thrasher-corp/gocryptotrader/currency"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
||||
@@ -2125,3 +2126,22 @@ func TestSideUnmarshal(t *testing.T) {
|
||||
var jErr *json.UnmarshalTypeError
|
||||
assert.ErrorAs(t, s.UnmarshalJSON([]byte(`14`)), &jErr, "non-string valid json is rejected")
|
||||
}
|
||||
|
||||
func TestGetTradeAmount(t *testing.T) {
|
||||
t.Parallel()
|
||||
var s *Submit
|
||||
require.Zero(t, s.GetTradeAmount(protocol.TradingRequirements{}))
|
||||
baseAmount := 420.0
|
||||
quoteAmount := 69.0
|
||||
s = &Submit{Amount: baseAmount, QuoteAmount: quoteAmount}
|
||||
// below will default to base amount with nothing set
|
||||
require.Equal(t, baseAmount, s.GetTradeAmount(protocol.TradingRequirements{}))
|
||||
require.Equal(t, baseAmount, s.GetTradeAmount(protocol.TradingRequirements{SpotMarketOrderAmountPurchaseQuotationOnly: true}))
|
||||
s.AssetType = asset.Spot
|
||||
s.Type = Market
|
||||
s.Side = Buy
|
||||
require.Equal(t, quoteAmount, s.GetTradeAmount(protocol.TradingRequirements{SpotMarketOrderAmountPurchaseQuotationOnly: true}))
|
||||
require.Equal(t, baseAmount, s.GetTradeAmount(protocol.TradingRequirements{SpotMarketOrderAmountSellBaseOnly: true}))
|
||||
s.Side = Sell
|
||||
require.Equal(t, baseAmount, s.GetTradeAmount(protocol.TradingRequirements{SpotMarketOrderAmountSellBaseOnly: true}))
|
||||
}
|
||||
|
||||
@@ -129,6 +129,23 @@ func (s *Submit) Validate(requirements protocol.TradingRequirements, opt ...vali
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetTradeAmount returns the trade amount based on the exchange's trading
|
||||
// requirements. Some exchanges depending on direction and order type use
|
||||
// quotation (funds in balance) or base amounts. If the exchange does not have
|
||||
// any specific requirements it will return the base amount.
|
||||
func (s *Submit) GetTradeAmount(tr protocol.TradingRequirements) float64 {
|
||||
if s == nil {
|
||||
return 0
|
||||
}
|
||||
switch {
|
||||
case tr.SpotMarketOrderAmountPurchaseQuotationOnly && s.AssetType == asset.Spot && s.Type == Market && s.Side.IsLong():
|
||||
return s.QuoteAmount
|
||||
case tr.SpotMarketOrderAmountSellBaseOnly && s.AssetType == asset.Spot && s.Type == Market && s.Side.IsShort():
|
||||
return s.Amount
|
||||
}
|
||||
return s.Amount
|
||||
}
|
||||
|
||||
// UpdateOrderFromDetail Will update an order detail (used in order management)
|
||||
// by comparing passed in and existing values
|
||||
func (d *Detail) UpdateOrderFromDetail(m *Detail) error {
|
||||
|
||||
Reference in New Issue
Block a user