diff --git a/app/src/main/java/com/example/dcav2gui/InstanceInterface.java b/app/src/main/java/com/example/dcav2gui/InstanceInterface.java index a549749..dc78986 100644 --- a/app/src/main/java/com/example/dcav2gui/InstanceInterface.java +++ b/app/src/main/java/com/example/dcav2gui/InstanceInterface.java @@ -286,6 +286,7 @@ public class InstanceInterface { int longWorkers = 0; int shortWorkers = 0; List workers; + InstanceGlobalStatsData instanceGlobalStats; CompletableFuture traderTimeFuture = CompletableFuture.supplyAsync(() -> { try { @@ -308,10 +309,20 @@ public class InstanceInterface { throw new RuntimeException(e); } }); - CompletableFuture allFutures = CompletableFuture.allOf(traderTimeFuture, fundsAvailableFuture, workerStatsFuture); + CompletableFuture instanceGlobalStatsFuture = CompletableFuture.supplyAsync(() -> { + try { + return getInstanceGlobalStatus(exchange, true); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + CompletableFuture allFutures = CompletableFuture.allOf(traderTimeFuture, fundsAvailableFuture, workerStatsFuture, instanceGlobalStatsFuture); lastSeen = traderTimeFuture.join(); fundsAvailable = fundsAvailableFuture.join(); workers = workerStatsFuture.join(); + instanceGlobalStats = instanceGlobalStatsFuture.join(); + //Funds needed if (workers != null) { @@ -342,7 +353,7 @@ public class InstanceInterface { } } - return new ExchangeStatsData(lastSeen,fundsAvailable,fundsNeeded,onlineWorkers,longWorkers,shortWorkers); + return new ExchangeStatsData(lastSeen,fundsAvailable,fundsNeeded,onlineWorkers,longWorkers,shortWorkers,instanceGlobalStats); } @@ -498,20 +509,36 @@ public class InstanceInterface { } - private static InstanceGlobalStatsData getInstanceGlobalStatus(String jsonResponse) { - try { - JsonElement jsonElement = JsonParser.parseString(jsonResponse); + private static InstanceGlobalStatsData getInstanceGlobalStatus(String exchange, boolean retry) throws IOException { + List valueToReturn = new ArrayList<>(); + + Request globalStatsRequest = new Request.Builder() + .url(API_BASE_URL + "/" + exchange + "/global_status") + .header("X-API-KEY", API_KEY) + .build(); + + + try (Response globalStatsResponse = httpClient.newCall(globalStatsRequest).execute()) { + if (!globalStatsResponse.isSuccessful()) { + if (globalStatsResponse.code() == 503 && retry) { + return getInstanceGlobalStatus(exchange, false); + } + throw new IOException("Unexpected code " + globalStatsResponse.code()); + } + String globalStatsResponseBody = globalStatsResponse.body().string(); + JsonElement jsonElement = JsonParser.parseString(globalStatsResponseBody); if (!jsonElement.isJsonObject()) { System.err.println("The parsed JSON response is not a JsonObject."); return null; } - if (!jsonElement.getAsJsonObject().has("Error")) { - System.err.println("There is an Error field in the JSON response."); + if (jsonElement.getAsJsonObject().has("Error")) { + System.err.println("There is an Error field in the JSON response." + jsonElement.getAsJsonObject().get("Error").getAsString()); return null; } JsonObject jsonObject = jsonElement.getAsJsonObject(); + // Extracting online_workers and paused_traders from the response JsonArray onlineWorkersJsonArray = jsonObject.get("online_workers").getAsJsonArray(); List onlineWorkers = new ArrayList<>(); @@ -533,31 +560,41 @@ public class InstanceInterface { } //Extract BrokerConfigData from the JSON response - BrokerConfigData brokerConfigData = new BrokerConfigData( - jsonObject.get("broker_name").getAsString(), - jsonObject.get("is_sandbox").getAsBoolean(), - jsonObject.get("simulate_market_orders").getAsBoolean(), - pairsInConfig, - jsonObject.get("laptime").getAsDouble(), - jsonObject.get("cooldown_multiplier").getAsDouble(), - jsonObject.get("wait_before_new_safety_order").getAsDouble(), - jsonObject.get("telegram").getAsBoolean(), - jsonObject.get("bot_token").getAsString(), - jsonObject.get("chat_id").getAsString(), - jsonObject.get("attempt_to_restart").getAsBoolean(), - jsonObject.get("default_order_size").getAsDouble(), - jsonObject.get("unifiedOrderQuery").getAsBoolean()); + BrokerConfigData brokerConfigData; + try { + String exchangeName = generalDataObject.has("exchange") && generalDataObject.get("exchange").isJsonPrimitive() ? generalDataObject.get("exchange").getAsString() : null; + boolean isSandbox = generalDataObject.has("is_sandbox") && generalDataObject.get("is_sandbox").isJsonPrimitive() && generalDataObject.get("is_sandbox").getAsBoolean(); + boolean simulateMarketOrders = generalDataObject.has("simulate_market_orders") && generalDataObject.get("simulate_market_orders").isJsonPrimitive() && generalDataObject.get("simulate_market_orders").getAsBoolean(); + //pairsInConfig + double lap_time = generalDataObject.has("lap_time") && generalDataObject.get("lap_time").isJsonPrimitive() ? generalDataObject.get("lap_time").getAsDouble() : 2.0; + double cooldown_multiplier = generalDataObject.has("cooldown_multiplier") && generalDataObject.get("cooldown_multiplier").isJsonPrimitive() ? generalDataObject.get("cooldown_multiplier").getAsDouble() : 1.0; + double wait_before_new_safety_order = generalDataObject.has("wait_before_new_safety_order") && generalDataObject.get("wait_before_new_safety_order").isJsonPrimitive() ? generalDataObject.get("wait_before_new_safety_order").getAsDouble() : 0.0; + boolean telegram = generalDataObject.has("telegram") && generalDataObject.get("telegram").isJsonPrimitive() && generalDataObject.get("telegram").getAsBoolean(); + boolean attempt_to_restart = !generalDataObject.has("attempt_to_restart") || !generalDataObject.get("attempt_to_restart").isJsonPrimitive() || generalDataObject.get("attempt_to_restart").getAsBoolean(); + double default_order_size = generalDataObject.has("default_order_size") && generalDataObject.get("default_order_size").isJsonPrimitive() ? generalDataObject.get("default_order_size").getAsDouble() : 12.0; + boolean unifiedOrderQuery = !generalDataObject.has("unifiedOrderQuery") || !generalDataObject.get("unifiedOrderQuery").isJsonPrimitive() || generalDataObject.get("unifiedOrderQuery").getAsBoolean(); + brokerConfigData = new BrokerConfigData(exchangeName, isSandbox, simulateMarketOrders, pairsInConfig, lap_time, cooldown_multiplier, wait_before_new_safety_order, telegram, attempt_to_restart, default_order_size, unifiedOrderQuery); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + InstanceGlobalStatsData returnValue; + try { + returnValue = new InstanceGlobalStatsData( + jsonObject.get("name").getAsString(), + jsonObject.get("instance_uptime").getAsDouble(), + onlineWorkers, + pausedTraders, + jsonObject.get("version").getAsString(), + jsonObject.get("ccxt_version").getAsString(), + brokerConfigData); + } catch (Exception e) { + e.printStackTrace(); + return null; + } - return new InstanceGlobalStatsData( - jsonObject.get("name").getAsString(), - jsonObject.get("uptime").getAsDouble(), - onlineWorkers, - pausedTraders, - jsonObject.get("version").getAsString(), - jsonObject.get("ccxt_version").getAsString(), - brokerConfigData); - + return returnValue; } catch (JsonSyntaxException e) { System.err.println("The JSON response is not valid."); return null; @@ -630,13 +667,11 @@ public class InstanceInterface { private final double cooldownMultiplier; private final double waitBeforeNewSafetyOrder; private final Boolean sendTelegram; - private final String telegramBotToken; - private final String telegramChatId; private final Boolean attemptToRestart; private final double defaultOrderSize; private final Boolean unifiedOrderQuery; - public BrokerConfigData(String brokerName, Boolean isSandbox, Boolean simulateMarketOrders, List pairs, double laptime, double cooldownMultiplier, double waitBeforeNewSafetyOrder, Boolean sendTelegram, String telegramBotToken, String telegramChatId, Boolean attemptToRestart, double defaultOrderSize, Boolean unifiedOrderQuery) { + public BrokerConfigData(String brokerName, Boolean isSandbox, Boolean simulateMarketOrders, List pairs, double laptime, double cooldownMultiplier, double waitBeforeNewSafetyOrder, Boolean sendTelegram, Boolean attemptToRestart, double defaultOrderSize, Boolean unifiedOrderQuery) { this.brokerName = brokerName; this.isSandbox = isSandbox; this.simulateMarketOrders = simulateMarketOrders; @@ -645,8 +680,6 @@ public class InstanceInterface { this.cooldownMultiplier = cooldownMultiplier; this.waitBeforeNewSafetyOrder = waitBeforeNewSafetyOrder; this.sendTelegram = sendTelegram; - this.telegramBotToken = telegramBotToken; - this.telegramChatId = telegramChatId; this.attemptToRestart = attemptToRestart; this.defaultOrderSize = defaultOrderSize; this.unifiedOrderQuery = unifiedOrderQuery; @@ -660,8 +693,6 @@ public class InstanceInterface { public double getCooldownMultiplier() { return cooldownMultiplier; } public double getWaitBeforeNewSafetyOrder() { return waitBeforeNewSafetyOrder; } public Boolean getSendTelegram() { return sendTelegram; } - public String getTelegramBotToken() { return telegramBotToken; } - public String getTelegramChatId() { return telegramChatId; } public Boolean getAttemptToRestart() { return attemptToRestart; } public double getDefaultOrderSize() { return defaultOrderSize; } public Boolean getUnifiedOrderQuery() { return unifiedOrderQuery; } @@ -689,14 +720,16 @@ public class InstanceInterface { private final int onlineWorkers; private final int longWorkers; private final int shortWorkers; + private final InstanceGlobalStatsData globalStats; - public ExchangeStatsData(double lastSeen, double fundsAvailable, double fundsNeeded, int onlineWorkers, int longWorkers, int shortWorkers) { + public ExchangeStatsData(double lastSeen, double fundsAvailable, double fundsNeeded, int onlineWorkers, int longWorkers, int shortWorkers, InstanceGlobalStatsData globalStats) { this.lastSeen = lastSeen; this.fundsAvailable = fundsAvailable; this.fundsNeeded = fundsNeeded; this.onlineWorkers = onlineWorkers; this.longWorkers = longWorkers; this.shortWorkers = shortWorkers; + this.globalStats = globalStats; } public double getLastSeen() { return lastSeen; } @@ -705,6 +738,7 @@ public class InstanceInterface { public int getOnlineWorkers() { return onlineWorkers; } public int getLongWorkers() { return longWorkers; } public int getShortWorkers() { return shortWorkers; } + public InstanceGlobalStatsData getGlobalStats() { return globalStats; } } public static class WorkerStatsData { diff --git a/app/src/main/java/com/example/dcav2gui/ui/home/HomeFragment.java b/app/src/main/java/com/example/dcav2gui/ui/home/HomeFragment.java index ac542e4..f7b38c9 100644 --- a/app/src/main/java/com/example/dcav2gui/ui/home/HomeFragment.java +++ b/app/src/main/java/com/example/dcav2gui/ui/home/HomeFragment.java @@ -649,21 +649,33 @@ public class HomeFragment extends Fragment { // Exchange stats if (binanceData != null) { exchange1WorkersOnline.setText(String.valueOf(binanceData.getOnlineWorkers())); + if (binanceData.getGlobalStats() != null && !binanceData.getGlobalStats().getPausedTraders().isEmpty()) { + exchange1WorkersOnline.setTextColor(Color.YELLOW); + } String longShortWorkers = String.valueOf(binanceData.getLongWorkers()) + "/" + String.valueOf(binanceData.getShortWorkers()); exchange1WorkersLongShort.setText(longShortWorkers); } if (gateioData != null) { exchange2WorkersOnline.setText(String.valueOf(gateioData.getOnlineWorkers())); + if (gateioData.getGlobalStats() != null && !gateioData.getGlobalStats().getPausedTraders().isEmpty()) { + exchange2WorkersOnline.setTextColor(Color.YELLOW); + } String longShortWorkers = String.valueOf(gateioData.getLongWorkers()) + "/" + String.valueOf(gateioData.getShortWorkers()); exchange2WorkersLongShort.setText(longShortWorkers); } if (kucoinData != null) { exchange3WorkersOnline.setText(String.valueOf(kucoinData.getOnlineWorkers())); + if (kucoinData.getGlobalStats() != null && !kucoinData.getGlobalStats().getPausedTraders().isEmpty()) { + exchange3WorkersOnline.setTextColor(Color.YELLOW); + } String longShortWorkers = String.valueOf(kucoinData.getLongWorkers()) + "/" + String.valueOf(kucoinData.getShortWorkers()); exchange3WorkersLongShort.setText(longShortWorkers); } if (okexData != null) { exchange4WorkersOnline.setText(String.valueOf(okexData.getOnlineWorkers())); + if (okexData.getGlobalStats() != null && !okexData.getGlobalStats().getPausedTraders().isEmpty()) { + exchange4WorkersOnline.setTextColor(Color.YELLOW); + } String longShortWorkers = String.valueOf(okexData.getLongWorkers()) + "/" + String.valueOf(okexData.getShortWorkers()); exchange4WorkersLongShort.setText(longShortWorkers); }