Add order validation test code and use GetPairFormat where necessary

This commit is contained in:
Adrian Gallagher
2019-06-25 17:44:46 +10:00
parent 1daaa66830
commit 6de0606d55
19 changed files with 134 additions and 43 deletions

View File

@@ -505,7 +505,7 @@ func (b *Bitstamp) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest)
if quoteCurrency.String() != "" && baseCurrency.String() != "" {
currPair = currency.NewPairWithDelimiter(baseCurrency.String(),
quoteCurrency.String(),
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
b.GetPairFormat(asset.Spot, false).Delimiter)
}
orderDate := time.Unix(order.Date, 0)
orders = append(orders, exchange.OrderDetail{

View File

@@ -429,7 +429,7 @@ func (b *Bittrex) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) (
}
pair := currency.NewPairDelimiter(resp.Result[i].Exchange,
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
b.GetPairFormat(asset.Spot, false).Delimiter)
orderType := exchange.OrderType(strings.ToUpper(resp.Result[i].Type))
orders = append(orders, exchange.OrderDetail{
@@ -473,7 +473,7 @@ func (b *Bittrex) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) (
}
pair := currency.NewPairDelimiter(resp.Result[i].Exchange,
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
b.GetPairFormat(asset.Spot, false).Delimiter)
orderType := exchange.OrderType(strings.ToUpper(resp.Result[i].Type))
orders = append(orders, exchange.OrderDetail{

View File

@@ -399,7 +399,7 @@ func (b *BTCMarkets) GetOrderInfo(orderID string) (exchange.OrderDetail, error)
OrderDetail.Status = orders[i].Status
OrderDetail.CurrencyPair = currency.NewPairWithDelimiter(orders[i].Instrument,
orders[i].Currency,
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
b.GetPairFormat(asset.Spot, false).Delimiter)
}
return OrderDetail, nil

View File

@@ -355,7 +355,7 @@ func (b *BTSE) GetOrderInfo(orderID string) (exchange.OrderDetail, error) {
}
od.CurrencyPair = currency.NewPairDelimiter(o.ProductID,
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
b.GetPairFormat(asset.Spot, false).Delimiter)
od.Exchange = b.Name
od.Amount = o.Amount
od.ID = o.ID
@@ -432,7 +432,7 @@ func (b *BTSE) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([]e
openOrder := exchange.OrderDetail{
CurrencyPair: currency.NewPairDelimiter(order.ProductID,
b.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter),
b.GetPairFormat(asset.Spot, false).Delimiter),
Exchange: b.Name,
Amount: order.Amount,
ID: order.ID,

View File

@@ -428,7 +428,7 @@ func (c *CoinbasePro) GetActiveOrders(getOrdersRequest *exchange.GetOrdersReques
var orders []exchange.OrderDetail
for i := range respOrders {
currency := currency.NewPairDelimiter(respOrders[i].ProductID,
c.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
c.GetPairFormat(asset.Spot, false).Delimiter)
orderSide := exchange.OrderSide(strings.ToUpper(respOrders[i].Side))
orderType := exchange.OrderType(strings.ToUpper(respOrders[i].Type))
orderDate, err := time.Parse(time.RFC3339, respOrders[i].CreatedAt)
@@ -471,7 +471,7 @@ func (c *CoinbasePro) GetOrderHistory(getOrdersRequest *exchange.GetOrdersReques
var orders []exchange.OrderDetail
for i := range respOrders {
currency := currency.NewPairDelimiter(respOrders[i].ProductID,
c.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
c.GetPairFormat(asset.Spot, false).Delimiter)
orderSide := exchange.OrderSide(strings.ToUpper(respOrders[i].Side))
orderType := exchange.OrderType(strings.ToUpper(respOrders[i].Type))
orderDate, err := time.Parse(time.RFC3339, respOrders[i].CreatedAt)

View File

@@ -419,7 +419,7 @@ func (g *Gateio) GetOrderInfo(orderID string) (exchange.OrderDetail, error) {
orderDetail.Status = orders.Orders[x].Status
orderDetail.Price = orders.Orders[x].Rate
orderDetail.CurrencyPair = currency.NewPairDelimiter(orders.Orders[x].CurrencyPair,
g.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
g.GetPairFormat(asset.Spot, false).Delimiter)
if strings.EqualFold(orders.Orders[x].Type, exchange.AskOrderSide.ToString()) {
orderDetail.OrderSide = exchange.AskOrderSide
} else if strings.EqualFold(orders.Orders[x].Type, exchange.BidOrderSide.ToString()) {
@@ -505,7 +505,7 @@ func (g *Gateio) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([
}
symbol := currency.NewPairDelimiter(resp.Orders[i].CurrencyPair,
g.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
g.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(resp.Orders[i].Type))
orderDate := time.Unix(resp.Orders[i].Timestamp, 0)
@@ -542,7 +542,7 @@ func (g *Gateio) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for _, trade := range trades {
symbol := currency.NewPairDelimiter(trade.Pair,
g.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
g.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(trade.Type))
orderDate := time.Unix(trade.TimeUnix, 0)
orders = append(orders, exchange.OrderDetail{

View File

@@ -389,7 +389,7 @@ func (g *Gemini) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for i := range resp {
symbol := currency.NewPairDelimiter(resp[i].Symbol,
g.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
g.GetPairFormat(asset.Spot, false).Delimiter)
var orderType exchange.OrderType
if resp[i].Type == "exchange limit" {
orderType = exchange.LimitOrderType

View File

@@ -425,7 +425,7 @@ func (h *HitBTC) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for i := range allOrders {
symbol := currency.NewPairDelimiter(allOrders[i].Symbol,
h.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
h.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(allOrders[i].Side))
orders = append(orders, exchange.OrderDetail{
ID: allOrders[i].ID,
@@ -463,7 +463,7 @@ func (h *HitBTC) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for i := range allOrders {
symbol := currency.NewPairDelimiter(allOrders[i].Symbol,
h.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
h.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(allOrders[i].Side))
orders = append(orders, exchange.OrderDetail{
ID: allOrders[i].ID,

View File

@@ -500,7 +500,7 @@ func (h *HUOBIHADAX) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest
var orders []exchange.OrderDetail
for i := range allOrders {
symbol := currency.NewPairDelimiter(allOrders[i].Symbol,
h.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
h.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(0, allOrders[i].CreatedAt*int64(time.Millisecond))
orders = append(orders, exchange.OrderDetail{
@@ -546,7 +546,7 @@ func (h *HUOBIHADAX) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest
var orders []exchange.OrderDetail
for i := range allOrders {
symbol := currency.NewPairDelimiter(allOrders[i].Symbol,
h.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
h.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(0, allOrders[i].CreatedAt*int64(time.Millisecond))
orders = append(orders, exchange.OrderDetail{

View File

@@ -420,7 +420,7 @@ func (i *ItBit) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([]
var orders []exchange.OrderDetail
for j := range allOrders {
symbol := currency.NewPairDelimiter(allOrders[j].Instrument,
i.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
i.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(allOrders[j].Side))
orderDate, err := time.Parse(time.RFC3339, allOrders[j].CreatedTime)
if err != nil {
@@ -471,7 +471,7 @@ func (i *ItBit) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([]
}
symbol := currency.NewPairDelimiter(allOrders[j].Instrument,
i.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
i.GetPairFormat(asset.Spot, false).Delimiter)
side := exchange.OrderSide(strings.ToUpper(allOrders[j].Side))
orderDate, err := time.Parse(time.RFC3339, allOrders[j].CreatedTime)
if err != nil {

View File

@@ -767,15 +767,15 @@ func (k *Kraken) AddOrder(symbol, side, orderType string, volume, price, price2,
params.Set("leverage", strconv.FormatFloat(leverage, 'f', -1, 64))
}
if args.Oflags == "" {
if args.Oflags != "" {
params.Set("oflags", args.Oflags)
}
if args.StartTm == "" {
if args.StartTm != "" {
params.Set("starttm", args.StartTm)
}
if args.ExpireTm == "" {
if args.ExpireTm != "" {
params.Set("expiretm", args.ExpireTm)
}

View File

@@ -446,10 +446,10 @@ func (k *Kraken) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for i := range resp.Open {
symbol := currency.NewPairDelimiter(resp.Open[i].Descr.Pair,
k.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
symbol := currency.NewPairFromString(resp.Open[i].Descr.Pair)
orderDate := time.Unix(int64(resp.Open[i].StartTm), 0)
side := exchange.OrderSide(strings.ToUpper(resp.Open[i].Descr.Type))
orderType := exchange.OrderType(strings.ToUpper(resp.Open[i].Descr.OrderType))
orders = append(orders, exchange.OrderDetail{
ID: i,
@@ -458,8 +458,9 @@ func (k *Kraken) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([
ExecutedAmount: resp.Open[i].VolExec,
Exchange: k.Name,
OrderDate: orderDate,
Price: resp.Open[i].Price,
Price: resp.Open[i].Descr.Price,
OrderSide: side,
OrderType: orderType,
CurrencyPair: symbol,
})
}
@@ -489,10 +490,10 @@ func (k *Kraken) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([
var orders []exchange.OrderDetail
for i := range resp.Closed {
symbol := currency.NewPairDelimiter(resp.Closed[i].Descr.Pair,
k.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
symbol := currency.NewPairFromString(resp.Closed[i].Descr.Pair)
orderDate := time.Unix(int64(resp.Closed[i].StartTm), 0)
side := exchange.OrderSide(strings.ToUpper(resp.Closed[i].Descr.Type))
orderType := exchange.OrderType(strings.ToUpper(resp.Closed[i].Descr.OrderType))
orders = append(orders, exchange.OrderDetail{
ID: i,
@@ -501,8 +502,9 @@ func (k *Kraken) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([
ExecutedAmount: resp.Closed[i].VolExec,
Exchange: k.Name,
OrderDate: orderDate,
Price: resp.Closed[i].Price,
Price: resp.Closed[i].Descr.Price,
OrderSide: side,
OrderType: orderType,
CurrencyPair: symbol,
})
}

View File

@@ -394,7 +394,8 @@ func (l *LakeBTC) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) (
var orders []exchange.OrderDetail
for _, order := range resp {
symbol := currency.NewPairDelimiter(order.Symbol, l.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
symbol := currency.NewPairDelimiter(order.Symbol,
l.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(order.At, 0)
side := exchange.OrderSide(strings.ToUpper(order.Type))
@@ -431,7 +432,7 @@ func (l *LakeBTC) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) (
}
symbol := currency.NewPairDelimiter(order.Symbol,
l.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
l.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(order.At, 0)
side := exchange.OrderSide(strings.ToUpper(order.Type))

View File

@@ -302,7 +302,7 @@ func (o *OKGroup) GetOrderInfo(orderID string) (resp exchange.OrderDetail, err e
resp = exchange.OrderDetail{
Amount: order.Size,
CurrencyPair: currency.NewPairDelimiter(order.InstrumentID,
o.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter),
o.GetPairFormat(asset.Spot, false).Delimiter),
Exchange: o.Name,
OrderDate: order.Timestamp,
ExecutedAmount: order.FilledSize,

81
exchanges/order_test.go Normal file
View File

@@ -0,0 +1,81 @@
package exchange
import (
"testing"
"github.com/thrasher-/gocryptotrader/currency"
)
func TestValidate(t *testing.T) {
testPair := currency.NewPair(currency.BTC, currency.LTC)
tester := []struct {
Pair currency.Pair
Side OrderSide
Type OrderType
Amount float64
Price float64
ExpectedErr error
}{
{
ExpectedErr: ErrOrderPairIsEmpty,
}, // empty pair
{
Pair: testPair,
ExpectedErr: ErrOrderSideIsInvalid,
}, // valid pair but invalid order side
{
Pair: testPair,
Side: BuyOrderSide,
ExpectedErr: ErrOrderTypeIsInvalid,
}, // valid pair and order side but invalid order type
{
Pair: testPair,
Side: SellOrderSide,
ExpectedErr: ErrOrderTypeIsInvalid,
}, // valid pair and order side but invalid order type
{
Pair: testPair,
Side: BidOrderSide,
ExpectedErr: ErrOrderTypeIsInvalid,
}, // valid pair and order side but invalid order type
{
Pair: testPair,
Side: AskOrderSide,
ExpectedErr: ErrOrderTypeIsInvalid,
}, // valid pair and order side but invalid order type
{
Pair: testPair,
Side: AskOrderSide,
Type: MarketOrderType,
ExpectedErr: ErrOrderAmountIsInvalid,
}, // valid pair, order side, type but invalid amount
{
Pair: testPair,
Side: AskOrderSide,
Type: LimitOrderType,
Amount: 1,
ExpectedErr: ErrOrderPriceMustBeSetIfLimitOrder,
}, // valid pair, order side, type, amount but invalid price
{
Pair: testPair,
Side: AskOrderSide,
Type: LimitOrderType,
Amount: 1,
Price: 1000,
ExpectedErr: nil,
}, // valid order!
}
for x := range tester {
s := OrderSubmission{
Pair: tester[x].Pair,
OrderSide: tester[x].Side,
OrderType: tester[x].Type,
Amount: tester[x].Amount,
Price: tester[x].Price,
}
if err := s.Validate(); err != tester[x].ExpectedErr {
t.Errorf("Unexpected result. Got: %s, want: %s", err, tester[x].ExpectedErr)
}
}
}

View File

@@ -13,7 +13,12 @@ import (
// vars related to orders
var (
ErrOrderSubmissionIsNil = errors.New("order submission is nil")
ErrOrderSubmissionIsNil = errors.New("order submission is nil")
ErrOrderPairIsEmpty = errors.New("order pair is empty")
ErrOrderSideIsInvalid = errors.New("order side is invalid")
ErrOrderTypeIsInvalid = errors.New("order type is invalid")
ErrOrderAmountIsInvalid = errors.New("order amount is invalid")
ErrOrderPriceMustBeSetIfLimitOrder = errors.New("order price must be set if limit order type is desired")
)
// OrderSubmission contains the order submission data
@@ -29,24 +34,26 @@ type OrderSubmission struct {
// Validate checks the supplied data and returns whether or not its valid
func (o *OrderSubmission) Validate() error {
if o.Pair.IsEmpty() {
return errors.New("order pair is empty")
return ErrOrderPairIsEmpty
}
if o.OrderSide != BuyOrderSide && o.OrderSide != SellOrderSide ||
o.OrderSide = OrderSide(strings.ToUpper(o.OrderSide.ToString()))
if o.OrderSide != BuyOrderSide && o.OrderSide != SellOrderSide &&
o.OrderSide != BidOrderSide && o.OrderSide != AskOrderSide {
return errors.New("order side is invalid")
return ErrOrderSideIsInvalid
}
o.OrderType = OrderType(strings.ToUpper(o.OrderType.ToString()))
if o.OrderType != MarketOrderType && o.OrderType != LimitOrderType {
return errors.New("order type is invalid")
return ErrOrderTypeIsInvalid
}
if o.Amount <= 0 {
return errors.New("order amount is invalid")
return ErrOrderAmountIsInvalid
}
if o.OrderType == LimitOrderType && o.Price <= 0 {
return errors.New("order price must be set if limit order type is desired")
return ErrOrderPriceMustBeSetIfLimitOrder
}
return nil

View File

@@ -446,7 +446,7 @@ func (p *Poloniex) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest)
var orders []exchange.OrderDetail
for currencyPair, openOrders := range resp.Data {
symbol := currency.NewPairDelimiter(currencyPair,
p.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
p.GetPairFormat(asset.Spot, false).Delimiter)
for _, order := range openOrders {
orderSide := exchange.OrderSide(strings.ToUpper(order.Type))
@@ -488,7 +488,7 @@ func (p *Poloniex) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest)
var orders []exchange.OrderDetail
for currencyPair, historicOrders := range resp.Data {
symbol := currency.NewPairDelimiter(currencyPair,
p.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
p.GetPairFormat(asset.Spot, false).Delimiter)
for _, order := range historicOrders {
orderSide := exchange.OrderSide(strings.ToUpper(order.Type))

View File

@@ -425,7 +425,7 @@ func (y *Yobit) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([]
for ID, order := range resp {
symbol := currency.NewPairDelimiter(order.Pair,
y.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
y.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(int64(order.TimestampCreated), 0)
side := exchange.OrderSide(strings.ToUpper(order.Type))
orders = append(orders, exchange.OrderDetail{
@@ -470,7 +470,7 @@ func (y *Yobit) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([]
var orders []exchange.OrderDetail
for _, order := range allOrders {
symbol := currency.NewPairDelimiter(order.Pair,
y.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
y.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(int64(order.Timestamp), 0)
side := exchange.OrderSide(strings.ToUpper(order.Type))
orders = append(orders, exchange.OrderDetail{

View File

@@ -455,7 +455,7 @@ func (z *ZB) GetActiveOrders(getOrdersRequest *exchange.GetOrdersRequest) ([]exc
var orders []exchange.OrderDetail
for _, order := range allOrders {
symbol := currency.NewPairDelimiter(order.Currency,
z.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
z.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(int64(order.TradeDate), 0)
orderSide := orderSideMap[order.Type]
orders = append(orders, exchange.OrderDetail{
@@ -511,7 +511,7 @@ func (z *ZB) GetOrderHistory(getOrdersRequest *exchange.GetOrdersRequest) ([]exc
var orders []exchange.OrderDetail
for _, order := range allOrders {
symbol := currency.NewPairDelimiter(order.Currency,
z.CurrencyPairs.Get(asset.Spot).ConfigFormat.Delimiter)
z.GetPairFormat(asset.Spot, false).Delimiter)
orderDate := time.Unix(int64(order.TradeDate), 0)
orderSide := orderSideMap[order.Type]
orders = append(orders, exchange.OrderDetail{