726 lines
36 KiB
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+""e="+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();
|
|
}
|
|
|
|
}
|
|
|
|
|