Skip to content

Commit eb1ff5c

Browse files
authored
Merge pull request binance-exchange#122 from nilswxa/master
Support newOrderRespType and fix onFailure routing in BinanceApiCallbackAdapter.
2 parents bf55921 + 16e94f3 commit eb1ff5c

10 files changed

Lines changed: 152 additions & 11 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ System.out.println(order.getExecutedQty());
186186

187187
#### Placing a MARKET order
188188
```java
189-
NewOrderResponse newOrderResponse = client.newOrder(marketBuy("LINKETH", "1000"));
189+
NewOrderResponse newOrderResponse = client.newOrder(marketBuy("LINKETH", "1000").orderRespType(OrderResponseType.FULL));
190+
List<Trade> fills = newOrderResponse.getFills();
190191
System.out.println(newOrderResponse.getClientOrderId());
191192
```
192193
<details>

src/main/java/com/binance/api/client/domain/account/NewOrder.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public class NewOrder {
5656
*/
5757
private String icebergQty;
5858

59+
/**
60+
* Set the response JSON. ACK, RESULT, or FULL; default: RESULT.
61+
*/
62+
private NewOrderResponseType newOrderRespType;
63+
5964
/**
6065
* Receiving window.
6166
*/
@@ -75,6 +80,7 @@ public NewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeI
7580
this.type = type;
7681
this.timeInForce = timeInForce;
7782
this.quantity = quantity;
83+
this.newOrderRespType = NewOrderResponseType.RESULT;
7884
this.timestamp = System.currentTimeMillis();
7985
this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW;
8086
}
@@ -168,6 +174,15 @@ public NewOrder icebergQty(String icebergQty) {
168174
return this;
169175
}
170176

177+
public NewOrderResponseType getNewOrderRespType() {
178+
return newOrderRespType;
179+
}
180+
181+
public NewOrder newOrderRespType(NewOrderResponseType newOrderRespType) {
182+
this.newOrderRespType = newOrderRespType;
183+
return this;
184+
}
185+
171186
public Long getRecvWindow() {
172187
return recvWindow;
173188
}
@@ -234,6 +249,7 @@ public String toString() {
234249
.append("newClientOrderId", newClientOrderId)
235250
.append("stopPrice", stopPrice)
236251
.append("icebergQty", icebergQty)
252+
.append("newOrderRespType", newOrderRespType)
237253
.append("recvWindow", recvWindow)
238254
.append("timestamp", timestamp)
239255
.toString();

src/main/java/com/binance/api/client/domain/account/NewOrderResponse.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
package com.binance.api.client.domain.account;
22

33
import com.binance.api.client.constant.BinanceApiConstants;
4+
import com.binance.api.client.domain.OrderSide;
5+
import com.binance.api.client.domain.OrderStatus;
6+
import com.binance.api.client.domain.OrderType;
7+
import com.binance.api.client.domain.TimeInForce;
48
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
59
import org.apache.commons.lang3.builder.ToStringBuilder;
610

11+
import java.util.List;
12+
import java.util.stream.Collectors;
13+
714
/**
815
* Response returned when placing a new order on the system.
916
*
@@ -28,6 +35,22 @@ public class NewOrderResponse {
2835
*/
2936
private String clientOrderId;
3037

38+
private String price;
39+
40+
private String origQty;
41+
42+
private String executedQty;
43+
44+
private OrderStatus status;
45+
46+
private TimeInForce timeInForce;
47+
48+
private OrderType type;
49+
50+
private OrderSide side;
51+
52+
private List<Trade> fills;
53+
3154
/**
3255
* Transact time for this order.
3356
*/
@@ -65,13 +88,85 @@ public void setTransactTime(Long transactTime) {
6588
this.transactTime = transactTime;
6689
}
6790

91+
public String getPrice() {
92+
return price;
93+
}
94+
95+
public void setPrice(String price) {
96+
this.price = price;
97+
}
98+
99+
public String getOrigQty() {
100+
return origQty;
101+
}
102+
103+
public void setOrigQty(String origQty) {
104+
this.origQty = origQty;
105+
}
106+
107+
public String getExecutedQty() {
108+
return executedQty;
109+
}
110+
111+
public void setExecutedQty(String executedQty) {
112+
this.executedQty = executedQty;
113+
}
114+
115+
public OrderStatus getStatus() {
116+
return status;
117+
}
118+
119+
public void setStatus(OrderStatus status) {
120+
this.status = status;
121+
}
122+
123+
public TimeInForce getTimeInForce() {
124+
return timeInForce;
125+
}
126+
127+
public void setTimeInForce(TimeInForce timeInForce) {
128+
this.timeInForce = timeInForce;
129+
}
130+
131+
public OrderType getType() {
132+
return type;
133+
}
134+
135+
public void setType(OrderType type) {
136+
this.type = type;
137+
}
138+
139+
public OrderSide getSide() {
140+
return side;
141+
}
142+
143+
public void setSide(OrderSide side) {
144+
this.side = side;
145+
}
146+
147+
public List<Trade> getFills() {
148+
return fills;
149+
}
150+
151+
public void setFills(List<Trade> fills) {
152+
this.fills = fills;
153+
}
154+
68155
@Override
69156
public String toString() {
70157
return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE)
71158
.append("symbol", symbol)
72159
.append("orderId", orderId)
73160
.append("clientOrderId", clientOrderId)
74161
.append("transactTime", transactTime)
162+
.append("price", price)
163+
.append("origQty", origQty)
164+
.append("executedQty", executedQty)
165+
.append("status", status)
166+
.append("timeInForce", timeInForce)
167+
.append("type", type)
168+
.append("side", side)
169+
.append("fills", fills.stream().map(Object::toString).collect(Collectors.joining(", ")))
75170
.toString();
76171
}
77172
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.binance.api.client.domain.account;
2+
3+
/**
4+
* Desired response type of NewOrder requests.
5+
* @see NewOrderResponse
6+
*/
7+
public enum NewOrderResponseType {
8+
ACK,
9+
RESULT,
10+
FULL
11+
}
12+

