available funds and semaphore

This commit is contained in:
Nicolás Sánchez 2024-12-14 11:28:20 -03:00
parent 16175b11aa
commit d2802051cd
2 changed files with 306 additions and 107 deletions

View File

@ -48,6 +48,47 @@ public class InstanceInterface {
} }
} }
private static double getTodaysProfit(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("combined")) {
JsonArray combinedArray = jsonObject.get("combined").getAsJsonArray();
return combinedArray.get(0).getAsDouble();
} else {
System.err.println("The parsed JSON response does not contain a 'combined' array.");
return 0.0;
}
} catch (Exception e) {
System.err.println("Error processing combined profit data: " + e.getMessage());
return 0.0;
}
}
private static double getThisMonthsProfit(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("combined")) {
JsonArray combinedArray = jsonObject.get("combined").getAsJsonArray();
return combinedArray.get(1).getAsDouble();
} else {
System.err.println("The parsed JSON response does not contain a 'combined' array.");
return 0.0;
}
} catch (Exception e) {
System.err.println("Error processing combined profit data: " + e.getMessage());
return 0.0;
}
}
public static double getTraderTime(String exchange) throws IOException { public static double getTraderTime(String exchange) throws IOException {
Request uptimeRequest = new Request.Builder() Request uptimeRequest = new Request.Builder()
@ -61,7 +102,23 @@ public class InstanceInterface {
} }
String stockResponseBody = statsResponse.body().string(); String stockResponseBody = statsResponse.body().string();
return getUptime(stockResponseBody); try {
JsonElement jsonElement = JsonParser.parseString(stockResponseBody);
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;
}
} }
} }
@ -107,11 +164,6 @@ public class InstanceInterface {
List<DealData> kucoinDeals = kucoinFuture.join(); List<DealData> kucoinDeals = kucoinFuture.join();
List<DealData> okxDeals = okxFuture.join(); List<DealData> okxDeals = okxFuture.join();
// List<DealData>binanceDeals = getLastTradesFromExchange("binance");
// List<DealData>gateioDeals = getLastTradesFromExchange("gateio");
// List<DealData>kucoinDeals = getLastTradesFromExchange("kucoin");
// List<DealData>okxDeals = getLastTradesFromExchange("okex");
List<DealData> allDeals = new ArrayList<>(); List<DealData> allDeals = new ArrayList<>();
allDeals.addAll(binanceDeals); allDeals.addAll(binanceDeals);
allDeals.addAll(gateioDeals); allDeals.addAll(gateioDeals);
@ -192,6 +244,7 @@ public class InstanceInterface {
System.err.println("The parsed JSON response does not contain the logs key."); System.err.println("The parsed JSON response does not contain the logs key.");
return null; return null;
} }
JsonArray logsArray = jsonObject.getAsJsonArray("Logs"); JsonArray logsArray = jsonObject.getAsJsonArray("Logs");
List<String> logList = new ArrayList<>(); List<String> logList = new ArrayList<>();
for (int i = logsArray.size()-1; i >= 0; i--) { for (int i = logsArray.size()-1; i >= 0; i--) {
@ -206,12 +259,65 @@ public class InstanceInterface {
public static ExchangeStatsData getExchangeStatsData(String exchange) throws IOException { public static ExchangeStatsData getExchangeStatsData(String exchange) throws IOException {
//This needs to do A LOT of work double lastSeen;
return null; double fundsAvailable;
double fundsNeeded;
int onlineWorkers;
int longWorkers;
int shortWorkers;
// Semaphore
lastSeen = getTraderTime(exchange);
//Funds available
fundsAvailable = getFundsAvailable(exchange, "USDT");
//Individual worker status needed to calculate this
//Funds needed
fundsNeeded = 0;
//Online workers
onlineWorkers = 0;
//Long workers
longWorkers = 0;
//Short workers
shortWorkers = 0;
return new ExchangeStatsData(lastSeen,fundsAvailable,fundsNeeded,onlineWorkers,longWorkers,shortWorkers);
} }
public static List<String> getAllWorkersStats(String exchange) throws IOException { private static double getFundsAvailable(String exchange, String coin) throws IOException {
Request fundsRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/get_balance?coin=" + coin)
.header("X-API-KEY", API_KEY)
.build();
try (Response statsResponse = httpClient.newCall(fundsRequest).execute()) {
if (!statsResponse.isSuccessful()) {
throw new IOException("Unexpected code " + statsResponse);
}
String fundsResponseBody = statsResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(fundsResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return 0.0;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (!jsonObject.has(coin)) {
System.err.println("The parsed JSON response does not contain the coin requested.");
return 0.0;
}
return jsonObject.get(coin).getAsDouble();
}
}
public static List<WorkerStatsData> getAllWorkersStats(String exchange) throws IOException {
return null; return null;
} }
@ -233,67 +339,25 @@ public class InstanceInterface {
} }
private static double getTodaysProfit(String jsonResponse) { // private static double getUptime(String jsonResponse) {
try { // try {
JsonElement jsonElement = JsonParser.parseString(jsonResponse); // JsonElement jsonElement = JsonParser.parseString(jsonResponse);
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 0.0; // return 0.0;
} // }
JsonObject jsonObject = jsonElement.getAsJsonObject(); // JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("combined")) { // if (jsonObject.has("Time")) {
JsonArray combinedArray = jsonObject.get("combined").getAsJsonArray(); // return jsonObject.get("Time").getAsDouble();
return combinedArray.get(0).getAsDouble(); // } else {
} else { // System.err.println("The parsed JSON response does not contain a 'Time' entry.");
System.err.println("The parsed JSON response does not contain a 'combined' array."); // return 0.0;
return 0.0; // }
} // } catch (Exception e) {
} catch (Exception e) { // System.err.println("Error processing uptime data: " + e.getMessage());
System.err.println("Error processing combined profit data: " + e.getMessage()); // return 0.0;
return 0.0; // }
} // }
}
private static double getThisMonthsProfit(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("combined")) {
JsonArray combinedArray = jsonObject.get("combined").getAsJsonArray();
return combinedArray.get(1).getAsDouble();
} else {
System.err.println("The parsed JSON response does not contain a 'combined' array.");
return 0.0;
}
} catch (Exception e) {
System.err.println("Error processing combined profit data: " + e.getMessage());
return 0.0;
}
}
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) { private static InstanceGlobalStatsData getInstanceGlobalStatus(String jsonResponse) {
try { try {
@ -480,15 +544,15 @@ public class InstanceInterface {
public static class ExchangeStatsData { public static class ExchangeStatsData {
private final int semaphore; private final double lastSeen;
private final double fundsAvailable; private final double fundsAvailable;
private final double fundsNeeded; private final double fundsNeeded;
private final int onlineWorkers; private final int onlineWorkers;
private final int longWorkers; private final int longWorkers;
private final int shortWorkers; private final int shortWorkers;
public ExchangeStatsData(int semaphore, double fundsAvailable, double fundsNeeded, int onlineWorkers, int longWorkers, int shortWorkers) { public ExchangeStatsData(double lastSeen, double fundsAvailable, double fundsNeeded, int onlineWorkers, int longWorkers, int shortWorkers) {
this.semaphore = semaphore; this.lastSeen = lastSeen;
this.fundsAvailable = fundsAvailable; this.fundsAvailable = fundsAvailable;
this.fundsNeeded = fundsNeeded; this.fundsNeeded = fundsNeeded;
this.onlineWorkers = onlineWorkers; this.onlineWorkers = onlineWorkers;
@ -496,7 +560,7 @@ public class InstanceInterface {
this.shortWorkers = shortWorkers; this.shortWorkers = shortWorkers;
} }
public int getSemaphore() { return semaphore; } public double getLastSeen() { return lastSeen; }
public double getFundsAvailable() { return fundsAvailable; } public double getFundsAvailable() { return fundsAvailable; }
public double getFundsNeeded() { return fundsNeeded; } public double getFundsNeeded() { return fundsNeeded; }
public int getOnlineWorkers() { return onlineWorkers; } public int getOnlineWorkers() { return onlineWorkers; }

View File

@ -387,16 +387,54 @@ public class HomeFragment extends Fragment {
} }
}); });
CompletableFuture<InstanceInterface.ExchangeStatsData> future10 = CompletableFuture.supplyAsync(() -> {
try {
return InstanceInterface.getExchangeStatsData("binance");
} catch (IOException e) {
System.err.print(e.toString());
return null;
}
});
CompletableFuture<InstanceInterface.ExchangeStatsData> future11 = CompletableFuture.supplyAsync(() -> {
try {
return InstanceInterface.getExchangeStatsData("gateio");
} catch (IOException e) {
System.err.print(e.toString());
return null;
}
});
CompletableFuture<InstanceInterface.ExchangeStatsData> future12 = CompletableFuture.supplyAsync(() -> {
try {
return InstanceInterface.getExchangeStatsData("kucoin");
} catch (IOException e) {
System.err.print(e.toString());
return null;
}
});
CompletableFuture<InstanceInterface.ExchangeStatsData> future13 = CompletableFuture.supplyAsync(() -> {
try {
return InstanceInterface.getExchangeStatsData("okex");
} catch (IOException e) {
System.err.print(e.toString());
return null;
}
});
// Wait for all futures to complete // Wait for all futures to complete
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3, future4, future5, future6, future7, future8, future9); CompletableFuture<Void> allFutures = CompletableFuture.allOf(
future1, future2, future3, future4, future5, future6, future7, future8,
future9, future10, future11, future12, future13);
// Update UI // Update UI
allFutures.thenAccept(voidResult -> { allFutures.thenAccept(voidResult -> {
try { try {
requireActivity().runOnUiThread(() -> { requireActivity().runOnUiThread(() -> {
TickerTracker.PriceChangeData priceData = null; TickerTracker.PriceChangeData priceData;
TickerTracker.PriceChangeData priceData2 = null; TickerTracker.PriceChangeData priceData2;
TickerTracker.PriceChangeData priceData3 = null; TickerTracker.PriceChangeData priceData3;
try { try {
priceData = future1.get(); priceData = future1.get();
priceData2 = future2.get(); priceData2 = future2.get();
@ -412,10 +450,10 @@ public class HomeFragment extends Fragment {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
String logs1 = null; String logs1;
String logs2 = null; String logs2;
String logs3 = null; String logs3;
String logs4 = null; String logs4;
try { try {
logs1 = future5.get(); logs1 = future5.get();
logs2 = future6.get(); logs2 = future6.get();
@ -425,6 +463,48 @@ public class HomeFragment extends Fragment {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
//Populate deals page
try {
List<InstanceInterface.DealData> deals = future9.get();
if (deals != null) {
StringBuilder dealsList = new StringBuilder();
for (InstanceInterface.DealData deal : deals) {
String timestamp = timeStampConverter(deal.getTimestamp());
String pair = deal.getPair();
String amount = String.format(Locale.ROOT,"%.2f", deal.getAmount());
String exchange = Character.toUpperCase(deal.getExchangeName().charAt(0)) + deal.getExchangeName().substring(1);
dealsList.append(timestamp)
.append(" | ")
.append(pair)
.append(" | ")
.append(amount)
.append(" USDT | ")
.append(exchange).append("\n");
}
lastTrades.setText(dealsList);
}
} catch (ExecutionException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
InstanceInterface.ExchangeStatsData binanceStats;
InstanceInterface.ExchangeStatsData gateioStats;
InstanceInterface.ExchangeStatsData kucoinStats;
InstanceInterface.ExchangeStatsData okexStats;
try {
binanceStats = future10.get();
gateioStats = future11.get();
kucoinStats = future12.get();
okexStats = future13.get();
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
pricePair1.setText(String.format(Locale.ROOT, "%.2f", priceData.getCurrentPrice())); pricePair1.setText(String.format(Locale.ROOT, "%.2f", priceData.getCurrentPrice()));
pricePair124hPercentage.setText(formatPercentage(priceData.getPriceChangePercent24h())); pricePair124hPercentage.setText(formatPercentage(priceData.getPriceChangePercent24h()));
pricePair17dPercentage.setText(formatPercentage(priceData.getPriceChangePercent7d())); pricePair17dPercentage.setText(formatPercentage(priceData.getPriceChangePercent7d()));
@ -452,32 +532,87 @@ public class HomeFragment extends Fragment {
profitsToday.setText(String.format(Locale.ROOT, "%.2f", profitsData.getProfitsToday())); profitsToday.setText(String.format(Locale.ROOT, "%.2f", profitsData.getProfitsToday()));
profitsThisMonth.setText(String.format(Locale.ROOT, "%.2f", profitsData.getProfitsThisMonth())); profitsThisMonth.setText(String.format(Locale.ROOT, "%.2f", profitsData.getProfitsThisMonth()));
//Exchange stats
int timeoutForYellow = 30*1000; //30 seconds
int timeoutForRed = 300*1000; //300 seconds
//Icons
if (binanceStats.getLastSeen()*1000+timeoutForRed < System.currentTimeMillis()) {
exchange1Status.setImageResource(R.drawable.ic_red_circle_48);
System.err.println(binanceStats.getLastSeen());}
else if (binanceStats.getLastSeen()*1000+timeoutForYellow < System.currentTimeMillis()) {
exchange1Status.setImageResource(R.drawable.ic_yellow_circle_48);}
else {
exchange1Status.setImageResource(R.drawable.ic_green_circle_48);
}
if (gateioStats.getLastSeen()*1000+timeoutForRed < System.currentTimeMillis()) {
exchange2Status.setImageResource(R.drawable.ic_red_circle_48);
System.err.println(gateioStats.getLastSeen());}
else if (gateioStats.getLastSeen()*1000+timeoutForYellow < System.currentTimeMillis()) {
exchange2Status.setImageResource(R.drawable.ic_yellow_circle_48);}
else {
exchange2Status.setImageResource(R.drawable.ic_green_circle_48);
}
if (kucoinStats.getLastSeen()*1000+timeoutForRed < System.currentTimeMillis()) {
exchange3Status.setImageResource(R.drawable.ic_red_circle_48);
System.err.println(kucoinStats.getLastSeen());}
else if (kucoinStats.getLastSeen()*1000+timeoutForYellow < System.currentTimeMillis()) {
exchange3Status.setImageResource(R.drawable.ic_yellow_circle_48);}
else {
exchange3Status.setImageResource(R.drawable.ic_green_circle_48);
}
if (okexStats.getLastSeen()*1000+timeoutForRed < System.currentTimeMillis()) {
exchange4Status.setImageResource(R.drawable.ic_red_circle_48);
System.err.println(okexStats.getLastSeen());
}
else if (okexStats.getLastSeen()*1000+timeoutForYellow < System.currentTimeMillis()) {
exchange4Status.setImageResource(R.drawable.ic_yellow_circle_48);}
else {
exchange4Status.setImageResource(R.drawable.ic_green_circle_48);
}
//Funds available
String binanceFundsAvailable = String.format(Locale.ROOT,"%.2f",binanceStats.getFundsAvailable());
String binanceFundsNeeded = String.format(Locale.ROOT,"%.2f",binanceStats.getFundsNeeded());
String gateioFundsAvailable = String.format(Locale.ROOT,"%.2f",gateioStats.getFundsAvailable());
String gateioFundsNeeded = String.format(Locale.ROOT,"%.2f",gateioStats.getFundsNeeded());
String kucoinFundsAvailable = String.format(Locale.ROOT,"%.2f",kucoinStats.getFundsAvailable());
String kucoinFundsNeeded = String.format(Locale.ROOT,"%.2f",kucoinStats.getFundsNeeded());
String okexFundsAvailable = String.format(Locale.ROOT,"%.2f",okexStats.getFundsAvailable());
String okexFundsNeeded = String.format(Locale.ROOT,"%.2f",okexStats.getFundsNeeded());
String binanceFunds = binanceFundsAvailable+"/"+binanceFundsNeeded;
String gateioFunds = gateioFundsAvailable+"/"+gateioFundsNeeded;
String kucoinFunds = kucoinFundsAvailable+"/"+kucoinFundsNeeded;
String okexFunds = okexFundsAvailable+"/"+okexFundsNeeded;
double binanceFundsPercentage = 69.4231337;
if (binanceStats.getFundsNeeded()!=0) {
binanceFundsPercentage = 100 - (binanceStats.getFundsNeeded() - binanceStats.getFundsAvailable()) / binanceStats.getFundsNeeded() * 100;
}
double gateioFundsPercentage = 69.4231337;
if (gateioStats.getFundsNeeded()!=0) {
gateioFundsPercentage = 100 - (gateioStats.getFundsNeeded() - gateioStats.getFundsAvailable()) / gateioStats.getFundsNeeded() * 100;
}
double kucoinFundsPercentage = 69.4231337;
if (kucoinStats.getFundsNeeded()!=0) {
kucoinFundsPercentage = 100 - (kucoinStats.getFundsNeeded() - kucoinStats.getFundsAvailable()) / kucoinStats.getFundsNeeded() * 100;
}
double okexFundsPercentage = 69.4231337;
if (okexStats.getFundsNeeded()!=0) {
okexFundsPercentage = 100 - (okexStats.getFundsNeeded() - okexStats.getFundsAvailable()) / okexStats.getFundsNeeded() * 100;
}
String binanceFundsPercentageString = String.format(Locale.ROOT,"%.2f",binanceFundsPercentage)+"%";
String gateioFundsPercentageString = String.format(Locale.ROOT,"%.2f",gateioFundsPercentage)+"%";
String kucoinFundsPercentageString = String.format(Locale.ROOT,"%.2f",kucoinFundsPercentage)+"%";
String okexFundsPercentageString = String.format(Locale.ROOT,"%.2f",okexFundsPercentage)+"%";
exchange1Funds.setText(binanceFunds);
exchange2Funds.setText(gateioFunds);
exchange3Funds.setText(kucoinFunds);
exchange4Funds.setText(okexFunds);
exchange1FundsPercentage.setText(binanceFundsPercentageString);
exchange2FundsPercentage.setText(gateioFundsPercentageString);
exchange3FundsPercentage.setText(kucoinFundsPercentageString);
exchange4FundsPercentage.setText(okexFundsPercentageString);
//Populate deals page
try {
List<InstanceInterface.DealData> deals = future9.get();
if (deals != null) {
StringBuilder dealsList = new StringBuilder();
for (InstanceInterface.DealData deal : deals) {
String timestamp = timeStampConverter(deal.getTimestamp());
String pair = deal.getPair();
String amount = String.format(Locale.ROOT,"%.2f", deal.getAmount());
String exchange = Character.toUpperCase(deal.getExchangeName().charAt(0)) + deal.getExchangeName().substring(1);
dealsList.append(timestamp)
.append(" | ")
.append(pair)
.append(" | ")
.append(amount)
.append(" USDT | ")
.append(exchange).append("\n");
}
lastTrades.setText(dealsList);
}
} catch (ExecutionException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//Populate logs //Populate logs
log1Content.setText(logs1); log1Content.setText(logs1);