diff --git a/app/src/main/java/com/example/dcav2gui/InstanceInterface.java b/app/src/main/java/com/example/dcav2gui/InstanceInterface.java index 2d02e65..f8803dc 100644 --- a/app/src/main/java/com/example/dcav2gui/InstanceInterface.java +++ b/app/src/main/java/com/example/dcav2gui/InstanceInterface.java @@ -6,27 +6,30 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; + public class InstanceInterface { private static final String API_BASE_URL = globalSettings.apiUrl; private static final String API_KEY = globalSettings.apiKey; private static final OkHttpClient httpClient = new OkHttpClient(); public static ProfitStatsData getProfitStatsData() throws IOException { - // Construct the API request URL for stock quote - Request stockRequest = new Request.Builder() + Request profitRequest = new Request.Builder() .url(API_BASE_URL + "/statistics_server/combined_totals") .header("X-API-KEY", API_KEY) .build(); - try (Response statsResponse = httpClient.newCall(stockRequest).execute()) { + try (Response statsResponse = httpClient.newCall(profitRequest).execute()) { if (!statsResponse.isSuccessful()) { throw new IOException("Unexpected code " + statsResponse); } @@ -43,9 +46,55 @@ public class InstanceInterface { } } + public static double getTraderTime(String exchange) throws IOException { + //Uptime request + Request uptimeRequest = new Request.Builder() + .url(API_BASE_URL + "/" + exchange + "/trader_time") + .header("X-API-KEY", API_KEY) + .build(); + + try (Response statsResponse = httpClient.newCall(uptimeRequest).execute()) { + if (!statsResponse.isSuccessful()) { + throw new IOException("Unexpected code " + statsResponse); + } + String stockResponseBody = statsResponse.body().string(); + + return getUptime(stockResponseBody); + } + } + + + + + + + + + + + public static ExchangeStatsData getExchangeStatsData(String exchange) throws IOException { + //This needs to do A LOT of work + + + + //All workers stats request + Request allWorkersStatsRequest = new Request.Builder() + .url(API_BASE_URL + "/" + exchange + "/get_all_worker_status") + .header("X-API-KEY", API_KEY) + .build(); + + //Instance global stats + Request instanceGlobalStatsRequest = new Request.Builder() + .url(API_BASE_URL + "/" + exchange + "/global_stats") + .header("X-API-KEY", API_KEY) + .build(); + + + return null; + } + private static double getTodaysProfit(String jsonResponse) { try { - // Parse the JSON response JsonElement jsonElement = JsonParser.parseString(jsonResponse); if (!jsonElement.isJsonObject()) { System.err.println("The parsed JSON response is not a JsonObject."); @@ -67,7 +116,6 @@ public class InstanceInterface { private static double getThisMonthsProfit(String jsonResponse) { try { - // Parse the JSON response JsonElement jsonElement = JsonParser.parseString(jsonResponse); if (!jsonElement.isJsonObject()) { System.err.println("The parsed JSON response is not a JsonObject."); @@ -87,8 +135,151 @@ public class InstanceInterface { } } + private static double getUptime(String jsonResponse) { + try { + JsonElement jsonElement = JsonParser.parseString(jsonResponse); + if (!jsonElement.isJsonObject()) { + System.err.println("The parsed JSON response is not a JsonObject."); + return 0.0; + } + JsonObject jsonObject = jsonElement.getAsJsonObject(); + if (jsonObject.has("Time")) { + return jsonObject.get("Time").getAsDouble(); + } else { + System.err.println("The parsed JSON response does not contain a 'Time' entry."); + return 0.0; + } + } catch (Exception e) { + System.err.println("Error processing uptime data: " + e.getMessage()); + return 0.0; + } + } + + private static InstanceGlobalStatsData getInstanceGlobalStatus(String jsonResponse) { + try { + JsonElement jsonElement = JsonParser.parseString(jsonResponse); + 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."); + 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<>(); + for (int i = 0; i < onlineWorkersJsonArray.size(); i++) { + onlineWorkers.add(onlineWorkersJsonArray.get(i).getAsString()); + } + JsonArray pausedTradersJsonArray = jsonObject.get("paused_traders").getAsJsonArray(); + List pausedTraders = new ArrayList<>(); + for (int i = 0; i < pausedTradersJsonArray.size(); i++) { + pausedTraders.add(pausedTradersJsonArray.get(i).getAsString()); + } + + //Extract BrokerConfigData from the JSON response + BrokerConfigData brokerConfigData = null; + + return new InstanceGlobalStatsData( + jsonObject.get("name").getAsString(), + jsonObject.get("uptime").getAsDouble(), + onlineWorkers, + pausedTraders, + jsonObject.get("version").getAsString(), + jsonObject.get("ccxt_version").getAsString(), + brokerConfigData); + + } catch (JsonSyntaxException e) { + System.err.println("The JSON response is not valid."); + return null; + } catch (IOException e) { + System.err.println("There was an error reading the JSON response."); + return null; + } + } + + public static class InstanceGlobalStatsData { + private final String instanceName; + private final double instanceUptime; + private final List onlineWorkers; + private final List pausedTraders; + private final String version; + private final String ccxtVersion; + private final BrokerConfigData config; + + public InstanceGlobalStatsData(String name, double uptime, List onlineWorkers, List pausedTraders, String version, String ccxtVersion, BrokerConfigData config) { + this.instanceName = name; + this.instanceUptime = uptime; + this.onlineWorkers = onlineWorkers; + this.pausedTraders = pausedTraders; + this.version = version; + this.ccxtVersion = ccxtVersion; + this.config = config; + } + + public String getName() { return instanceName; } + public double getUptime() { return instanceUptime; } + public List getOnlineWorkers() { return onlineWorkers; } + public List getPausedTraders() { return pausedTraders; } + public String getVersion() { return version; } + public String getCcxtVersion() { return ccxtVersion; } + public BrokerConfigData getConfig() { return config; } + + } + + + public static class BrokerConfigData { + // Some fields are ignored, even though they are in the JSON + private final String brokerName; + private final Boolean isSandbox; + private final Boolean simulateMarketOrders; + private final List pairs; + private final double laptime; + 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) { + this.brokerName = brokerName; + this.isSandbox = isSandbox; + this.simulateMarketOrders = simulateMarketOrders; + this.pairs = pairs; + this.laptime = laptime; + this.cooldownMultiplier = cooldownMultiplier; + this.waitBeforeNewSafetyOrder = waitBeforeNewSafetyOrder; + this.sendTelegram = sendTelegram; + this.telegramBotToken = telegramBotToken; + this.telegramChatId = telegramChatId; + this.attemptToRestart = attemptToRestart; + this.defaultOrderSize = defaultOrderSize; + this.unifiedOrderQuery = unifiedOrderQuery; + } + + public String getBrokerName() { return brokerName; } + public Boolean getIsSandbox() { return isSandbox; } + public Boolean getSimulateMarketOrders() { return simulateMarketOrders; } + public List getPairs() { return pairs; } + public double getLaptime() { return laptime; } + 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; } + } + - // Class to hold profits stats data public static class ProfitStatsData { private final double profitsToday; private final double profitsThisMonth; @@ -98,8 +289,36 @@ public class InstanceInterface { this.profitsThisMonth = profitsThisMonth; } - // Getters public double getProfitsToday() { return profitsToday; } public double getProfitsThisMonth() { return profitsThisMonth; } } + + + public static class ExchangeStatsData { + // Create an instance: ExchangeStatsData exchangeStatsData = new ExchangeStatsData(R.drawable.your_drawable, 2000, 2500, 20, 14, 6); + // Getting the drawable: Drawable drawable = getResources().getDrawable(exchangeStatsData.getSemaphore()); + + private final int semaphore; + private final double fundsAvailable; + private final double fundsNeeded; + private final int onlineWorkers; + private final int longWorkers; + private final int shortWorkers; + + public ExchangeStatsData(int semaphore, double fundsAvailable, double fundsNeeded, int onlineWorkers, int longWorkers, int shortWorkers) { + this.semaphore = semaphore; + this.fundsAvailable = fundsAvailable; + this.fundsNeeded = fundsNeeded; + this.onlineWorkers = onlineWorkers; + this.longWorkers = longWorkers; + this.shortWorkers = shortWorkers; + } + + public int getSemaphore() { return semaphore; } + public double getFundsAvailable() { return fundsAvailable; } + public double getFundsNeeded() { return fundsNeeded; } + public int getOnlineWorkers() { return onlineWorkers; } + public int getLongWorkers() { return longWorkers; } + public int getShortWorkers() { return shortWorkers; } + } } \ No newline at end of file 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 848c560..c98181b 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 @@ -143,11 +143,6 @@ public class HomeFragment extends Fragment { exchange3Funds = root.findViewById(R.id.exchangeStats3Funds); exchange4Funds = root.findViewById(R.id.exchangeStats4Funds); - exchange1FundsNeeded = root.findViewById(R.id.exchangeStats1FundsNeeded); - exchange2FundsNeeded = root.findViewById(R.id.exchangeStats2FundsNeeded); - exchange3FundsNeeded = root.findViewById(R.id.exchangeStats3FundsNeeded); - exchange4FundsNeeded = root.findViewById(R.id.exchangeStats4FundsNeeded); - exchange1FundsPercentage = root.findViewById(R.id.exchangeStats1FundsPercentage); exchange2FundsPercentage = root.findViewById(R.id.exchangeStats2FundsPercentage); exchange3FundsPercentage = root.findViewById(R.id.exchangeStats3FundsPercentage); @@ -184,15 +179,13 @@ public class HomeFragment extends Fragment { * */ - // Profits today and this month - profitsToday.setText(R.string.profits_today_example); - profitsThisMonth.setText(R.string.profits_this_month_example); //Prices pricePair1.setText(R.string.default_price_ticker_1); pricePair2.setText(R.string.default_price_ticker_2); pricePair3.setText(R.string.default_price_ticker_3); + pricePair124hPercentage.setText(R.string.percentage_example); pricePair17dPercentage.setText(R.string.percentage_example); pricePair130dPercentage.setText(R.string.percentage_example); @@ -205,6 +198,7 @@ public class HomeFragment extends Fragment { pricePair37dPercentage.setText(R.string.percentage_example); pricePair330dPercentage.setText(R.string.percentage_example); + pricePair124hPercentage.setTextColor(Color.GREEN); pricePair17dPercentage.setTextColor(Color.GREEN); pricePair130dPercentage.setTextColor(Color.GREEN); @@ -217,6 +211,12 @@ public class HomeFragment extends Fragment { pricePair37dPercentage.setTextColor(Color.GREEN); pricePair330dPercentage.setTextColor(Color.GREEN); + + // Profits today and this month + profitsToday.setText(R.string.profits_today_example); + profitsThisMonth.setText(R.string.profits_this_month_example); + + //Exchange status exchange1Status.setImageResource(R.drawable.ic_green_circle_48); exchange2Status.setImageResource(R.drawable.ic_green_circle_48); @@ -233,11 +233,6 @@ public class HomeFragment extends Fragment { exchange3Funds.setText(R.string.exchange_funds_example); exchange4Funds.setText(R.string.exchange_funds_example); - exchange1FundsNeeded.setText(R.string.exchange_funds_needed_example); - exchange2FundsNeeded.setText(R.string.exchange_funds_needed_example); - exchange3FundsNeeded.setText(R.string.exchange_funds_needed_example); - exchange4FundsNeeded.setText(R.string.exchange_funds_needed_example); - exchange1FundsPercentage.setText(R.string.exchange_funds_percentage_example); exchange2FundsPercentage.setText(R.string.exchange_funds_percentage_example); exchange3FundsPercentage.setText(R.string.exchange_funds_percentage_example); @@ -268,8 +263,6 @@ public class HomeFragment extends Fragment { log3Content.setText(R.string.log_example); log4Content.setText(R.string.log_example); - // Let's fetch prices - //fetchAndDisplayPriceData(); // Setup task handler = new Handler(); @@ -385,7 +378,6 @@ public class HomeFragment extends Fragment { setPercentageColor(pricePair37dPercentage,priceData3.getPriceChangePercent7d()); setPercentageColor(pricePair330dPercentage,priceData3.getPriceChangePercent30d()); - //Toast.makeText(getContext(), String.format(Locale.ROOT,"%.2f", profitsData.getProfitsToday()), Toast.LENGTH_SHORT).show(); profitsToday.setText(String.format(Locale.ROOT,"%.2f", profitsData.getProfitsToday())); profitsThisMonth.setText(String.format(Locale.ROOT,"%.2f", profitsData.getProfitsThisMonth())); diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 3b30719..d86a5c1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -372,30 +372,13 @@ android:textStyle="normal" /> - - - - - - - - - Today: - 420.69 + This month: - 8392.39 + USDT Exchange semaphore @@ -63,8 +63,7 @@ KuCoin OKX - 15203.20 - 59393.39 + 35203.20/65535.20 169% 20 20/20