mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-29 15:10:37 +00:00
protocol/order: adds additional fields for trading requirements (#1552)
* Add in initial handling for quote/base currency deployment requirements * include client order ID checking * glorious: suggestions * spell and fix * linter/context/test * rework tests and order side specific requirements * linter * mend panic at the disco * mending more panics at the disco * anudda fix brudda * glorious: NITTTTTT BOOOOOMB * leftover things and stuff * whoops * tie in gateio * glorious: nit fixes life and everything. * thrasher: nits --------- Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
This commit is contained in:
@@ -352,7 +352,7 @@ func (m *OrderManager) GetOrderInfo(ctx context.Context, exchangeName, orderID s
|
||||
}
|
||||
|
||||
// validate ensures a submitted order is valid before adding to the manager
|
||||
func (m *OrderManager) validate(newOrder *order.Submit) error {
|
||||
func (m *OrderManager) validate(exch exchange.IBotExchange, newOrder *order.Submit) error {
|
||||
if newOrder == nil {
|
||||
return errNilOrder
|
||||
}
|
||||
@@ -361,7 +361,7 @@ func (m *OrderManager) validate(newOrder *order.Submit) error {
|
||||
return ErrExchangeNameIsEmpty
|
||||
}
|
||||
|
||||
if err := newOrder.Validate(); err != nil {
|
||||
if err := newOrder.Validate(exch.GetTradingRequirements()); err != nil {
|
||||
return fmt.Errorf("order manager: %w", err)
|
||||
}
|
||||
|
||||
@@ -466,12 +466,14 @@ func (m *OrderManager) Submit(ctx context.Context, newOrder *order.Submit) (*Ord
|
||||
if atomic.LoadInt32(&m.started) == 0 {
|
||||
return nil, fmt.Errorf("order manager %w", ErrSubSystemNotStarted)
|
||||
}
|
||||
|
||||
err := m.validate(newOrder)
|
||||
if newOrder == nil {
|
||||
return nil, errNilOrder
|
||||
}
|
||||
exch, err := m.orderStore.exchangeManager.GetExchangeByName(newOrder.Exchange)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
exch, err := m.orderStore.exchangeManager.GetExchangeByName(newOrder.Exchange)
|
||||
err = m.validate(exch, newOrder)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -515,16 +517,17 @@ func (m *OrderManager) SubmitFakeOrder(newOrder *order.Submit, resultingOrder *o
|
||||
if atomic.LoadInt32(&m.started) == 0 {
|
||||
return nil, fmt.Errorf("order manager %w", ErrSubSystemNotStarted)
|
||||
}
|
||||
|
||||
err := m.validate(newOrder)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if newOrder == nil {
|
||||
return nil, errNilOrder
|
||||
}
|
||||
exch, err := m.orderStore.exchangeManager.GetExchangeByName(newOrder.Exchange)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = m.validate(exch, newOrder)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if checkExchangeLimits {
|
||||
// Checks for exchange min max limits for order amounts before order
|
||||
// execution can occur
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/shopspring/decimal"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/thrasher-corp/gocryptotrader/common"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/convert"
|
||||
"github.com/thrasher-corp/gocryptotrader/config"
|
||||
@@ -562,9 +563,7 @@ func TestCancelAllOrders(t *testing.T) {
|
||||
func TestSubmit(t *testing.T) {
|
||||
m := OrdersSetup(t)
|
||||
_, err := m.Submit(context.Background(), nil)
|
||||
if err == nil {
|
||||
t.Error("Expected error from nil order")
|
||||
}
|
||||
require.ErrorIs(t, err, errNilOrder)
|
||||
|
||||
o := &order.Submit{Type: order.Market}
|
||||
_, err = m.Submit(context.Background(), o)
|
||||
@@ -1316,26 +1315,12 @@ func TestSubmitFakeOrder(t *testing.T) {
|
||||
o := &OrderManager{}
|
||||
resp := &order.SubmitResponse{}
|
||||
_, err := o.SubmitFakeOrder(nil, resp, false)
|
||||
if !errors.Is(err, ErrSubSystemNotStarted) {
|
||||
t.Errorf("received '%v', expected '%v'", err, ErrSubSystemNotStarted)
|
||||
}
|
||||
assert.ErrorIs(t, err, ErrSubSystemNotStarted)
|
||||
|
||||
o.started = 1
|
||||
_, err = o.SubmitFakeOrder(nil, resp, false)
|
||||
if !errors.Is(err, errNilOrder) {
|
||||
t.Errorf("received '%v', expected '%v'", err, errNilOrder)
|
||||
}
|
||||
ord := &order.Submit{}
|
||||
_, err = o.SubmitFakeOrder(ord, resp, false)
|
||||
if !errors.Is(err, ErrExchangeNameIsEmpty) {
|
||||
t.Errorf("received '%v', expected '%v'", err, ErrExchangeNameIsEmpty)
|
||||
}
|
||||
ord.Exchange = testExchange
|
||||
ord.AssetType = asset.Spot
|
||||
ord.Pair = currency.NewPair(currency.BTC, currency.DOGE)
|
||||
ord.Side = order.Buy
|
||||
ord.Type = order.Market
|
||||
ord.Amount = 1337
|
||||
assert.ErrorIs(t, err, errNilOrder)
|
||||
|
||||
em := NewExchangeManager()
|
||||
exch, err := em.NewExchangeByName(testExchange)
|
||||
if err != nil {
|
||||
@@ -1348,6 +1333,17 @@ func TestSubmitFakeOrder(t *testing.T) {
|
||||
}
|
||||
o.orderStore.exchangeManager = em
|
||||
|
||||
ord := &order.Submit{}
|
||||
_, err = o.SubmitFakeOrder(ord, resp, false)
|
||||
assert.ErrorIs(t, err, ErrExchangeNameIsEmpty)
|
||||
|
||||
ord.Exchange = testExchange
|
||||
ord.AssetType = asset.Spot
|
||||
ord.Pair = currency.NewPair(currency.BTC, currency.DOGE)
|
||||
ord.Side = order.Buy
|
||||
ord.Type = order.Market
|
||||
ord.Amount = 1337
|
||||
|
||||
resp, err = ord.DeriveSubmitResponse("1234")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
Reference in New Issue
Block a user