I hate classes

This commit is contained in:
Nicolás Sánchez 2024-12-13 13:11:08 -03:00
parent 090bf03a68
commit bff178991f
4 changed files with 246 additions and 105 deletions

View File

@ -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<String> 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<String> 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<String> onlineWorkers;
private final List<String> pausedTraders;
private final String version;
private final String ccxtVersion;
private final BrokerConfigData config;
public InstanceGlobalStatsData(String name, double uptime, List<String> onlineWorkers, List<String> 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<String> getOnlineWorkers() { return onlineWorkers; }
public List<String> 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<String> 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<String> 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<String> 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; }
}
}

View File

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

View File

@ -372,30 +372,13 @@
android:textStyle="normal" />
<TextView
android:id="@+id/exchangeStats1Funds"
android:layout_width="72dp"
android:layout_width="148dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:layout_width="6dp"
android:layout_height="24dp"
android:text="@string/exchange_separator"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats1FundsNeeded"
android:layout_width="72dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_needed_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats1FundsPercentage"
android:layout_width="52dp"
@ -458,30 +441,13 @@
android:textStyle="normal" />
<TextView
android:id="@+id/exchangeStats2Funds"
android:layout_width="72dp"
android:layout_width="148dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:layout_width="6dp"
android:layout_height="24dp"
android:text="@string/exchange_separator"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats2FundsNeeded"
android:layout_width="72dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_needed_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats2FundsPercentage"
android:layout_width="52dp"
@ -545,30 +511,13 @@
android:textStyle="normal" />
<TextView
android:id="@+id/exchangeStats3Funds"
android:layout_width="72dp"
android:layout_width="148dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:layout_width="6dp"
android:layout_height="24dp"
android:text="@string/exchange_separator"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats3FundsNeeded"
android:layout_width="72dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_needed_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats3FundsPercentage"
android:layout_width="52dp"
@ -632,30 +581,13 @@
android:textStyle="normal" />
<TextView
android:id="@+id/exchangeStats4Funds"
android:layout_width="72dp"
android:layout_width="148dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:layout_width="6dp"
android:layout_height="24dp"
android:text="@string/exchange_separator"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats4FundsNeeded"
android:layout_width="72dp"
android:layout_height="24dp"
android:text="@string/exchange_funds_needed_example"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/exchangeStats4FundsPercentage"
android:layout_width="52dp"
@ -705,7 +637,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_height="24dp"
android:text="@string/last_trades_label"
android:textColor="@color/secondary_text_color"
android:textAlignment="center"
@ -736,14 +668,13 @@
<TextView
android:layout_width="match_parent"
android:layout_height="22dp"
android:layout_height="24dp"
android:id="@+id/log1CardTitle"
android:text="@string/exchange_1_log_title"
android:textAlignment="center"
android:textColor="@color/secondary_text_color"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -765,7 +696,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="22dp"
android:layout_height="24dp"
android:id="@+id/log2CardTitle"
android:text="@string/exchange_2_log_title"
android:textAlignment="center"
@ -794,7 +725,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="22dp"
android:layout_height="24dp"
android:id="@+id/log3CardTitle"
android:text="@string/exchange_3_log_title"
android:textAlignment="center"
@ -823,7 +754,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="22dp"
android:layout_height="24dp"
android:id="@+id/log4CardTitle"
android:text="@string/exchange_4_log_title"
android:textAlignment="center"

View File

@ -52,9 +52,9 @@
<string name="percentage_example" translatable="false"> </string>
<string name="profits_today_title">Today:</string>
<string name="profits_today_example" translatable="false">420.69</string>
<string name="profits_today_example" translatable="false"> </string>
<string name="profits_this_month_title">This month:</string>
<string name="profits_this_month_example" translatable="false">8392.39</string>
<string name="profits_this_month_example" translatable="false"> </string>
<string name="profits_quote_currency" translatable="false">USDT</string>
<string name="semaphore_description">Exchange semaphore</string>
@ -63,8 +63,7 @@
<string name="exchange_3_name" translatable="false">KuCoin</string>
<string name="exchange_4_name" translatable="false">OKX</string>
<string name="exchange_funds_example" translatable="false">15203.20</string>
<string name="exchange_funds_needed_example" translatable="false">59393.39</string>
<string name="exchange_funds_example" translatable="false">35203.20/65535.20</string>
<string name="exchange_funds_percentage_example" translatable="false">169%</string>
<string name="exchange_workers_online_example" translatable="false">20</string>
<string name="exchange_workers_long_short_example" translatable="false">20/20</string>