The worker count color is yellow if any worker is paused

This commit is contained in:
Nicolás Sánchez 2024-12-15 14:11:02 -03:00
parent a82ebd54a7
commit f0d7759958
2 changed files with 84 additions and 38 deletions

View File

@ -286,6 +286,7 @@ public class InstanceInterface {
int longWorkers = 0; int longWorkers = 0;
int shortWorkers = 0; int shortWorkers = 0;
List<WorkerStatsData> workers; List<WorkerStatsData> workers;
InstanceGlobalStatsData instanceGlobalStats;
CompletableFuture<Double> traderTimeFuture = CompletableFuture.supplyAsync(() -> { CompletableFuture<Double> traderTimeFuture = CompletableFuture.supplyAsync(() -> {
try { try {
@ -308,10 +309,20 @@ public class InstanceInterface {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}); });
CompletableFuture<Void> allFutures = CompletableFuture.allOf(traderTimeFuture, fundsAvailableFuture, workerStatsFuture); CompletableFuture<InstanceGlobalStatsData> instanceGlobalStatsFuture = CompletableFuture.supplyAsync(() -> {
try {
return getInstanceGlobalStatus(exchange, true);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
CompletableFuture<Void> allFutures = CompletableFuture.allOf(traderTimeFuture, fundsAvailableFuture, workerStatsFuture, instanceGlobalStatsFuture);
lastSeen = traderTimeFuture.join(); lastSeen = traderTimeFuture.join();
fundsAvailable = fundsAvailableFuture.join(); fundsAvailable = fundsAvailableFuture.join();
workers = workerStatsFuture.join(); workers = workerStatsFuture.join();
instanceGlobalStats = instanceGlobalStatsFuture.join();
//Funds needed //Funds needed
if (workers != null) { 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) { private static InstanceGlobalStatsData getInstanceGlobalStatus(String exchange, boolean retry) throws IOException {
try { List<WorkerStatsData> valueToReturn = new ArrayList<>();
JsonElement jsonElement = JsonParser.parseString(jsonResponse);
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()) { if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject."); System.err.println("The parsed JSON response is not a JsonObject.");
return null; return null;
} }
if (!jsonElement.getAsJsonObject().has("Error")) { if (jsonElement.getAsJsonObject().has("Error")) {
System.err.println("There is an Error field in the JSON response."); System.err.println("There is an Error field in the JSON response." + jsonElement.getAsJsonObject().get("Error").getAsString());
return null; return null;
} }
JsonObject jsonObject = jsonElement.getAsJsonObject(); JsonObject jsonObject = jsonElement.getAsJsonObject();
// Extracting online_workers and paused_traders from the response // Extracting online_workers and paused_traders from the response
JsonArray onlineWorkersJsonArray = jsonObject.get("online_workers").getAsJsonArray(); JsonArray onlineWorkersJsonArray = jsonObject.get("online_workers").getAsJsonArray();
List<String> onlineWorkers = new ArrayList<>(); List<String> onlineWorkers = new ArrayList<>();
@ -533,31 +560,41 @@ public class InstanceInterface {
} }
//Extract BrokerConfigData from the JSON response //Extract BrokerConfigData from the JSON response
BrokerConfigData brokerConfigData = new BrokerConfigData( BrokerConfigData brokerConfigData;
jsonObject.get("broker_name").getAsString(), try {
jsonObject.get("is_sandbox").getAsBoolean(), String exchangeName = generalDataObject.has("exchange") && generalDataObject.get("exchange").isJsonPrimitive() ? generalDataObject.get("exchange").getAsString() : null;
jsonObject.get("simulate_market_orders").getAsBoolean(), boolean isSandbox = generalDataObject.has("is_sandbox") && generalDataObject.get("is_sandbox").isJsonPrimitive() && generalDataObject.get("is_sandbox").getAsBoolean();
pairsInConfig, boolean simulateMarketOrders = generalDataObject.has("simulate_market_orders") && generalDataObject.get("simulate_market_orders").isJsonPrimitive() && generalDataObject.get("simulate_market_orders").getAsBoolean();
jsonObject.get("laptime").getAsDouble(), //pairsInConfig
jsonObject.get("cooldown_multiplier").getAsDouble(), double lap_time = generalDataObject.has("lap_time") && generalDataObject.get("lap_time").isJsonPrimitive() ? generalDataObject.get("lap_time").getAsDouble() : 2.0;
jsonObject.get("wait_before_new_safety_order").getAsDouble(), double cooldown_multiplier = generalDataObject.has("cooldown_multiplier") && generalDataObject.get("cooldown_multiplier").isJsonPrimitive() ? generalDataObject.get("cooldown_multiplier").getAsDouble() : 1.0;
jsonObject.get("telegram").getAsBoolean(), 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;
jsonObject.get("bot_token").getAsString(), boolean telegram = generalDataObject.has("telegram") && generalDataObject.get("telegram").isJsonPrimitive() && generalDataObject.get("telegram").getAsBoolean();
jsonObject.get("chat_id").getAsString(), boolean attempt_to_restart = !generalDataObject.has("attempt_to_restart") || !generalDataObject.get("attempt_to_restart").isJsonPrimitive() || generalDataObject.get("attempt_to_restart").getAsBoolean();
jsonObject.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;
jsonObject.get("default_order_size").getAsDouble(), boolean unifiedOrderQuery = !generalDataObject.has("unifiedOrderQuery") || !generalDataObject.get("unifiedOrderQuery").isJsonPrimitive() || generalDataObject.get("unifiedOrderQuery").getAsBoolean();
jsonObject.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;
return new InstanceGlobalStatsData( try {
returnValue = new InstanceGlobalStatsData(
jsonObject.get("name").getAsString(), jsonObject.get("name").getAsString(),
jsonObject.get("uptime").getAsDouble(), jsonObject.get("instance_uptime").getAsDouble(),
onlineWorkers, onlineWorkers,
pausedTraders, pausedTraders,
jsonObject.get("version").getAsString(), jsonObject.get("version").getAsString(),
jsonObject.get("ccxt_version").getAsString(), jsonObject.get("ccxt_version").getAsString(),
brokerConfigData); brokerConfigData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return returnValue;
} catch (JsonSyntaxException e) { } catch (JsonSyntaxException e) {
System.err.println("The JSON response is not valid."); System.err.println("The JSON response is not valid.");
return null; return null;
@ -630,13 +667,11 @@ public class InstanceInterface {
private final double cooldownMultiplier; private final double cooldownMultiplier;
private final double waitBeforeNewSafetyOrder; private final double waitBeforeNewSafetyOrder;
private final Boolean sendTelegram; private final Boolean sendTelegram;
private final String telegramBotToken;
private final String telegramChatId;
private final Boolean attemptToRestart; private final Boolean attemptToRestart;
private final double defaultOrderSize; private final double defaultOrderSize;
private final Boolean unifiedOrderQuery; private final Boolean unifiedOrderQuery;
public BrokerConfigData(String brokerName, Boolean isSandbox, Boolean simulateMarketOrders, List<String> 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<String> pairs, double laptime, double cooldownMultiplier, double waitBeforeNewSafetyOrder, Boolean sendTelegram, Boolean attemptToRestart, double defaultOrderSize, Boolean unifiedOrderQuery) {
this.brokerName = brokerName; this.brokerName = brokerName;
this.isSandbox = isSandbox; this.isSandbox = isSandbox;
this.simulateMarketOrders = simulateMarketOrders; this.simulateMarketOrders = simulateMarketOrders;
@ -645,8 +680,6 @@ public class InstanceInterface {
this.cooldownMultiplier = cooldownMultiplier; this.cooldownMultiplier = cooldownMultiplier;
this.waitBeforeNewSafetyOrder = waitBeforeNewSafetyOrder; this.waitBeforeNewSafetyOrder = waitBeforeNewSafetyOrder;
this.sendTelegram = sendTelegram; this.sendTelegram = sendTelegram;
this.telegramBotToken = telegramBotToken;
this.telegramChatId = telegramChatId;
this.attemptToRestart = attemptToRestart; this.attemptToRestart = attemptToRestart;
this.defaultOrderSize = defaultOrderSize; this.defaultOrderSize = defaultOrderSize;
this.unifiedOrderQuery = unifiedOrderQuery; this.unifiedOrderQuery = unifiedOrderQuery;
@ -660,8 +693,6 @@ public class InstanceInterface {
public double getCooldownMultiplier() { return cooldownMultiplier; } public double getCooldownMultiplier() { return cooldownMultiplier; }
public double getWaitBeforeNewSafetyOrder() { return waitBeforeNewSafetyOrder; } public double getWaitBeforeNewSafetyOrder() { return waitBeforeNewSafetyOrder; }
public Boolean getSendTelegram() { return sendTelegram; } public Boolean getSendTelegram() { return sendTelegram; }
public String getTelegramBotToken() { return telegramBotToken; }
public String getTelegramChatId() { return telegramChatId; }
public Boolean getAttemptToRestart() { return attemptToRestart; } public Boolean getAttemptToRestart() { return attemptToRestart; }
public double getDefaultOrderSize() { return defaultOrderSize; } public double getDefaultOrderSize() { return defaultOrderSize; }
public Boolean getUnifiedOrderQuery() { return unifiedOrderQuery; } public Boolean getUnifiedOrderQuery() { return unifiedOrderQuery; }
@ -689,14 +720,16 @@ public class InstanceInterface {
private final int onlineWorkers; private final int onlineWorkers;
private final int longWorkers; private final int longWorkers;
private final int shortWorkers; 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.lastSeen = lastSeen;
this.fundsAvailable = fundsAvailable; this.fundsAvailable = fundsAvailable;
this.fundsNeeded = fundsNeeded; this.fundsNeeded = fundsNeeded;
this.onlineWorkers = onlineWorkers; this.onlineWorkers = onlineWorkers;
this.longWorkers = longWorkers; this.longWorkers = longWorkers;
this.shortWorkers = shortWorkers; this.shortWorkers = shortWorkers;
this.globalStats = globalStats;
} }
public double getLastSeen() { return lastSeen; } public double getLastSeen() { return lastSeen; }
@ -705,6 +738,7 @@ public class InstanceInterface {
public int getOnlineWorkers() { return onlineWorkers; } public int getOnlineWorkers() { return onlineWorkers; }
public int getLongWorkers() { return longWorkers; } public int getLongWorkers() { return longWorkers; }
public int getShortWorkers() { return shortWorkers; } public int getShortWorkers() { return shortWorkers; }
public InstanceGlobalStatsData getGlobalStats() { return globalStats; }
} }
public static class WorkerStatsData { public static class WorkerStatsData {

View File

@ -649,21 +649,33 @@ public class HomeFragment extends Fragment {
// Exchange stats // Exchange stats
if (binanceData != null) { if (binanceData != null) {
exchange1WorkersOnline.setText(String.valueOf(binanceData.getOnlineWorkers())); 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()); String longShortWorkers = String.valueOf(binanceData.getLongWorkers()) + "/" + String.valueOf(binanceData.getShortWorkers());
exchange1WorkersLongShort.setText(longShortWorkers); exchange1WorkersLongShort.setText(longShortWorkers);
} }
if (gateioData != null) { if (gateioData != null) {
exchange2WorkersOnline.setText(String.valueOf(gateioData.getOnlineWorkers())); 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()); String longShortWorkers = String.valueOf(gateioData.getLongWorkers()) + "/" + String.valueOf(gateioData.getShortWorkers());
exchange2WorkersLongShort.setText(longShortWorkers); exchange2WorkersLongShort.setText(longShortWorkers);
} }
if (kucoinData != null) { if (kucoinData != null) {
exchange3WorkersOnline.setText(String.valueOf(kucoinData.getOnlineWorkers())); 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()); String longShortWorkers = String.valueOf(kucoinData.getLongWorkers()) + "/" + String.valueOf(kucoinData.getShortWorkers());
exchange3WorkersLongShort.setText(longShortWorkers); exchange3WorkersLongShort.setText(longShortWorkers);
} }
if (okexData != null) { if (okexData != null) {
exchange4WorkersOnline.setText(String.valueOf(okexData.getOnlineWorkers())); 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()); String longShortWorkers = String.valueOf(okexData.getLongWorkers()) + "/" + String.valueOf(okexData.getShortWorkers());
exchange4WorkersLongShort.setText(longShortWorkers); exchange4WorkersLongShort.setText(longShortWorkers);
} }