From ce7983541984d0e7a0e465451d28d7c5a4ae3356 Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Mon, 2 Mar 2020 00:20:22 +0300 Subject: [PATCH 1/6] rename some classes --- .../java/io/bitmax/api/Authorization.java | 23 +++++++++++-------- .../client/BitMaxRestApiClientAccount.java | 8 ++++--- .../messages/responses/OpenOrdersList.java | 6 ++--- .../rest/messages/responses/OrderDetails.java | 8 +++---- ...Order.java => RestPlaceOrderResponse.java} | 2 +- ...elOrder.java => WebSocketCancelOrder.java} | 4 ++-- ...aceOrder.java => WebSocketPlaceOrder.java} | 4 ++-- .../examples/account/socket/OrderExample.java | 8 +++---- 8 files changed, 34 insertions(+), 29 deletions(-) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{Order.java => RestPlaceOrderResponse.java} (99%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/{CancelOrder.java => WebSocketCancelOrder.java} (93%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/{PlaceOrder.java => WebSocketPlaceOrder.java} (97%) diff --git a/example/java/example/src/main/java/io/bitmax/api/Authorization.java b/example/java/example/src/main/java/io/bitmax/api/Authorization.java index 388f80c..d5ee8be 100644 --- a/example/java/example/src/main/java/io/bitmax/api/Authorization.java +++ b/example/java/example/src/main/java/io/bitmax/api/Authorization.java @@ -10,7 +10,6 @@ public class Authorization { private String apiKey; - private String secretKey; private Mac hmac; private byte[] hmacKey; private SecretKeySpec keySpec; @@ -20,7 +19,6 @@ public class Authorization { */ public Authorization(String apiKey, String secretKey) { this.apiKey = apiKey; - this.secretKey = secretKey; hmacKey = Base64.getDecoder().decode(secretKey); try { @@ -35,14 +33,14 @@ public Authorization(String apiKey, String secretKey) { /** * @return authorization headers - * @param url path for generating specific signature + * @param path path for generating specific signature * @param timestamp milliseconds since UNIX epoch in UTC */ - public Map getHeaderMap(String url, long timestamp) { + public Map getHeaderMap(String path, long timestamp) { Map headers = new HashMap<>(); headers.put("x-auth-key", apiKey); - headers.put("x-auth-signature", generateSig(url, timestamp)); - headers.put("x-auth-timestamp", timestamp + ""); + headers.put("x-auth-signature", generateSig(path, timestamp)); + headers.put("x-auth-timestamp", String.valueOf(timestamp)); return headers; } @@ -50,8 +48,15 @@ public Map getHeaderMap(String url, long timestamp) { * @return signature, signed using sha256 using the base64-decoded secret key */ private String generateSig(String url, long timestamp) { - String prehash = timestamp + "+" + url; - byte[] encoded = Base64.getEncoder().encode(hmac.doFinal(prehash.getBytes(StandardCharsets.UTF_8))); - return new String(encoded); + String preHash = timestamp + "+" + url; + return new String(Base64.getEncoder().encode(hmac.doFinal(preHash.getBytes(StandardCharsets.UTF_8)))); + } + + /** + * @return signature, signed using sha256 using the base64-decoded secret key + */ + private String generateSig(String url, long timestamp, String coid) { + String preHash = timestamp + "+" + url + "+" + coid; + return new String(Base64.getEncoder().encode(hmac.doFinal(preHash.getBytes(StandardCharsets.UTF_8)))); } } \ No newline at end of file diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java index 3c03c8e..13dbb90 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java @@ -5,9 +5,8 @@ import io.bitmax.api.rest.messages.responses.OpenOrdersList; import io.bitmax.api.rest.messages.responses.OrderDetails; import io.bitmax.api.rest.messages.responses.UserInfo; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; +import io.bitmax.api.rest.messages.requests.RestPlaceOrderRequest; +import okhttp3.*; import java.util.Map; @@ -31,6 +30,7 @@ public BitMaxRestApiClientAccount(String apiKey, String secret) { /** * @return 'UserInfo' object that contains 'userGroup' field + * @exception RuntimeException throws if something wrong (e.g. not correct response) */ public UserInfo getUserInfo() { Map headers = authClient.getHeaderMap(PATH_INFO, System.currentTimeMillis()); @@ -55,6 +55,7 @@ public UserInfo getUserInfo() { /** * @return list of open orders + * @exception RuntimeException throws if something wrong (e.g. not correct response) */ public OpenOrdersList getOpenOrders() { Map headers = authClient.getHeaderMap(PATH_ORDERS, System.currentTimeMillis()); @@ -79,6 +80,7 @@ public OpenOrdersList getOpenOrders() { /** * @return detailed info about specific order + * @exception RuntimeException throws if something wrong (e.g. not correct response) * @param coid id of expected order */ public OrderDetails getOrder(String coid) { diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java index 5ac842b..61069f8 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java @@ -30,7 +30,7 @@ public class OpenOrdersList { * array with data about every open Order */ @JsonProperty("data") - private Order[] data; + private RestPlaceOrderResponse[] data; public int getCode() { return code; @@ -56,11 +56,11 @@ public void setEmail(String email) { this.email = email; } - public Order[] getData() { + public RestPlaceOrderResponse[] getData() { return data; } - public void setData(Order[] data) { + public void setData(RestPlaceOrderResponse[] data) { this.data = data; } diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java index b0d349b..270788f 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java @@ -3,8 +3,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Arrays; - @JsonIgnoreProperties(ignoreUnknown = true) public class OrderDetails { @@ -30,7 +28,7 @@ public class OrderDetails { * data about open Order */ @JsonProperty("data") - private Order data; + private RestPlaceOrderResponse data; public int getCode() { return code; @@ -56,11 +54,11 @@ public void setEmail(String email) { this.email = email; } - public Order getData() { + public RestPlaceOrderResponse getData() { return data; } - public void setData(Order data) { + public void setData(RestPlaceOrderResponse data) { this.data = data; } diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Order.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestPlaceOrderResponse.java similarity index 99% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Order.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestPlaceOrderResponse.java index 73b01cc..f120a7b 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Order.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestPlaceOrderResponse.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class Order { +public class RestPlaceOrderResponse { /** * time diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/CancelOrder.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketCancelOrder.java similarity index 93% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/CancelOrder.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketCancelOrder.java index 2a70e9b..7d769ec 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/CancelOrder.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketCancelOrder.java @@ -5,7 +5,7 @@ /** * Cancel an Order with WebSocket */ -public class CancelOrder { +public class WebSocketCancelOrder { /** * message type @@ -79,7 +79,7 @@ public void setSymbol(String symbol) { @Override public String toString() { - return "CancelOrder:\n\tmessageType: " + messageType + + return "WebSocketCancelOrder:\n\tmessageType: " + messageType + "\n\ttime: " + time + "\n\tcoid: " + coid + "\n\tsymbol: " + symbol + diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/PlaceOrder.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketPlaceOrder.java similarity index 97% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/PlaceOrder.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketPlaceOrder.java index 144fa84..55a9f46 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/PlaceOrder.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketPlaceOrder.java @@ -5,7 +5,7 @@ /** * Place a New Order with WebSocket * */ -public class PlaceOrder { +public class WebSocketPlaceOrder { /** * message type @@ -163,7 +163,7 @@ public void setTimeInForce(String timeInForce) { @Override public String toString() { - return "PlaceOrder:\n\tmessageType: " + messageType + + return "WebSocketPlaceOrder:\n\tmessageType: " + messageType + "\n\ttime: " + time + "\n\tcoid: " + coid + "\n\tsymbol: " + symbol + diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java index cfe7eae..96168b3 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java @@ -3,8 +3,8 @@ import io.bitmax.api.Authorization; import io.bitmax.api.rest.client.BitMaxRestApiClientAccount; import io.bitmax.api.websocket.BitMaxApiWebSocketListener; -import io.bitmax.api.websocket.messages.requests.CancelOrder; -import io.bitmax.api.websocket.messages.requests.PlaceOrder; +import io.bitmax.api.websocket.messages.requests.WebSocketCancelOrder; +import io.bitmax.api.websocket.messages.requests.WebSocketPlaceOrder; import io.bitmax.api.websocket.messages.requests.Subscribe; import java.util.Map; @@ -40,7 +40,7 @@ public static void main(String[] args) { String placeCoid = "coid_" + time1; - PlaceOrder placeOrder = new PlaceOrder(); + WebSocketPlaceOrder placeOrder = new WebSocketPlaceOrder(); placeOrder.setMessageType("newOrderRequest"); placeOrder.setTime(time1); placeOrder.setSymbol("EOS/ETH"); @@ -59,7 +59,7 @@ public static void main(String[] args) { String cancelCoid = "coid_" + time2; - CancelOrder cancelOrder = new CancelOrder(); + WebSocketCancelOrder cancelOrder = new WebSocketCancelOrder(); cancelOrder.setMessageType("cancelOrderRequest"); cancelOrder.setTime(time2); cancelOrder.setCoid(cancelCoid); From fef60caf908f80e41025e86795b22732ac0f2114 Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Mon, 2 Mar 2020 00:23:09 +0300 Subject: [PATCH 2/6] rename some `WebSocket` and `Rest` classes --- .../api/rest/client/BitMaxRestApiClient.java | 12 ++--- .../client/BitMaxRestApiClientAccount.java | 47 +++++++++++++++---- .../{BarHist.java => RestBarHist.java} | 2 +- ...rdersList.java => RestOpenOrdersList.java} | 2 +- ...rderDetails.java => RestOrderDetails.java} | 2 +- .../{Product.java => RestProduct.java} | 2 +- .../{UserInfo.java => RestUserInfo.java} | 2 +- .../websocket/BitMaxApiWebSocketListener.java | 38 +++++++-------- ...Subscribe.java => WebSocketSubscribe.java} | 2 +- .../responses/{Bar.java => WebSocketBar.java} | 2 +- .../{Depth.java => WebSocketDepth.java} | 2 +- ...Trades.java => WebSocketMarketTrades.java} | 8 ++-- .../{Order.java => WebSocketOrder.java} | 2 +- .../{Summary.java => WebSocketSummary.java} | 2 +- .../{Trade.java => WebSocketTrade.java} | 2 +- .../account/socket/AccountExample.java | 4 +- .../examples/account/socket/OrderExample.java | 4 +- .../examples/common/rest/BarHistExample.java | 4 +- .../examples/common/rest/ProductExample.java | 4 +- .../examples/common/socket/PublicExample.java | 4 +- 20 files changed, 88 insertions(+), 59 deletions(-) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{BarHist.java => RestBarHist.java} (99%) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{OpenOrdersList.java => RestOpenOrdersList.java} (97%) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{OrderDetails.java => RestOrderDetails.java} (97%) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{Product.java => RestProduct.java} (99%) rename example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/{UserInfo.java => RestUserInfo.java} (94%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/{Subscribe.java => WebSocketSubscribe.java} (98%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{Bar.java => WebSocketBar.java} (99%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{Depth.java => WebSocketDepth.java} (98%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{MarketTrades.java => WebSocketMarketTrades.java} (82%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{Order.java => WebSocketOrder.java} (99%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{Summary.java => WebSocketSummary.java} (98%) rename example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/{Trade.java => WebSocketTrade.java} (97%) diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClient.java b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClient.java index 9ab0094..3143aaa 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClient.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClient.java @@ -1,8 +1,8 @@ package io.bitmax.api.rest.client; import io.bitmax.api.Mapper; -import io.bitmax.api.rest.messages.responses.BarHist; -import io.bitmax.api.rest.messages.responses.Product; +import io.bitmax.api.rest.messages.responses.RestBarHist; +import io.bitmax.api.rest.messages.responses.RestProduct; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -33,7 +33,7 @@ public BitMaxRestApiClient() { * @param interval bars interval * @param limit max bars count */ - public BarHist[] getCandlestickBars(String symbol, Interval interval, int limit) { + public RestBarHist[] getCandlestickBars(String symbol, Interval interval, int limit) { long[] between = getFrom(interval, limit); String params = "?symbol=" + symbol + "&interval="+interval+"&from=" + between[0] + "&to=" + between[1]; @@ -44,7 +44,7 @@ public BarHist[] getCandlestickBars(String symbol, Interval interval, int limit) .build() ).execute(); - return Mapper.asObject(result.body().string(), BarHist[].class); + return Mapper.asObject(result.body().string(), RestBarHist[].class); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); @@ -54,7 +54,7 @@ public BarHist[] getCandlestickBars(String symbol, Interval interval, int limit) /** * @return Each market summary data record contains current information about every product. */ - public Product[] getProducts() { + public RestProduct[] getProducts() { try { Response result = client.newCall(new Request.Builder() .url(URL + API + PATH_PRODUCTS) @@ -62,7 +62,7 @@ public Product[] getProducts() { .build() ).execute(); - return Mapper.asObject(result.body().string(), Product[].class); + return Mapper.asObject(result.body().string(), RestProduct[].class); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java index 13dbb90..c671a58 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java @@ -2,9 +2,9 @@ import io.bitmax.api.Authorization; import io.bitmax.api.Mapper; -import io.bitmax.api.rest.messages.responses.OpenOrdersList; -import io.bitmax.api.rest.messages.responses.OrderDetails; -import io.bitmax.api.rest.messages.responses.UserInfo; +import io.bitmax.api.rest.messages.responses.RestOpenOrdersList; +import io.bitmax.api.rest.messages.responses.RestOrderDetails; +import io.bitmax.api.rest.messages.responses.RestUserInfo; import io.bitmax.api.rest.messages.requests.RestPlaceOrderRequest; import okhttp3.*; @@ -32,7 +32,7 @@ public BitMaxRestApiClientAccount(String apiKey, String secret) { * @return 'UserInfo' object that contains 'userGroup' field * @exception RuntimeException throws if something wrong (e.g. not correct response) */ - public UserInfo getUserInfo() { + public RestUserInfo getUserInfo() { Map headers = authClient.getHeaderMap(PATH_INFO, System.currentTimeMillis()); Request.Builder builder = new Request.Builder() @@ -46,7 +46,7 @@ public UserInfo getUserInfo() { try { Response response = client.newCall(builder.build()).execute(); - return Mapper.asObject(response.body().string(), UserInfo.class); + return Mapper.asObject(response.body().string(), RestUserInfo.class); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); @@ -57,7 +57,7 @@ public UserInfo getUserInfo() { * @return list of open orders * @exception RuntimeException throws if something wrong (e.g. not correct response) */ - public OpenOrdersList getOpenOrders() { + public RestOpenOrdersList getOpenOrders() { Map headers = authClient.getHeaderMap(PATH_ORDERS, System.currentTimeMillis()); Request.Builder builder = new Request.Builder() @@ -71,7 +71,7 @@ public OpenOrdersList getOpenOrders() { try { Response response = client.newCall(builder.build()).execute(); - return Mapper.asObject(response.body().string(), OpenOrdersList.class); + return Mapper.asObject(response.body().string(), RestOpenOrdersList.class); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); @@ -83,7 +83,7 @@ public OpenOrdersList getOpenOrders() { * @exception RuntimeException throws if something wrong (e.g. not correct response) * @param coid id of expected order */ - public OrderDetails getOrder(String coid) { + public RestOrderDetails getOrder(String coid) { Map headers = authClient.getHeaderMap(PATH_ORDER, System.currentTimeMillis()); Request.Builder builder = new Request.Builder() @@ -97,7 +97,36 @@ public OrderDetails getOrder(String coid) { try { Response response = client.newCall(builder.build()).execute(); - return Mapper.asObject(response.body().string(), OrderDetails.class); + return Mapper.asObject(response.body().string(), RestOrderDetails.class); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + /** + * @return detailed info about order + * @exception RuntimeException throws if something wrong (order was not published) + * @param order is object which contains information about order + */ + public String placeOrder(RestPlaceOrderRequest order) { + long timestamp = System.currentTimeMillis(); + Map headers = authClient.getHeaderMap(PATH_ORDER, timestamp, order.getCoid()); + + RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), Mapper.asString(order)); + + Request.Builder builder = new Request.Builder() + .url(URL + accountGroup + '/' + API + PATH_ORDER) + .post(body); + + for (Map.Entry entry : headers.entrySet()) { + builder.header(entry.getKey(), entry.getValue()); + } + + try { + Response response = client.newCall(builder.build()).execute(); + + return response.body().string(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/BarHist.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestBarHist.java similarity index 99% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/BarHist.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestBarHist.java index 6d40236..bd3e7d0 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/BarHist.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestBarHist.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class BarHist { +public class RestBarHist { /** * message diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOpenOrdersList.java similarity index 97% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOpenOrdersList.java index 61069f8..4e72b48 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OpenOrdersList.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOpenOrdersList.java @@ -6,7 +6,7 @@ import java.util.Arrays; @JsonIgnoreProperties(ignoreUnknown = true) -public class OpenOrdersList { +public class RestOpenOrdersList { /** * response code diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOrderDetails.java similarity index 97% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOrderDetails.java index 270788f..7d2bb8b 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/OrderDetails.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestOrderDetails.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class OrderDetails { +public class RestOrderDetails { /** * response code diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Product.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestProduct.java similarity index 99% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Product.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestProduct.java index 08f4659..585404c 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/Product.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestProduct.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class Product { +public class RestProduct { @JsonProperty("symbol") private String symbol; diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/UserInfo.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestUserInfo.java similarity index 94% rename from example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/UserInfo.java rename to example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestUserInfo.java index 61a291f..42a72c8 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/UserInfo.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/responses/RestUserInfo.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public class UserInfo { +public class RestUserInfo { /** diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java b/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java index c88fcaf..afd9ef7 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java @@ -3,7 +3,7 @@ import io.bitmax.api.Mapper; import io.bitmax.api.websocket.client.BitMaxApiCallback; import io.bitmax.api.websocket.messages.responses.*; -import io.bitmax.api.websocket.messages.requests.Subscribe; +import io.bitmax.api.websocket.messages.requests.WebSocketSubscribe; import okhttp3.*; import okhttp3.ws.WebSocket; import okhttp3.ws.WebSocketCall; @@ -47,21 +47,21 @@ public class BitMaxApiWebSocketListener implements WebSocketListener { /** * callBacks or every message type */ - private BitMaxApiCallback summaryCallback; - private BitMaxApiCallback depthCallback; - private BitMaxApiCallback marketTradesCallback; - private BitMaxApiCallback barCallback; - private BitMaxApiCallback orderCallback; + private BitMaxApiCallback summaryCallback; + private BitMaxApiCallback depthCallback; + private BitMaxApiCallback marketTradesCallback; + private BitMaxApiCallback barCallback; + private BitMaxApiCallback orderCallback; /** * message for subscribe to channels */ - private Subscribe message; + private WebSocketSubscribe message; /** * Initialize listener for authorized user */ - public BitMaxApiWebSocketListener(Subscribe message, Map headersMap, String url) { + public BitMaxApiWebSocketListener(WebSocketSubscribe message, Map headersMap, String url) { this.message = message; OkHttpClient client = new OkHttpClient.Builder() @@ -79,7 +79,7 @@ public BitMaxApiWebSocketListener(Subscribe message, Map headers /** * Initialize listener for common messages */ - public BitMaxApiWebSocketListener(Subscribe message, String url) { + public BitMaxApiWebSocketListener(WebSocketSubscribe message, String url) { this.message = message; OkHttpClient client = new OkHttpClient.Builder() @@ -131,27 +131,27 @@ public void onMessage(ResponseBody message) throws IOException { if (pongPattern.matcher(text).find()) return; else if (summaryPattern.matcher(text).find()) { if (summaryCallback != null) { - summaryCallback.onResponse(Mapper.asObject(text, Summary.class)); + summaryCallback.onResponse(Mapper.asObject(text, WebSocketSummary.class)); return; } } else if (depthPattern.matcher(text).find()) { if (depthCallback != null) { - depthCallback.onResponse(Mapper.asObject(text, Depth.class)); + depthCallback.onResponse(Mapper.asObject(text, WebSocketDepth.class)); return; } } else if (marketTradesPattern.matcher(text).find()) { if (marketTradesCallback != null) { - marketTradesCallback.onResponse(Mapper.asObject(text, MarketTrades.class)); + marketTradesCallback.onResponse(Mapper.asObject(text, WebSocketMarketTrades.class)); return; } } else if (barPattern.matcher(text).find()) { if (barCallback != null) { - barCallback.onResponse(Mapper.asObject(text, Bar.class)); + barCallback.onResponse(Mapper.asObject(text, WebSocketBar.class)); return; } } else if (orderPattern.matcher(text).find()) { if (orderCallback != null) { - orderCallback.onResponse(Mapper.asObject(text, Order.class)); + orderCallback.onResponse(Mapper.asObject(text, WebSocketOrder.class)); return; } } @@ -174,23 +174,23 @@ public void onFailure(IOException e, Response response) { executor.shutdown(); } - public void setSummaryCallback(BitMaxApiCallback summaryCallback) { + public void setSummaryCallback(BitMaxApiCallback summaryCallback) { this.summaryCallback = summaryCallback; } - public void setDepthCallback(BitMaxApiCallback depthCallback) { + public void setDepthCallback(BitMaxApiCallback depthCallback) { this.depthCallback = depthCallback; } - public void setMarketTradesCallback(BitMaxApiCallback marketTradesCallback) { + public void setMarketTradesCallback(BitMaxApiCallback marketTradesCallback) { this.marketTradesCallback = marketTradesCallback; } - public void setBarCallback(BitMaxApiCallback barCallback) { + public void setBarCallback(BitMaxApiCallback barCallback) { this.barCallback = barCallback; } - public void setOrderCallback(BitMaxApiCallback orderCallback) { + public void setOrderCallback(BitMaxApiCallback orderCallback) { this.orderCallback = orderCallback; } } diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/Subscribe.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java similarity index 98% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/Subscribe.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java index fec8309..846e794 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/Subscribe.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java @@ -5,7 +5,7 @@ /** * Subscribe to webSocket */ -public class Subscribe { +public class WebSocketSubscribe { /** * message type diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Bar.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketBar.java similarity index 99% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Bar.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketBar.java index 8368859..fcc7350 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Bar.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketBar.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class Bar { +public class WebSocketBar { /** * product symbol diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Depth.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketDepth.java similarity index 98% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Depth.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketDepth.java index 7494e6c..ca77c3e 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Depth.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketDepth.java @@ -6,7 +6,7 @@ import java.util.Arrays; @JsonIgnoreProperties(ignoreUnknown = true) -public class Depth { +public class WebSocketDepth { /** * symbol diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/MarketTrades.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketMarketTrades.java similarity index 82% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/MarketTrades.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketMarketTrades.java index d0184ce..3d6ce3d 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/MarketTrades.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketMarketTrades.java @@ -6,7 +6,7 @@ import java.util.Arrays; @JsonIgnoreProperties(ignoreUnknown = true) -public class MarketTrades { +public class WebSocketMarketTrades { /** * symbol @@ -18,7 +18,7 @@ public class MarketTrades { * array of objects with info about every trade */ @JsonProperty("trades") - private Trade[] trades; + private WebSocketTrade[] trades; public String getSymbol() { return symbol; @@ -28,11 +28,11 @@ public void setSymbol(String symbol) { this.symbol = symbol; } - public Trade[] getTrades() { + public WebSocketTrade[] getTrades() { return trades; } - public void setTrades(Trade[] trades) { + public void setTrades(WebSocketTrade[] trades) { this.trades = trades; } diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Order.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java similarity index 99% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Order.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java index 53fa710..40be9af 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Order.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class Order { +public class WebSocketOrder { /** * client order id, (needed to cancel order) diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Summary.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketSummary.java similarity index 98% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Summary.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketSummary.java index 6edcb98..db23789 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Summary.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketSummary.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class Summary { +public class WebSocketSummary { /** * symbol diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Trade.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketTrade.java similarity index 97% rename from example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Trade.java rename to example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketTrade.java index 9711f94..3435dd9 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/Trade.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketTrade.java @@ -5,7 +5,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) -public class Trade { +public class WebSocketTrade { /** * price diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java index e71447d..3bdc3c2 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java @@ -3,7 +3,7 @@ import io.bitmax.api.Authorization; import io.bitmax.api.websocket.BitMaxApiWebSocketListener; import io.bitmax.api.rest.client.BitMaxRestApiClientAccount; -import io.bitmax.api.websocket.messages.requests.Subscribe; +import io.bitmax.api.websocket.messages.requests.WebSocketSubscribe; import java.util.Map; @@ -18,7 +18,7 @@ public static void main(String[] args) { String url = "wss://bitmax.io/" + accountGroup + "/api/stream/ETH-BTC"; - Subscribe subscribeMessage = new Subscribe(); + WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); subscribeMessage.setRecentTradeMaxCount(200); diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java index 96168b3..ef86a25 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java @@ -5,7 +5,7 @@ import io.bitmax.api.websocket.BitMaxApiWebSocketListener; import io.bitmax.api.websocket.messages.requests.WebSocketCancelOrder; import io.bitmax.api.websocket.messages.requests.WebSocketPlaceOrder; -import io.bitmax.api.websocket.messages.requests.Subscribe; +import io.bitmax.api.websocket.messages.requests.WebSocketSubscribe; import java.util.Map; @@ -20,7 +20,7 @@ public static void main(String[] args) { String url = "wss://bitmax.io/" + accountGroup + "/api/stream/EOS-ETH"; - Subscribe subscribeMessage = new Subscribe(); + WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); subscribeMessage.setRecentTradeMaxCount(200); diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/BarHistExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/BarHistExample.java index 1e73570..68fe4cb 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/BarHistExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/BarHistExample.java @@ -2,7 +2,7 @@ import io.bitmax.api.rest.client.BitMaxRestApiClient; import io.bitmax.api.rest.client.Interval; -import io.bitmax.api.rest.messages.responses.BarHist; +import io.bitmax.api.rest.messages.responses.RestBarHist; import java.util.Arrays; @@ -10,7 +10,7 @@ public class BarHistExample { public static void main(String[] args) { BitMaxRestApiClient restClient = new BitMaxRestApiClient(); - BarHist[] bars = restClient.getCandlestickBars("EOS/ETH", Interval.FIFTEEN_MINUTES, 200); + RestBarHist[] bars = restClient.getCandlestickBars("EOS/ETH", Interval.FIFTEEN_MINUTES, 200); String barsStr = Arrays.toString(bars); System.out.println(barsStr); diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/ProductExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/ProductExample.java index 4dbdb78..b55b858 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/ProductExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/common/rest/ProductExample.java @@ -1,7 +1,7 @@ package io.bitmax.api.examples.common.rest; import io.bitmax.api.rest.client.BitMaxRestApiClient; -import io.bitmax.api.rest.messages.responses.Product; +import io.bitmax.api.rest.messages.responses.RestProduct; import java.util.Arrays; @@ -9,7 +9,7 @@ public class ProductExample { public static void main(String[] args) { BitMaxRestApiClient restClient = new BitMaxRestApiClient(); - Product[] products = restClient.getProducts(); + RestProduct[] products = restClient.getProducts(); String barsStr = Arrays.toString(products); System.out.println(barsStr); diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java index 8deb9bc..d747cd3 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java @@ -1,14 +1,14 @@ package io.bitmax.api.examples.common.socket; import io.bitmax.api.websocket.BitMaxApiWebSocketListener; -import io.bitmax.api.websocket.messages.requests.Subscribe; +import io.bitmax.api.websocket.messages.requests.WebSocketSubscribe; public class PublicExample { public static void main(String[] args) { String url = "wss://bitmax.io/api/public/EOS-ETH"; - Subscribe subscribeMessage = new Subscribe(); + WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); subscribeMessage.setRecentTradeMaxCount(200); From 3392f1766e74156eb7c3fd057f9f7082fc713a13 Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Mon, 2 Mar 2020 00:24:44 +0300 Subject: [PATCH 3/6] add `placeOrder` method to rest client add example of `placeOrder` --- .../java/io/bitmax/api/Authorization.java | 15 ++ .../requests/RestPlaceOrderRequest.java | 148 ++++++++++++++++++ .../account/rest/PlaceOrderExample.java | 28 ++++ 3 files changed, 191 insertions(+) create mode 100644 example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestPlaceOrderRequest.java create mode 100644 example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java diff --git a/example/java/example/src/main/java/io/bitmax/api/Authorization.java b/example/java/example/src/main/java/io/bitmax/api/Authorization.java index d5ee8be..03dd8f1 100644 --- a/example/java/example/src/main/java/io/bitmax/api/Authorization.java +++ b/example/java/example/src/main/java/io/bitmax/api/Authorization.java @@ -44,6 +44,21 @@ public Map getHeaderMap(String path, long timestamp) { return headers; } + /** + * @return authorization headers + * @param path path for generating specific signature + * @param timestamp milliseconds since UNIX epoch in UTC + * @param coid generated unique orderId + */ + public Map getHeaderMap(String path, long timestamp, String coid) { + Map headers = new HashMap<>(); + headers.put("x-auth-key", apiKey); + headers.put("x-auth-signature", generateSig(path, timestamp, coid)); + headers.put("x-auth-timestamp", String.valueOf(timestamp)); + headers.put("x-auth-coid", coid); + return headers; + } + /** * @return signature, signed using sha256 using the base64-decoded secret key */ diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestPlaceOrderRequest.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestPlaceOrderRequest.java new file mode 100644 index 0000000..daed66a --- /dev/null +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestPlaceOrderRequest.java @@ -0,0 +1,148 @@ +package io.bitmax.api.rest.messages.requests; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** +* Place a New Order with Rest +* */ +public class RestPlaceOrderRequest { + + /** + * milliseconds since UNIX epoch in UTC + */ + @JsonProperty("time") + private long time; + + /** + * a 32-character unique client order Id + */ + @JsonProperty("coid") + private String coid; + + /** + * symbol + */ + @JsonProperty("symbol") + private String symbol; + + /** + * order price + */ + @JsonProperty("orderPrice") + private String orderPrice; + + /** + * order quantity + */ + @JsonProperty("orderQty") + private String orderQty; + + /** + * order type, you shall specify one of the following: "limit", "market", "stop_market", "stop_limit". + */ + @JsonProperty("orderType") + private String orderType; + + /** + * order side "buy" or "sell" + */ + @JsonProperty("side") + private String side; + + /** + * Optional, if true, the order will either be posted to the limit order book or be cancelled, i.e. the order cannot take liquidity; default value is false + */ + @JsonProperty("postOnly") + private boolean postOnly = false; + + /** + * optional, stop price of the order. This field is required for stop market orders and stop limit orders. + */ + @JsonProperty("stopPrice") + private String stopPrice = ""; + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getCoid() { + return coid; + } + + public void setCoid(String coid) { + this.coid = coid; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getOrderPrice() { + return orderPrice; + } + + public void setOrderPrice(String orderPrice) { + this.orderPrice = orderPrice; + } + + public String getOrderQty() { + return orderQty; + } + + public void setOrderQty(String orderQty) { + this.orderQty = orderQty; + } + + public String getOrderType() { + return orderType; + } + + public void setOrderType(String orderType) { + this.orderType = orderType; + } + + public String getSide() { + return side; + } + + public void setSide(String side) { + this.side = side; + } + + public boolean isPostOnly() { + return postOnly; + } + + public void setPostOnly(boolean postOnly) { + this.postOnly = postOnly; + } + + public String getStopPrice() { + return stopPrice; + } + + public void setStopPrice(String stopPrice) { + this.stopPrice = stopPrice; + } + + @Override + public String toString() { + return "RestPlaceOrderRequest:\n\ttime: " + time + + "\n\tcoid: " + coid + + "\n\tsymbol: " + symbol + + "\n\torderPrice: " + orderPrice + + "\n\torderQty: " + orderQty + + "\n\torderType: " + orderType + + "\n\tside: " + side + + "\n\tpostOnly: " + postOnly + + "\n\tstopPrice: " + stopPrice; + } +} diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java new file mode 100644 index 0000000..fc69118 --- /dev/null +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java @@ -0,0 +1,28 @@ +package io.bitmax.api.examples.account.rest; + +import io.bitmax.api.rest.client.BitMaxRestApiClientAccount; +import io.bitmax.api.rest.messages.requests.RestPlaceOrderRequest; + +public class PlaceOrderExample { + public static void main(String[] args) { + String apiKey = ""; + String secret = ""; + + BitMaxRestApiClientAccount restClient = new BitMaxRestApiClientAccount(apiKey, secret); + + long time = System.currentTimeMillis(); + + String coid = "coid_" + time; + + RestPlaceOrderRequest restPlaceOrderRequest = new RestPlaceOrderRequest(); + restPlaceOrderRequest.setTime(time); + restPlaceOrderRequest.setSymbol("EOS/ETH"); + restPlaceOrderRequest.setCoid(coid); + restPlaceOrderRequest.setOrderPrice("0.01"); + restPlaceOrderRequest.setOrderQty("4.0"); + restPlaceOrderRequest.setOrderType("limit"); + restPlaceOrderRequest.setSide("buy"); + + System.out.println(restClient.placeOrder(restPlaceOrderRequest)); + } +} From 4b631754a98771cc78ef242c43b91451d5dc21a5 Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Tue, 5 May 2020 01:51:02 +0300 Subject: [PATCH 4/6] add `placeOrder` method to rest client add example of `placeOrder` --- .../src/main/java/io/bitmax/api/Mapper.java | 4 +- .../client/BitMaxRestApiClientAccount.java | 74 +++++++++++-------- .../requests/RestCancelOrderRequest.java | 73 ++++++++++++++++++ .../examples/account/rest/OrderExample.java | 56 ++++++++++++++ .../account/rest/PlaceOrderExample.java | 28 ------- 5 files changed, 175 insertions(+), 60 deletions(-) create mode 100644 example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestCancelOrderRequest.java create mode 100644 example/java/example/src/test/java/io/bitmax/api/examples/account/rest/OrderExample.java delete mode 100644 example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java diff --git a/example/java/example/src/main/java/io/bitmax/api/Mapper.java b/example/java/example/src/main/java/io/bitmax/api/Mapper.java index 4d7750e..2dd2f35 100644 --- a/example/java/example/src/main/java/io/bitmax/api/Mapper.java +++ b/example/java/example/src/main/java/io/bitmax/api/Mapper.java @@ -8,11 +8,11 @@ * Converts json to java object and vice versa */ -public class Mapper { +public class Mapper { private static ObjectMapper mapper = new ObjectMapper(); /** - * @param json string in json-format + * @param json string in json-format * @param clazz class of object for converting from json to java object * @return an object with type and data from json */ diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java index c671a58..43119c5 100644 --- a/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java +++ b/example/java/example/src/main/java/io/bitmax/api/rest/client/BitMaxRestApiClientAccount.java @@ -2,6 +2,7 @@ import io.bitmax.api.Authorization; import io.bitmax.api.Mapper; +import io.bitmax.api.rest.messages.requests.RestCancelOrderRequest; import io.bitmax.api.rest.messages.responses.RestOpenOrdersList; import io.bitmax.api.rest.messages.responses.RestOrderDetails; import io.bitmax.api.rest.messages.responses.RestUserInfo; @@ -30,7 +31,7 @@ public BitMaxRestApiClientAccount(String apiKey, String secret) { /** * @return 'UserInfo' object that contains 'userGroup' field - * @exception RuntimeException throws if something wrong (e.g. not correct response) + * @throws RuntimeException throws if something wrong (e.g. not correct response) */ public RestUserInfo getUserInfo() { Map headers = authClient.getHeaderMap(PATH_INFO, System.currentTimeMillis()); @@ -43,19 +44,12 @@ public RestUserInfo getUserInfo() { builder.header(entry.getKey(), entry.getValue()); } - try { - Response response = client.newCall(builder.build()).execute(); - - return Mapper.asObject(response.body().string(), RestUserInfo.class); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } + return executeRequest(builder.build(), RestUserInfo.class); } /** * @return list of open orders - * @exception RuntimeException throws if something wrong (e.g. not correct response) + * @throws RuntimeException throws if something wrong (e.g. not correct response) */ public RestOpenOrdersList getOpenOrders() { Map headers = authClient.getHeaderMap(PATH_ORDERS, System.currentTimeMillis()); @@ -68,20 +62,13 @@ public RestOpenOrdersList getOpenOrders() { builder.header(entry.getKey(), entry.getValue()); } - try { - Response response = client.newCall(builder.build()).execute(); - - return Mapper.asObject(response.body().string(), RestOpenOrdersList.class); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } + return executeRequest(builder.build(), RestOpenOrdersList.class); } /** - * @return detailed info about specific order - * @exception RuntimeException throws if something wrong (e.g. not correct response) * @param coid id of expected order + * @return detailed info about specific order + * @throws RuntimeException throws if something wrong (e.g. not correct response) */ public RestOrderDetails getOrder(String coid) { Map headers = authClient.getHeaderMap(PATH_ORDER, System.currentTimeMillis()); @@ -94,10 +81,30 @@ public RestOrderDetails getOrder(String coid) { builder.header(entry.getKey(), entry.getValue()); } - try { - Response response = client.newCall(builder.build()).execute(); + return executeRequest(builder.build(), RestOrderDetails.class); + } - return Mapper.asObject(response.body().string(), RestOrderDetails.class); + /** + * @param order is object which contains information about order + * @return Response - object which contains information about result place order request + * @throws RuntimeException throws if something wrong (order was not published) + */ + public Response placeOrder(RestPlaceOrderRequest order) { + long timestamp = System.currentTimeMillis(); + Map headers = authClient.getHeaderMap(PATH_ORDER, timestamp, order.getCoid()); + + RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), Mapper.asString(order)); + + Request.Builder builder = new Request.Builder() + .url(URL + accountGroup + '/' + API + PATH_ORDER) + .post(body); + + for (Map.Entry entry : headers.entrySet()) { + builder.header(entry.getKey(), entry.getValue()); + } + + try { + return client.newCall(builder.build()).execute(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); @@ -105,28 +112,35 @@ public RestOrderDetails getOrder(String coid) { } /** - * @return detailed info about order - * @exception RuntimeException throws if something wrong (order was not published) * @param order is object which contains information about order + * @return Response - object which contains information about result cancel order request + * @throws RuntimeException throws if something wrong (order was not cancelled) */ - public String placeOrder(RestPlaceOrderRequest order) { + public Response cancelOrder(RestCancelOrderRequest order) { long timestamp = System.currentTimeMillis(); Map headers = authClient.getHeaderMap(PATH_ORDER, timestamp, order.getCoid()); - RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), Mapper.asString(order)); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), Mapper.asString(order)); Request.Builder builder = new Request.Builder() .url(URL + accountGroup + '/' + API + PATH_ORDER) - .post(body); + .delete(body); for (Map.Entry entry : headers.entrySet()) { builder.header(entry.getKey(), entry.getValue()); } try { - Response response = client.newCall(builder.build()).execute(); + return client.newCall(builder.build()).execute(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } - return response.body().string(); + private T executeRequest(Request request, Class clazz) { + try { + return Mapper.asObject(client.newCall(request).execute().body().string(), clazz); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); diff --git a/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestCancelOrderRequest.java b/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestCancelOrderRequest.java new file mode 100644 index 0000000..8a8f2d3 --- /dev/null +++ b/example/java/example/src/main/java/io/bitmax/api/rest/messages/requests/RestCancelOrderRequest.java @@ -0,0 +1,73 @@ +package io.bitmax.api.rest.messages.requests; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** +* Cancel an Order with Rest +* */ +public class RestCancelOrderRequest { + + /** + * milliseconds since UNIX epoch in UTC + */ + @JsonProperty("time") + private long time; + + /** + * a 32-character unique client order Id + */ + @JsonProperty("coid") + private String coid; + + /** + * a 32-character unique client cancel order Id + */ + @JsonProperty("origCoid") + private String origCoid; + + /** + * symbol + */ + @JsonProperty("symbol") + private String symbol; + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getCoid() { + return coid; + } + + public void setCoid(String coid) { + this.coid = coid; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getOrigCoid() { + return origCoid; + } + + public void setOrigCoid(String origCoid) { + this.origCoid = origCoid; + } + + @Override + public String toString() { + return "RestCancelOrderRequest:\n\ttime: " + time + + "\n\tcoid: " + coid + + "\n\tsymbol: " + symbol + + "\n\torigCoid: " + origCoid; + } +} diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/OrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/OrderExample.java new file mode 100644 index 0000000..135ac4c --- /dev/null +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/OrderExample.java @@ -0,0 +1,56 @@ +package io.bitmax.api.examples.account.rest; + +import io.bitmax.api.rest.client.BitMaxRestApiClientAccount; +import io.bitmax.api.rest.messages.requests.RestCancelOrderRequest; +import io.bitmax.api.rest.messages.requests.RestPlaceOrderRequest; +import okhttp3.Response; + +import java.io.IOException; + +public class OrderExample { + public static void main(String[] args) throws IOException, InterruptedException { + String apiKey = ""; + String secret = ""; + + BitMaxRestApiClientAccount restClient = new BitMaxRestApiClientAccount(apiKey, secret); + + long time = System.currentTimeMillis(); + + String placeCoid = "coid_" + time; + + RestPlaceOrderRequest restPlaceOrderRequest = new RestPlaceOrderRequest(); + restPlaceOrderRequest.setTime(time); + restPlaceOrderRequest.setSymbol("EOS/ETH"); + restPlaceOrderRequest.setCoid(placeCoid); + restPlaceOrderRequest.setOrderPrice("0.01"); + restPlaceOrderRequest.setOrderQty("4.0"); + restPlaceOrderRequest.setOrderType("limit"); + restPlaceOrderRequest.setSide("buy"); + + System.out.println(restPlaceOrderRequest); + + Response placeOrderResponse = restClient.placeOrder(restPlaceOrderRequest); + + System.out.println(placeOrderResponse.body().string()); + + + // waiting before order will be placed + Thread.sleep(1500); + + long time2 = System.currentTimeMillis(); + + String cancelCoid = "coid_" + time2; + + RestCancelOrderRequest restCancelOrderRequest = new RestCancelOrderRequest(); + restCancelOrderRequest.setTime(time); + restCancelOrderRequest.setSymbol("EOS/ETH"); + restCancelOrderRequest.setCoid(cancelCoid); + restCancelOrderRequest.setOrigCoid(placeCoid); + + System.out.println(restCancelOrderRequest); + + Response cancelOrderResponse = restClient.cancelOrder(restCancelOrderRequest); + + System.out.println(cancelOrderResponse.body().string()); + } +} diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java deleted file mode 100644 index fc69118..0000000 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/rest/PlaceOrderExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.bitmax.api.examples.account.rest; - -import io.bitmax.api.rest.client.BitMaxRestApiClientAccount; -import io.bitmax.api.rest.messages.requests.RestPlaceOrderRequest; - -public class PlaceOrderExample { - public static void main(String[] args) { - String apiKey = ""; - String secret = ""; - - BitMaxRestApiClientAccount restClient = new BitMaxRestApiClientAccount(apiKey, secret); - - long time = System.currentTimeMillis(); - - String coid = "coid_" + time; - - RestPlaceOrderRequest restPlaceOrderRequest = new RestPlaceOrderRequest(); - restPlaceOrderRequest.setTime(time); - restPlaceOrderRequest.setSymbol("EOS/ETH"); - restPlaceOrderRequest.setCoid(coid); - restPlaceOrderRequest.setOrderPrice("0.01"); - restPlaceOrderRequest.setOrderQty("4.0"); - restPlaceOrderRequest.setOrderType("limit"); - restPlaceOrderRequest.setSide("buy"); - - System.out.println(restClient.placeOrder(restPlaceOrderRequest)); - } -} From bbf6c1da110fce34a140e805589185bb7908e79b Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Tue, 5 May 2020 10:33:54 +0300 Subject: [PATCH 5/6] update libraries --- example/java/example/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/java/example/pom.xml b/example/java/example/pom.xml index 0cc6dff..010719e 100644 --- a/example/java/example/pom.xml +++ b/example/java/example/pom.xml @@ -24,12 +24,12 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9 + 2.11.0 com.squareup.okhttp3 okhttp - 3.4.2 + 4.6.0 com.squareup.okhttp3 From 114823a1a6542067c9187b119f53bcb1b08ba301 Mon Sep 17 00:00:00 2001 From: "Mikhail.Petrov" Date: Mon, 13 Jul 2020 01:22:09 +0300 Subject: [PATCH 6/6] change webSocket from 'com.squareup.okhttp3' to 'com.neovisionaries' --- example/java/example/pom.xml | 10 +- .../websocket/BitMaxApiWebSocketListener.java | 160 +++++++----------- .../messages/requests/WebSocketSubscribe.java | 30 ---- .../messages/responses/WebSocketOrder.java | 50 +++--- .../account/socket/AccountExample.java | 9 +- .../examples/account/socket/OrderExample.java | 13 +- .../examples/common/socket/PublicExample.java | 8 +- 7 files changed, 112 insertions(+), 168 deletions(-) diff --git a/example/java/example/pom.xml b/example/java/example/pom.xml index 010719e..bde9666 100644 --- a/example/java/example/pom.xml +++ b/example/java/example/pom.xml @@ -24,17 +24,17 @@ com.fasterxml.jackson.core jackson-databind - 2.11.0 + 2.11.1 com.squareup.okhttp3 okhttp - 4.6.0 + 4.8.0 - com.squareup.okhttp3 - okhttp-ws - 3.4.2 + com.neovisionaries + nv-websocket-client + 2.9 diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java b/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java index afd9ef7..f0da9a9 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/BitMaxApiWebSocketListener.java @@ -1,38 +1,28 @@ package io.bitmax.api.websocket; +import com.neovisionaries.ws.client.*; import io.bitmax.api.Mapper; import io.bitmax.api.websocket.client.BitMaxApiCallback; import io.bitmax.api.websocket.messages.responses.*; import io.bitmax.api.websocket.messages.requests.WebSocketSubscribe; -import okhttp3.*; -import okhttp3.ws.WebSocket; -import okhttp3.ws.WebSocketCall; -import okhttp3.ws.WebSocketListener; -import okio.Buffer; -import java.io.IOException; import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; -import static okhttp3.ws.WebSocket.TEXT; - /** * Represents a Listener of webSocket channels */ -public class BitMaxApiWebSocketListener implements WebSocketListener { +public class BitMaxApiWebSocketListener { /** * WebSocket executor service, execute webSocket tasks such as open/close channel and send message */ - private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private WebSocket webSocket; /** - * WebSocket executor service, execute webSocket tasks such as open/close channel and send message + * The timeout value in milliseconds for socket connection. */ - private WebSocket webSocket; + private static final int TIMEOUT = 5000; /** * patterns to determine type of message @@ -53,125 +43,99 @@ public class BitMaxApiWebSocketListener implements WebSocketListener { private BitMaxApiCallback barCallback; private BitMaxApiCallback orderCallback; - /** - * message for subscribe to channels - */ - private WebSocketSubscribe message; - /** * Initialize listener for authorized user */ - public BitMaxApiWebSocketListener(WebSocketSubscribe message, Map headersMap, String url) { - this.message = message; + public BitMaxApiWebSocketListener(WebSocketSubscribe message, Map headersMap, String url, int timeout) { + + try { + webSocket = new WebSocketFactory() + .setConnectionTimeout(timeout) + .createSocket(url) + .addListener(new WebSocketAdapter() { + public void onTextMessage(WebSocket websocket, String message) { + onMessage(message); + } + + public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, + WebSocketFrame clientCloseFrame, boolean closedByServer) { + System.out.println("Socket Disconnected!"); + } + }) + .addExtension(WebSocketExtension.PERMESSAGE_DEFLATE); - OkHttpClient client = new OkHttpClient.Builder() - .readTimeout(0, TimeUnit.MILLISECONDS) - .build(); + headersMap.forEach((key, val) -> webSocket.addHeader(key, val)); - Request request = new Request.Builder() - .url(url) - .headers(Headers.of(headersMap)) - .build(); + webSocket.connect(); - WebSocketCall.create(client, request).enqueue(this); + if (message != null) send(message); + + } catch (Exception e) { + e.printStackTrace(); + } } /** * Initialize listener for common messages */ public BitMaxApiWebSocketListener(WebSocketSubscribe message, String url) { - this.message = message; - OkHttpClient client = new OkHttpClient.Builder() - .readTimeout(0, TimeUnit.MILLISECONDS) - .build(); + try { + webSocket = new WebSocketFactory() + .setConnectionTimeout(TIMEOUT) + .createSocket(url) + .addListener(new WebSocketAdapter() { + public void onTextMessage(WebSocket websocket, String message) { + onMessage(message); + } - Request request = new Request.Builder() - .url(url) - .build(); + public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, + WebSocketFrame clientCloseFrame, boolean closedByServer) { + System.out.println("Socket Disconnected!"); + } + }) + .addExtension(WebSocketExtension.PERMESSAGE_DEFLATE); - WebSocketCall.create(client, request).enqueue(this); - } + webSocket.connect(); + if (message != null) send(message); - @Override - public void onOpen(final WebSocket webSocket, Response response) { - executor.execute(() -> { - try { - this.webSocket = webSocket; - webSocket.sendMessage(RequestBody.create(TEXT, Mapper.asString(message))); - } catch (IOException e) { - System.err.println("Unable to send messages: " + e.getMessage()); - } - }); + } catch (Exception e) { + e.printStackTrace(); + } } - public void send(Object message) { - executor.execute(() -> { - try { - webSocket.sendMessage(RequestBody.create(TEXT, Mapper.asString(message))); - } catch (IOException e) { - System.err.println("Unable to send messages: " + e.getMessage()); - } - }); + webSocket.sendText(Mapper.asString(message)); } + private void onMessage(String message) { - @Override - public void onMessage(ResponseBody message) throws IOException { - String text; - if (message.contentType() == TEXT) { - text = message.string(); - } else { - text = message.source().readByteString().hex(); - } - message.close(); - - if (pongPattern.matcher(text).find()) return; - else if (summaryPattern.matcher(text).find()) { + if (summaryPattern.matcher(message).find()) { if (summaryCallback != null) { - summaryCallback.onResponse(Mapper.asObject(text, WebSocketSummary.class)); - return; + summaryCallback.onResponse(Mapper.asObject(message, WebSocketSummary.class)); } - } else if (depthPattern.matcher(text).find()) { + } else if (depthPattern.matcher(message).find()) { if (depthCallback != null) { - depthCallback.onResponse(Mapper.asObject(text, WebSocketDepth.class)); - return; + depthCallback.onResponse(Mapper.asObject(message, WebSocketDepth.class)); } - } else if (marketTradesPattern.matcher(text).find()) { + } else if (marketTradesPattern.matcher(message).find()) { if (marketTradesCallback != null) { - marketTradesCallback.onResponse(Mapper.asObject(text, WebSocketMarketTrades.class)); - return; + marketTradesCallback.onResponse(Mapper.asObject(message, WebSocketMarketTrades.class)); } - } else if (barPattern.matcher(text).find()) { + } else if (barPattern.matcher(message).find()) { if (barCallback != null) { - barCallback.onResponse(Mapper.asObject(text, WebSocketBar.class)); - return; + barCallback.onResponse(Mapper.asObject(message, WebSocketBar.class)); } - } else if (orderPattern.matcher(text).find()) { + } else if (orderPattern.matcher(message).find()) { if (orderCallback != null) { - orderCallback.onResponse(Mapper.asObject(text, WebSocketOrder.class)); - return; + orderCallback.onResponse(Mapper.asObject(message, WebSocketOrder.class)); } } - System.out.println("Warn! Not found callback for message: " + text); - } - - @Override - public void onPong(Buffer payload) { - } - - @Override - public void onClose(int code, String reason) { - System.out.println("CLOSE: " + code + " " + reason); - executor.shutdown(); } - @Override - public void onFailure(IOException e, Response response) { - e.printStackTrace(); - executor.shutdown(); + public void close() { + webSocket.disconnect(); } public void setSummaryCallback(BitMaxApiCallback summaryCallback) { diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java index 846e794..b1d0051 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/requests/WebSocketSubscribe.java @@ -19,18 +19,6 @@ public class WebSocketSubscribe { @JsonProperty("marketDepthLevel") private int marketDepthLevel; - /** - * max number of recent trades to be included in the first market trades message - */ - @JsonProperty("recentTradeMaxCount") - private int recentTradeMaxCount; - - /** - * optional, set to true if you don't want to receive summary messages, default false - */ - @JsonProperty("skipSummary") - private boolean skipSummary = false; - /** * optional, set to true if you don't want to receive bar messages, default false */ @@ -53,22 +41,6 @@ public void setMarketDepthLevel(int marketDepthLevel) { this.marketDepthLevel = marketDepthLevel; } - public int getRecentTradeMaxCount() { - return recentTradeMaxCount; - } - - public void setRecentTradeMaxCount(int recentTradeMaxCount) { - this.recentTradeMaxCount = recentTradeMaxCount; - } - - public boolean isSkipSummary() { - return skipSummary; - } - - public void setSkipSummary(boolean skipSummary) { - this.skipSummary = skipSummary; - } - public boolean isSkipBars() { return skipBars; } @@ -81,8 +53,6 @@ public void setSkipBars(boolean skipBars) { public String toString() { return "Subscribe:\n\tmessageType: " + messageType + "\n\tmarketDepthLevel: " + marketDepthLevel + - "\n\trecentTradeMaxCount: " + recentTradeMaxCount + - "\n\tskipSummary: " + skipSummary + "\n\tskipBars: " + skipBars; } } diff --git a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java index 40be9af..d81ea9e 100644 --- a/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java +++ b/example/java/example/src/main/java/io/bitmax/api/websocket/messages/responses/WebSocketOrder.java @@ -310,30 +310,30 @@ public void setOrderType(String orderType) { @Override public String toString() { - return "\n\tOrder:\n\t\tcoid: " + coid + - "\n\t\torigCoid: " + origCoid + - "\n\t\tsymbol: " + symbol + - "\n\t\texecId: " + execId + - "\n\t\torderType: " + orderType + - "\n\t\tlastQuantity: " + lastQuantity + - "\n\t\tbitmaxComission: " + bitmaxComission + - "\n\t\tbitmaxBalance: " + bitmaxBalance + - "\n\t\ttimestamp: " + timestamp + - "\n\t\tlimitPrice: " + limitPrice + - "\n\t\tstopPrice: " + stopPrice + - "\n\t\torderQuantity: " + orderQuantity + - "\n\t\tfilledQuantity: " + filledQuantity + - "\n\t\taveragePrice: " + averagePrice + - "\n\t\tbaseAssetTotalBalance: " + baseAssetTotalBalance + - "\n\t\tbaseAssetPendingBalance: " + baseAssetPendingBalance + - "\n\t\tquoteAssetTotalBalance: " + quoteAssetTotalBalance + - "\n\t\tquoteAssetPendingBalance: " + quoteAssetPendingBalance + - "\n\t\tfee: " + fee + - "\n\t\tfeeAsset: " + feeAsset + - "\n\t\tside: " + side + - "\n\t\torderStatus: " + orderStatus + - "\n\t\tcategory: " + category + - "\n\t\terrorCode: " + errorCode + - "\n\t\tinstruction: " + instruction; + return "\nOrder:\n\tcoid: " + coid + + "\n\torigCoid: " + origCoid + + "\n\tsymbol: " + symbol + + "\n\texecId: " + execId + + "\n\torderType: " + orderType + + "\n\tlastQuantity: " + lastQuantity + + "\n\tbitmaxComission: " + bitmaxComission + + "\n\tbitmaxBalance: " + bitmaxBalance + + "\n\ttimestamp: " + timestamp + + "\n\tlimitPrice: " + limitPrice + + "\n\tstopPrice: " + stopPrice + + "\n\torderQuantity: " + orderQuantity + + "\n\tfilledQuantity: " + filledQuantity + + "\n\taveragePrice: " + averagePrice + + "\n\tbaseAssetTotalBalance: " + baseAssetTotalBalance + + "\n\tbaseAssetPendingBalance: " + baseAssetPendingBalance + + "\n\tquoteAssetTotalBalance: " + quoteAssetTotalBalance + + "\n\tquoteAssetPendingBalance: " + quoteAssetPendingBalance + + "\n\tfee: " + fee + + "\n\tfeeAsset: " + feeAsset + + "\n\tside: " + side + + "\n\torderStatus: " + orderStatus + + "\n\tcategory: " + category + + "\n\terrorCode: " + errorCode + + "\n\tinstruction: " + instruction; } } diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java index 3bdc3c2..a759453 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/AccountExample.java @@ -21,13 +21,12 @@ public static void main(String[] args) { WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); - subscribeMessage.setRecentTradeMaxCount(200); try { Authorization authClient = new Authorization(apiKey, secret); Map headers = authClient.getHeaderMap("api/stream", System.currentTimeMillis()); - BitMaxApiWebSocketListener listener = new BitMaxApiWebSocketListener(subscribeMessage, headers, url); + BitMaxApiWebSocketListener listener = new BitMaxApiWebSocketListener(subscribeMessage, headers, url, 5000); listener.setSummaryCallback(response -> System.out.println("\n" + response)); listener.setDepthCallback(response -> System.out.println("\n" + response)); @@ -35,8 +34,12 @@ public static void main(String[] args) { listener.setMarketTradesCallback(response -> System.out.println("\n" + response)); listener.setOrderCallback(response -> System.out.println("\n" + response)); + Thread.sleep(10000); + + listener.close(); + } catch (Exception e) { - System.out.println(e.toString()); + e.printStackTrace(); } } } diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java index ef86a25..85263e5 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/account/socket/OrderExample.java @@ -23,14 +23,12 @@ public static void main(String[] args) { WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); - subscribeMessage.setRecentTradeMaxCount(200); try { Authorization authClient = new Authorization(apiKey, secret); Map headers = authClient.getHeaderMap("api/stream", System.currentTimeMillis()); - BitMaxApiWebSocketListener listener = new BitMaxApiWebSocketListener(subscribeMessage, headers, url); - + BitMaxApiWebSocketListener listener = new BitMaxApiWebSocketListener(null, headers, url, 10000); listener.setOrderCallback(response -> System.out.println("\n" + response)); // waiting before webSocket setUp @@ -45,7 +43,7 @@ public static void main(String[] args) { placeOrder.setTime(time1); placeOrder.setSymbol("EOS/ETH"); placeOrder.setCoid(placeCoid); - placeOrder.setOrderPrice("0.02"); + placeOrder.setOrderPrice("0.008"); placeOrder.setOrderQty("5.0"); placeOrder.setOrderType("limit"); placeOrder.setSide("buy"); @@ -68,8 +66,13 @@ public static void main(String[] args) { listener.send(cancelOrder); + // waiting before order will be cancelled + Thread.sleep(1500); + + listener.close(); + } catch (Exception e) { - System.out.println(e.toString()); + e.printStackTrace(); } } } diff --git a/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java b/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java index d747cd3..0bb7773 100644 --- a/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java +++ b/example/java/example/src/test/java/io/bitmax/api/examples/common/socket/PublicExample.java @@ -11,7 +11,6 @@ public static void main(String[] args) { WebSocketSubscribe subscribeMessage = new WebSocketSubscribe(); subscribeMessage.setMessageType("subscribe"); subscribeMessage.setMarketDepthLevel(200); - subscribeMessage.setRecentTradeMaxCount(200); try { BitMaxApiWebSocketListener listener = new BitMaxApiWebSocketListener(subscribeMessage, url); @@ -20,8 +19,13 @@ public static void main(String[] args) { listener.setBarCallback(response -> System.out.println("\n" + response)); listener.setMarketTradesCallback(response -> System.out.println("\n" + response)); listener.setDepthCallback(response -> System.out.println("\n" + response)); + + Thread.sleep(10000); + + listener.close(); + } catch (Exception e) { - System.out.println(e.toString()); + e.printStackTrace(); } } }