src/main/java/com/binance/api/client/domain/account/Trade.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.binance.api.client.constant.BinanceApiConstants;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.fasterxml.jackson.annotation.JsonSetter;
56
import org.apache.commons.lang3.builder.ToStringBuilder;
67

78
/**
@@ -54,10 +55,18 @@ public Long getId() {
5455
return id;
5556
}
5657

58+
@JsonSetter("id")
5759
public void setId(Long id) {
5860
this.id = id;
5961
}
6062

63+
@JsonSetter("tradeId")
64+
public void setTradeId(Long id) {
65+
if (this.id == null) {
66+
setId(id);
67+
}
68+
}
69+
6170
public String getPrice() {
6271
return price;
6372
}

src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,14 @@ public void getBookTickers(BinanceApiCallback<List<BookTicker>> callback) {
133133
public void newOrder(NewOrder order, BinanceApiCallback<NewOrderResponse> callback) {
134134
binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(),
135135
order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(),
136-
order.getIcebergQty(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback));
136+
order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback));
137137
}
138138

139139
@Override
140140
public void newOrderTest(NewOrder order, BinanceApiCallback<Void> callback) {
141141
binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(),
142142
order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(),
143-
order.getIcebergQty(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback));
143+
order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback));
144144
}
145145

146146
// Account endpoints

src/main/java/com/binance/api/client/impl/BinanceApiCallbackAdapter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,19 @@ public void onResponse(Call<T> call, Response<T> response) {
3333
}
3434
try {
3535
BinanceApiError apiError = getBinanceApiError(response);
36-
throw new BinanceApiException(apiError);
36+
onFailure(call, new BinanceApiException(apiError));
3737
} catch (IOException e) {
38-
throw new BinanceApiException(e);
38+
onFailure(call, new BinanceApiException(e));
3939
}
4040
}
4141
}
4242

4343
@Override
4444
public void onFailure(Call<T> call, Throwable throwable) {
45-
throw new BinanceApiException(throwable);
45+
if (throwable instanceof BinanceApiException) {
46+
callback.onFailure(throwable);
47+
} else {
48+
callback.onFailure(new BinanceApiException(throwable));
49+
}
4650
}
4751
}

src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,14 @@ public List<BookTicker> getBookTickers() {
130130
public NewOrderResponse newOrder(NewOrder order) {
131131
return executeSync(binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(),
132132
order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(),
133-
order.getIcebergQty(), order.getRecvWindow(), order.getTimestamp()));
133+
order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()));
134134
}
135135

136136
@Override
137137
public void newOrderTest(NewOrder order) {
138138
executeSync(binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(),
139139
order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(),
140-
order.getIcebergQty(), order.getRecvWindow(), order.getTimestamp()));
140+
order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()));
141141
}
142142

143143
// Account endpoints

src/main/java/com/binance/api/client/impl/BinanceApiService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.binance.api.client.domain.account.DepositAddress;
99
import com.binance.api.client.domain.account.DepositHistory;
1010
import com.binance.api.client.domain.account.NewOrderResponse;
11+
import com.binance.api.client.domain.account.NewOrderResponseType;
1112
import com.binance.api.client.domain.account.Order;
1213
import com.binance.api.client.domain.account.Trade;
1314
import com.binance.api.client.domain.account.TradeHistoryItem;
@@ -95,14 +96,16 @@ Call<List<Candlestick>> getCandlestickBars(@Query("symbol") String symbol, @Quer
9596
Call<NewOrderResponse> newOrder(@Query("symbol") String symbol, @Query("side") OrderSide side, @Query("type") OrderType type,
9697
@Query("timeInForce") TimeInForce timeInForce, @Query("quantity") String quantity, @Query("price") String price,
9798
@Query("newClientOrderId") String newClientOrderId, @Query("stopPrice") String stopPrice,
98-
@Query("icebergQty") String icebergQty, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp);
99+
@Query("icebergQty") String icebergQty, @Query("newOrderRespType") NewOrderResponseType newOrderRespType,
100+
@Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp);
99101

100102
@Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER)
101103
@POST("/api/v3/order/test")
102104
Call<Void> newOrderTest(@Query("symbol") String symbol, @Query("side") OrderSide side, @Query("type") OrderType type,
103105
@Query("timeInForce") TimeInForce timeInForce, @Query("quantity") String quantity, @Query("price") String price,
104106
@Query("newClientOrderId") String newClientOrderId, @Query("stopPrice") String stopPrice,
105-
@Query("icebergQty") String icebergQty, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp);
107+
@Query("icebergQty") String icebergQty, @Query("newOrderRespType") NewOrderResponseType newOrderRespType,
108+
@Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp);
106109

107110
@Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER)
108111
@GET("/api/v3/order")

src/test/java/com/binance/api/examples/OrdersExample.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.binance.api.client.BinanceApiRestClient;
55
import com.binance.api.client.domain.TimeInForce;
66
import com.binance.api.client.domain.account.NewOrderResponse;
7+
import com.binance.api.client.domain.account.NewOrderResponseType;
78
import com.binance.api.client.domain.account.Order;
89
import com.binance.api.client.domain.account.request.AllOrdersRequest;
910
import com.binance.api.client.domain.account.request.CancelOrderRequest;
@@ -51,7 +52,7 @@ public static void main(String[] args) {
5152
client.newOrderTest(marketBuy("LINKETH", "1000"));
5253

5354
// Placing a real LIMIT order
54-
NewOrderResponse newOrderResponse = client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"));
55+
NewOrderResponse newOrderResponse = client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001").newOrderRespType(NewOrderResponseType.FULL));
5556
System.out.println(newOrderResponse);
5657
}
5758

0 commit comments

Comments
 (0)