Skip to content

Commit

Permalink
Added current open orders. (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
0xdfgp committed Jul 7, 2018
1 parent af0c5fe commit 972d424
Show file tree
Hide file tree
Showing 6 changed files with 231 additions and 15 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,22 @@ request := binance.NewCancelOrderRequest("LTCBTC").
response, err := sdk.CancelOrder(request)
```

### Current open orders (USER_DATA)
Get all open orders on a symbol.

Official doc: [Current open orders (USER_DATA)](https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md#current-open-orders-user_data)

#### Example
```go
query := binance.NewGetOpenOrdersQuery("LTCBTC")
response, err := sdk.GetOpenOrders(query)

// With all optional parameters (See official doc)
query := binance.NewGetOpenOrdersQuery("LTCBTC").RecvWindow(2)
response, err := sdk.GetOpenOrders(query)
```


## Available web socket streams:
Not available yet.

Expand Down
10 changes: 5 additions & 5 deletions get_order.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"encoding/json"
)

type OpenOrder struct {
type Order struct {
Symbol string `json:"symbol"`
OrderId int64 `json:"orderId"`
ClientOrderId string `json:"clientOrderId"`
Expand Down Expand Up @@ -50,7 +50,7 @@ func (r *getOrderQuery) RecvWindow(value int64) *getOrderQuery {
return r
}

func (sdk Sdk) GetOrder(query *getOrderQuery) (*OpenOrder, error) {
func (sdk Sdk) GetOrder(query *getOrderQuery) (*Order, error) {
req := newRequest("GET", "/api/v3/order").
StringParam("symbol", query.symbol).
Int64Param("orderId", query.orderId).
Expand All @@ -64,11 +64,11 @@ func (sdk Sdk) GetOrder(query *getOrderQuery) (*OpenOrder, error) {
return nil, err
}

return parseOpenOrderResponse(responseContent)
return parseOrderResponse(responseContent)
}

func parseOpenOrderResponse(jsonContent []byte) (*OpenOrder, error) {
response := &OpenOrder{}
func parseOrderResponse(jsonContent []byte) (*Order, error) {
response := &Order{}
err := json.Unmarshal(jsonContent, &response)
return response, err
}
14 changes: 7 additions & 7 deletions get_order_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,12 @@ func TestSdk_GetOrder(t *testing.T) {
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(validOpenOrderJson(), nil)
Return(validOrderJson(), nil)

query := NewGetOrderQuery("LTCBTC")
response, _ := sdk.GetOrder(query)

assert.Equal(t, validOpenOrderResponse(), response)
assert.Equal(t, validOrderResponse(), response)
})

t.Run("It should read optional parameters", func(t *testing.T) {
Expand All @@ -59,7 +59,7 @@ func TestSdk_GetOrder(t *testing.T) {
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(validOpenOrderJson(), nil)
Return(validOrderJson(), nil)

query := NewGetOrderQuery("LTCBTC").
OrderId(1).
Expand All @@ -68,7 +68,7 @@ func TestSdk_GetOrder(t *testing.T) {

response, _ := sdk.GetOrder(query)

assert.Equal(t, validOpenOrderResponse(), response)
assert.Equal(t, validOrderResponse(), response)
})

t.Run("It should return error when api fails", func(t *testing.T) {
Expand Down Expand Up @@ -124,7 +124,7 @@ func TestSdk_GetOrder(t *testing.T) {
})
}

func validOpenOrderJson() []byte {
func validOrderJson() []byte {
return []byte(`{
"symbol": "LTCBTC",
"orderId": 1,
Expand All @@ -143,8 +143,8 @@ func validOpenOrderJson() []byte {
}`)
}

func validOpenOrderResponse() *OpenOrder {
return &OpenOrder{
func validOrderResponse() *Order {
return &Order{
Symbol: "LTCBTC",
OrderId: 1,
ClientOrderId: "myOrder1",
Expand Down
6 changes: 3 additions & 3 deletions new_order.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type FullOrder struct {
TimeInForce string `json:"timeInForce"`
Type string `json:"type"`
Side string `json:"side"`
Fills []OrderFill `json:"fills"`
Fills []OrderFill `json:"fills"`
}

type OrderFill struct {
Expand Down Expand Up @@ -109,10 +109,10 @@ func (sdk Sdk) NewOrder(request *newOrderRequest) (*FullOrder, error) {
return nil, err
}

return parseOrderResponse(responseContent)
return parseNewOrderResponse(responseContent)
}

func parseOrderResponse(jsonContent []byte) (*FullOrder, error) {
func parseNewOrderResponse(jsonContent []byte) (*FullOrder, error) {
response := &FullOrder{}
err := json.Unmarshal(jsonContent, &response)
return response, err
Expand Down
43 changes: 43 additions & 0 deletions open_orders.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package binance

import (
"encoding/json"
)

type getOpenOrdersQuery struct {
symbol *string
recvWindow *int64
timestamp *int64
}

func NewGetOpenOrdersQuery(symbol string) *getOpenOrdersQuery {
return &getOpenOrdersQuery{
symbol: &symbol,
}
}

func (r *getOpenOrdersQuery) RecvWindow(value int64) *getOpenOrdersQuery {
r.recvWindow = &value
return r
}

func (sdk Sdk) GetOpenOrders(query *getOpenOrdersQuery) ([]Order, error) {
req := newRequest("GET", "/api/v3/openOrders").
StringParam("symbol", query.symbol).
Int64Param("recvWindow", query.recvWindow).
Int64Param("timestamp", sdk.clock.Now()).
Sign()

responseContent, err := sdk.client.Do(req)
if err != nil {
return nil, err
}

return parseOrdersResponse(responseContent)
}

func parseOrdersResponse(jsonContent []byte) ([]Order, error) {
response := make([]Order, 0)
err := json.Unmarshal(jsonContent, &response)
return response, err
}
157 changes: 157 additions & 0 deletions open_orders_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package binance

import (
"errors"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"strconv"
"testing"
"time"
)

func TestSdk_GetOpenOrders(t *testing.T) {
method, url := "GET", "/api/v3/openOrders"

t.Run("It should convert api response to an open order", func(t *testing.T) {
ctrl := gomock.NewController(t)
mockedClock := NewMockClock(ctrl)
mockedClient := NewMockClient(ctrl)
sdk := Sdk{client: mockedClient, clock: mockedClock}

expectedTimestamp := time.Now().Unix()
mockedClock.EXPECT().Now().Return(&expectedTimestamp)

expectedRequest := newRequest(method, url).
Param("symbol", "LTCBTC").
Param("timestamp", strconv.FormatInt(expectedTimestamp, 10)).
Sign()

mockedClient.
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(validOpenOrdersJson(), nil)

query := NewGetOpenOrdersQuery("LTCBTC")
response, _ := sdk.GetOpenOrders(query)

assert.Equal(t, validOpenOrdersResponse(), response)
})

t.Run("It should read optional parameters", func(t *testing.T) {
ctrl := gomock.NewController(t)
mockedClock := NewMockClock(ctrl)
mockedClient := NewMockClient(ctrl)
sdk := Sdk{client: mockedClient, clock: mockedClock}

expectedTimestamp := time.Now().Unix()
mockedClock.EXPECT().Now().Return(&expectedTimestamp)

expectedRequest := newRequest(method, url).
Param("symbol", "LTCBTC").
Param("recvWindow", "2").
Param("timestamp", strconv.FormatInt(expectedTimestamp, 10)).
Sign()

mockedClient.
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(validOpenOrdersJson(), nil)

query := NewGetOpenOrdersQuery("LTCBTC").RecvWindow(2)
response, _ := sdk.GetOpenOrders(query)

assert.Equal(t, validOpenOrdersResponse(), response)
})

t.Run("It should return error when api fails", func(t *testing.T) {
ctrl := gomock.NewController(t)
mockedClock := NewMockClock(ctrl)
mockedClient := NewMockClient(ctrl)
sdk := Sdk{client: mockedClient, clock: mockedClock}

expectedTimestamp := time.Now().Unix()
mockedClock.EXPECT().Now().Return(&expectedTimestamp)

expectedRequest := newRequest(method, url).
Param("symbol", "LTCBTC").
Param("timestamp", strconv.FormatInt(expectedTimestamp, 10)).
Sign()

mockedClient.
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(nil, errors.New("error"))

query := NewGetOpenOrdersQuery("LTCBTC")
_, err := sdk.GetOpenOrders(query)

assert.Error(t, err)
})

t.Run("It should return error when response cannot be mapped", func(t *testing.T) {
ctrl := gomock.NewController(t)
mockedClock := NewMockClock(ctrl)
mockedClient := NewMockClient(ctrl)
sdk := Sdk{client: mockedClient, clock: mockedClock}

expectedTimestamp := time.Now().Unix()
mockedClock.EXPECT().Now().Return(&expectedTimestamp)

expectedRequest := newRequest(method, url).
Param("symbol", "LTCBTC").
Param("timestamp", strconv.FormatInt(expectedTimestamp, 10)).
Sign()

mockedClient.
EXPECT().
Do(expectedRequest).
MinTimes(1).
Return(invalidJson(), nil)

query := NewGetOpenOrdersQuery("LTCBTC")
_, err := sdk.GetOpenOrders(query)

assert.Error(t, err)
})
}

func validOpenOrdersJson() []byte {
return []byte(`[{
"symbol": "LTCBTC",
"orderId": 1,
"clientOrderId": "myOrder1",
"price": "0.1",
"origQty": "1.0",
"executedQty": "0.0",
"status": "NEW",
"timeInForce": "GTC",
"type": "LIMIT",
"side": "BUY",
"stopPrice": "0.0",
"icebergQty": "0.0",
"time": 1499827319559,
"isWorking": true
}]`)
}

func validOpenOrdersResponse() []Order {
return []Order{{
Symbol: "LTCBTC",
OrderId: 1,
ClientOrderId: "myOrder1",
Price: 0.1,
OriginalQuantity: 1,
ExecutedQuantity: 0,
Status: "NEW",
TimeInForce: "GTC",
Type: "LIMIT",
Side: "BUY",
StopPrice: 0.0,
IcebergQuantity: 0.0,
Time: 1499827319559,
IsWorking: true,
}}
}

0 comments on commit 972d424

Please sign in to comment.