DCAv2GUI/app/src/main/java/com/example/dcav2gui/WorkerInterface.java

726 lines
36 KiB
Java

package com.example.dcav2gui;
import static com.example.dcav2gui.MainActivity.globalSettings;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import java.io.IOException;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class WorkerInterface {
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 InstanceInterface.WorkerStatsData getWorkerDetails(String exchange, String pair, boolean retry) throws IOException {
InstanceInterface.WorkerStatsData valueToReturn = null;
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
Request workerStatsRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/worker_status?base="+base+"&quote="+quote)
.header("X-API-KEY", API_KEY)
.build();
try (Response workerStatsResponse = httpClient.newCall(workerStatsRequest).execute()) {
if (!workerStatsResponse.isSuccessful()) {
if (workerStatsResponse.code() == 503 && retry) {
return getWorkerDetails(exchange, pair,false);
}
throw new IOException("Unexpected code " + workerStatsResponse);
}
String workersStatsResponseBody = workerStatsResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(workersStatsResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return null;
}
JsonObject value = jsonObject.getAsJsonObject();
try {
boolean isShort = value.has("is_short") && value.get("is_short").isJsonPrimitive() && value.get("is_short").getAsBoolean();
boolean isBoosted = value.has("is_boosted") && value.get("is_boosted").isJsonPrimitive() && value.get("is_boosted").getAsBoolean();
boolean isPaused = value.has("is_paused") && value.get("is_paused").isJsonPrimitive() && value.get("is_paused").getAsBoolean();
boolean isAutoSwitchEnabled = value.has("autoswitch") && value.get("autoswitch").isJsonPrimitive() && value.get("autoswitch").getAsBoolean();
boolean stopWhenProfit = value.has("stop_when_profit") && value.get("stop_when_profit").isJsonPrimitive() && value.get("stop_when_profit").getAsBoolean();
double orderSize = value.has("order_size") && value.get("order_size").isJsonPrimitive() ? value.get("order_size").getAsDouble() : 0.0;
double quoteSpent = value.has("quote_spent") && value.get("quote_spent").isJsonPrimitive() ? value.get("quote_spent").getAsDouble() : 0.0;
double baseBought = value.has("base_bought") && value.get("base_bought").isJsonPrimitive() ? value.get("base_bought").getAsDouble() : 0.0;
int soAmount = value.has("so_amount") && value.get("so_amount").isJsonPrimitive() ? value.get("so_amount").getAsInt() : 0;
int numberOfSafetyOrders = value.has("no_of_safety_orders") && value.get("no_of_safety_orders").isJsonPrimitive() ? value.get("no_of_safety_orders").getAsInt() : 0;
int tpMode = value.has("tp_mode") && value.get("tp_mode").isJsonPrimitive() ? value.get("tp_mode").getAsInt() : 0;
String profitTable = value.has("profit_table") && value.get("profit_table").isJsonPrimitive() ? value.get("profit_table").getAsString() : null;
double startTime = value.has("start_time") && value.get("start_time").isJsonPrimitive() ? value.get("start_time").getAsDouble() : 0.0;
double startPrice = value.has("start_price") && value.get("start_price").isJsonPrimitive() ? value.get("start_price").getAsDouble() : 0.0;
double dealStartTime = value.has("deal_start_time") && value.get("deal_start_time").isJsonPrimitive() ? value.get("deal_start_time").getAsDouble() : 0.0;
double dealUptime = value.has("deal_uptime") && value.get("deal_uptime").isJsonPrimitive() ? value.get("deal_uptime").getAsDouble() : 0.0;
double totalUptime = value.has("total_uptime") && value.get("total_uptime").isJsonPrimitive() ? value.get("total_uptime").getAsDouble() : 0.0;
double price = value.has("price") && value.get("price").isJsonPrimitive() ? value.get("price").getAsDouble() : 0.0;
double takeProfitPrice = value.has("take_profit_price") && value.get("take_profit_price").isJsonPrimitive() ? value.get("take_profit_price").getAsDouble() : 0.0;
double nextSoPrice = value.has("next_so_price") && value.get("next_so_price").isJsonPrimitive() ? value.get("next_so_price").getAsDouble() : 0.0;
String tpOrderId = value.has("tp_order_id") && value.get("tp_order_id").isJsonPrimitive() ? value.get("tp_order_id").getAsString() : null;
JsonObject takeProfitOrder = value.get("take_profit_order").getAsJsonObject();
String safetyOrderId = value.has("safety_order_id") && value.get("safety_order_id").isJsonPrimitive() ? value.get("safety_order_id").getAsString() : null;
JsonObject safetyOrder = value.get("safety_order").getAsJsonObject();
double feesPaidInBase = value.has("fees_paid_in_base") && value.get("fees_paid_in_base").isJsonPrimitive() ? value.get("fees_paid_in_base").getAsDouble() : 0.0;
double feesPaidInQuote = value.has("fees_paid_in_quote") && value.get("fees_paid_in_quote").isJsonPrimitive() ? value.get("fees_paid_in_quote").getAsDouble() : 0.0;
double partialProfit = value.has("partial_profit") && value.get("partial_profit").isJsonPrimitive() ? value.get("partial_profit").getAsDouble() : 0.0;
String safetyPriceTable = value.has("safety_price_table") && value.get("safety_price_table").isJsonPrimitive() ? value.get("safety_price_table").getAsString() : null;
String dealOrderHistory = value.has("deal_order_history") && value.get("deal_order_history").isJsonPrimitive() ? value.get("deal_order_history").getAsString() : null;
String pauseReason = value.has("pause_reason") && value.get("pause_reason").isJsonPrimitive() ? value.get("pause_reason").getAsString() : null;
String statusString = value.has("status_string") && value.get("status_string").isJsonPrimitive() ? value.get("status_string").getAsString() : null;
JsonObject oldLong;
InstanceInterface.OldLongDictionary oldLongDictionary = null;
if (value.has("old_long")) {
oldLong = value.get("old_long").getAsJsonObject();
oldLongDictionary = new InstanceInterface.OldLongDictionary(
oldLong.get("datetime").getAsString(),
oldLong.get("fees_paid_in_quote").getAsDouble(),
oldLong.get("quote_spent").getAsDouble(),
oldLong.get("tp_amount").getAsDouble(),
oldLong.get("tp_price").getAsDouble()
);
}
valueToReturn = new InstanceInterface.WorkerStatsData(
pair,
isShort,
isBoosted,
isPaused,
isAutoSwitchEnabled,
stopWhenProfit,
orderSize,
quoteSpent,
baseBought,
soAmount,
numberOfSafetyOrders,
tpMode,
profitTable,
startTime,
startPrice,
dealStartTime,
dealUptime,
totalUptime,
price,
takeProfitPrice,
nextSoPrice,
tpOrderId,
takeProfitOrder,
safetyOrderId,
safetyOrder,
feesPaidInBase,
feesPaidInQuote,
partialProfit,
safetyPriceTable,
dealOrderHistory,
pauseReason,
oldLongDictionary,
statusString);
} catch (Exception e) {
System.err.println("Error processing JSON for key '" + pair + "': " + e.getMessage());
}
}
return valueToReturn;
}
public static JsonObject addTrader(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request addTraderRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/add_pair")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response addTraderResponse = httpClient.newCall(addTraderRequest).execute()) {
if (!addTraderResponse.isSuccessful()) {
if (addTraderResponse.code() == 503 && retry) {
return addTrader(exchange, pair, false);
}
throw new IOException("Unexpected code " + addTraderResponse);
}
String addTraderResponseBody = addTraderResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(addTraderResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair added"}
return jsonObject;
}
}
public static JsonObject removeTrader(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request removeTraderRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/remove_pair")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response removeTraderResponse = httpClient.newCall(removeTraderRequest).execute()) {
if (!removeTraderResponse.isSuccessful()) {
if (removeTraderResponse.code() == 503 && retry) {
return removeTrader(exchange, pair, false);
}
throw new IOException("Unexpected code " + removeTraderResponse);
}
String removeTraderResponseBody = removeTraderResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(removeTraderResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair to be removed"}
return jsonObject;
}
}
public static JsonObject restartTrader(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request restartTraderRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/restart_pair")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response restartTraderResponse = httpClient.newCall(restartTraderRequest).execute()) {
if (!restartTraderResponse.isSuccessful()) {
if (restartTraderResponse.code() == 503 && retry) {
return restartTrader(exchange, pair, false);
}
throw new IOException("Unexpected code " + restartTraderResponse);
}
String restartTraderResponseBody = restartTraderResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(restartTraderResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair restarted"}
return jsonObject;
}
}
public static JsonObject importTrader(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request importTraderRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/import_pair")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response importTraderResponse = httpClient.newCall(importTraderRequest).execute()) {
if (!importTraderResponse.isSuccessful()) {
if (importTraderResponse.code() == 503 && retry) {
return importTrader(exchange, pair, false);
}
throw new IOException("Unexpected code " + importTraderResponse);
}
String importTraderResponseBody = importTraderResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(importTraderResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair imported successfully"}
return jsonObject;
}
}
public static JsonObject togglePause(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request togglePauseRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/toggle_pause")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response togglePauseResponse = httpClient.newCall(togglePauseRequest).execute()) {
if (!togglePauseResponse.isSuccessful()) {
if (togglePauseResponse.code() == 503 && retry) {
return togglePause(exchange, pair, false);
}
throw new IOException("Unexpected code " + togglePauseResponse);
}
String togglePauseResponseBody = togglePauseResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(togglePauseResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Trader will be paused"} or {"Success":"Trader will be resumed"}
return jsonObject;
}
}
public static JsonObject toggleAutoswitch(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request toggleAutoswitchRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/toggle_autoswitch")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response toggleAutoswitchResponse = httpClient.newCall(toggleAutoswitchRequest).execute()) {
if (!toggleAutoswitchResponse.isSuccessful()) {
if (toggleAutoswitchResponse.code() == 503 && retry) {
return toggleAutoswitch(exchange, pair, false);
}
throw new IOException("Unexpected code " + toggleAutoswitchResponse);
}
String toggleAutoswitchResponseBody = toggleAutoswitchResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(toggleAutoswitchResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Autoswitch is now ON"} or {"Success":"Autoswitch is now OFF"}
return jsonObject;
}
}
public static JsonObject toggleCleanup(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request toggleCleanupRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/toggle_cleanup")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response toggleCleanupResponse = httpClient.newCall(toggleCleanupRequest).execute()) {
if (!toggleCleanupResponse.isSuccessful()) {
if (toggleCleanupResponse.code() == 503 && retry) {
return toggleCleanup(exchange, pair, false);
}
throw new IOException("Unexpected code " + toggleCleanupResponse);
}
String toggleCleanupResponseBody = toggleCleanupResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(toggleCleanupResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Cleanup turned ON"} or {"Success":"Cleanup turned OFF"}
return jsonObject;
}
}
public static JsonObject toggleLastCall(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request toggleLastCallRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/last_call")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response toggleLastCallResponse = httpClient.newCall(toggleLastCallRequest).execute()) {
if (!toggleLastCallResponse.isSuccessful()) {
if (toggleLastCallResponse.code() == 503 && retry) {
return toggleLastCall(exchange, pair, false);
}
throw new IOException("Unexpected code " + toggleLastCallResponse);
}
String toggleLastCallResponseBody = toggleLastCallResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(toggleLastCallResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Trader scheduled to go offline when profit is reached"} or {"Success":"Last call cancelled"}
return jsonObject;
}
}
public static JsonObject switchToLong(String exchange, String pair, boolean calculateProfits, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
String profits = "0";
if (calculateProfits) {
profits = "1";
}
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
formBuilder.add("calculate_profits", profits);
RequestBody formBody = formBuilder.build();
Request switchToLongRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/switch_to_long")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response switchToLongResponse = httpClient.newCall(switchToLongRequest).execute()) {
if (!switchToLongResponse.isSuccessful()) {
if (switchToLongResponse.code() == 503 && retry) {
return switchToLong(exchange, pair, calculateProfits,false);
}
throw new IOException("Unexpected code " + switchToLongResponse);
}
String switchToLongResponseBody = switchToLongResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(switchToLongResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair switched to long mode"}
return jsonObject;
}
}
public static JsonObject switchToShort(String exchange, String pair, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
RequestBody formBody = formBuilder.build();
Request switchToShortRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/switch_to_short")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response switchToShortResponse = httpClient.newCall(switchToShortRequest).execute()) {
if (!switchToShortResponse.isSuccessful()) {
if (switchToShortResponse.code() == 503 && retry) {
return switchToShort(exchange, pair, false);
}
throw new IOException("Unexpected code " + switchToShortResponse);
}
String switchToShortResponseBody = switchToShortResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(switchToShortResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Pair switched to short mode"}
return jsonObject;
}
}
public static JsonObject switchQuoteCurrency(String exchange, String pair, String targetQuoteCurrency, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
formBuilder.add("new_quote", targetQuoteCurrency);
RequestBody formBody = formBuilder.build();
Request switchQuoteCurrencyRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/switch_quote_currency")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response switchQuoteCurrencyResponse = httpClient.newCall(switchQuoteCurrencyRequest).execute()) {
if (!switchQuoteCurrencyResponse.isSuccessful()) {
if (switchQuoteCurrencyResponse.code() == 503 && retry) {
return switchQuoteCurrency(exchange, pair, targetQuoteCurrency,false);
}
throw new IOException("Unexpected code " + switchQuoteCurrencyResponse);
}
String switchQuoteCurrencyResponseBody = switchQuoteCurrencyResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(switchQuoteCurrencyResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Mission successful"}
return jsonObject;
}
}
public static JsonObject addSafetyOrders(String exchange, String pair, int amount, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
formBuilder.add("amount", String.valueOf(amount));
RequestBody formBody = formBuilder.build();
Request addSafetyOrdersRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/add_so")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response addSafetyOrdersResponse = httpClient.newCall(addSafetyOrdersRequest).execute()) {
if (!addSafetyOrdersResponse.isSuccessful()) {
if (addSafetyOrdersResponse.code() == 503 && retry) {
return addSafetyOrders(exchange, pair, amount,false);
}
throw new IOException("Unexpected code " + addSafetyOrdersResponse);
}
String addSafetyOrdersResponseBody = addSafetyOrdersResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(addSafetyOrdersResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Added $amount safety orders"}
return jsonObject;
}
}
public static JsonObject addQuote(String exchange, String pair, double amount, boolean retry) throws IOException {
String[] pairBaseAndQuote = pair.split("/");
String base = pairBaseAndQuote[0];
String quote = pairBaseAndQuote[1];
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("base", base);
formBuilder.add("quote", quote);
formBuilder.add("amount", String.valueOf(amount));
RequestBody formBody = formBuilder.build();
Request addQuoteRequest = new Request.Builder()
.url(API_BASE_URL + "/" + exchange + "/add_quote")
.header("X-API-KEY", API_KEY)
.post(formBody)
.build();
try (Response addQuoteResponse = httpClient.newCall(addQuoteRequest).execute()) {
if (!addQuoteResponse.isSuccessful()) {
if (addQuoteResponse.code() == 503 && retry) {
return addQuote(exchange, pair, amount,false);
}
throw new IOException("Unexpected code " + addQuoteResponse);
}
String addQuoteResponseBody = addQuoteResponse.body().string();
JsonElement jsonElement = JsonParser.parseString(addQuoteResponseBody);
if (!jsonElement.isJsonObject()) {
System.err.println("The parsed JSON response is not a JsonObject.");
return null;
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("Error")) {
System.err.println("The parsed JSON response contains Error");
return jsonObject;
}
//If no error, the response is {"Success":"Quote added successfully"}
return jsonObject;
}
}
public static void fetchWorkerStats(String exchange, String pair, Context context) {
new Thread(() -> {
try {
InstanceInterface.WorkerStatsData result = WorkerInterface.getWorkerDetails(exchange, pair, true);
new Handler(Looper.getMainLooper()).post(() -> WorkerInterface.showWorkerDetailsDialog(result, context));
} catch (IOException e) {
e.printStackTrace();
new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to fetch exchange config", Toast.LENGTH_SHORT).show());
}
}).start();
}
public static void showWorkerDetailsDialog(InstanceInterface.WorkerStatsData result, Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(result.getPair() + " status");
String isPausedExtraString = "";
if (result.getIsPaused()) {
isPausedExtraString = "Pause reason: " + result.getPauseReason() + "\n";
}
String oldLongExtraString = "";
if (result.getIsShort() && result.getOldLongDictionary()!=null) {
double oldTarget = result.getOldLongDictionary().getTpAmount() * result.getOldLongDictionary().getTpPrice();
double baseLeft = result.getOldLongDictionary().getTpAmount() - result.getBaseBought();
double minSwitchPrice = (oldTarget - result.getQuoteSpent()) / baseLeft;
oldLongExtraString = "\nOLD LONG:\n" +
"Switch date: " + result.getOldLongDictionary().getDatetime() + "\n" +
"Amount of base in the deal: " + result.getOldLongDictionary().getTpAmount() + "\n" +
"Take profit price: " + result.getOldLongDictionary().getTpPrice() + "\n" +
"Switch price: " + minSwitchPrice + "\n" +
"Quote spent: " + result.getOldLongDictionary().getQuoteSpent() + "\n" +
"Fees paid in quote: " + result.getOldLongDictionary().getFeesPaidInQuote();
}
builder.setMessage("Price: " + result.getPrice() + "\n" +
"Take profit price: " + result.getTakeProfitPrice() + "\n" +
"Next safety order price: " + result.getTakeProfitPrice() + "\n" +
"Take profit order ID: " + result.getTpOrderId() + "\n" +
"Safety order ID: " + result.getSoOrderId() + "\n" +
"Short: " + result.getIsShort() + "\n" +
"Boosted: " + result.getIsBoosted() + "\n" +
"Paused: " + result.getIsPaused() + "\n" + isPausedExtraString +
"Autoswitch: " + result.getAutoSwitchEnabled() + "\n" +
"Last call: " + result.getStopWhenProfit() + "\n" +
"Order size: " + result.getOrderSize() + "\n" +
"Quote in deal: " + result.getQuoteSpent() + "\n" +
"Base in deal: " + result.getBaseBought() + "\n" +
"Safety orders sent: " + (result.getSoAmount()-1) + "\n" +
"Max safety orders: " + result.getNumberOfSafetyOrders() + "\n" +
"Start time: " + result.getStartTime() + "\n" +
"Start price: " + result.getStartPrice() + "\n" +
"Deal start time: " + result.getDealStartTime() + "\n" +
"Deal uptime: " + result.getDealUptime() + "\n" +
"Total uptime: " + result.getTotalUptime() + "\n" +
"Fees paid in base: " + result.getFeesPaidInBase() + "\n" +
"Fees paid in quote: " + result.getFeesPaidInQuote() + "\n" +
"Partial profit: " + result.getPartialProfit() + "\n" +
oldLongExtraString);
builder.setPositiveButton("OK", null);
builder.show();
}
}