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 shortWorkers = 0;
List<WorkerStatsData> workers;
InstanceGlobalStatsData instanceGlobalStats;
CompletableFuture<Double> traderTimeFuture = CompletableFuture.supplyAsync(() -> {
try {
@ -308,10 +309,20 @@ public class InstanceInterface {
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();
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<WorkerStatsData> 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<String> 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<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.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 {

View File

@ -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);
}