The worker count color is yellow if any worker is paused
This commit is contained in:
parent
a82ebd54a7
commit
f0d7759958
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue