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:
Ryan O'Hara-Reid
2024-07-03 16:07:23 +10:00
committed by GitHub
parent b7a2f617d9
commit 48349bc3bb
35 changed files with 210 additions and 77 deletions

View File

@@ -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

View File

@@ -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)