From 25f12c8232ae711e0c7e1eff93db846ca0bc49b8 Mon Sep 17 00:00:00 2001 From: ghubstan <36207203+ghubstan@users.noreply.github.com> Date: Sat, 25 Jun 2022 11:45:35 -0300 Subject: [PATCH 1/2] Improve take offer criteria summary text --- .../bots/TakeBestPricedOfferToBuyBsq.java | 19 ++++++++++++------ .../bots/TakeBestPricedOfferToBuyBtc.java | 19 ++++++++++++------ .../bots/TakeBestPricedOfferToSellBsq.java | 20 ++++++++++++------- .../bots/TakeBestPricedOfferToSellBtc.java | 19 ++++++++++++------ .../TakeBestPricedOfferToBuyBtc.properties | 6 +++--- 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBsq.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBsq.java index e7079ce..f28cfa3 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBsq.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBsq.java @@ -307,12 +307,19 @@ public class TakeBestPricedOfferToBuyBsq extends AbstractBot { } void printCriteriaSummary() { - log.info("Looking for offers to {}, with a fixed-price at or greater than" - + " {}% {} the 30-day average BSQ trade price of {} BTC.", - MARKET_DESCRIPTION, - minMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". - aboveOrBelowMarketPrice.apply(minMarketPriceMargin), - avgBsqPrice); + if (isZero.test(minMarketPriceMargin)) { + log.info("Looking for offers to {}, with a fixed-price at or greater than" + + " the 30-day average BSQ trade price of {} BTC.", + MARKET_DESCRIPTION, + avgBsqPrice); + } else { + log.info("Looking for offers to {}, with a fixed-price at or greater than" + + " {}% {} the 30-day average BSQ trade price of {} BTC.", + MARKET_DESCRIPTION, + minMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". + aboveOrBelowMarketPrice.apply(minMarketPriceMargin), + avgBsqPrice); + } } void printOffersAgainstCriteria(List offers) { diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java index db81b77..31b2f93 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java @@ -382,12 +382,19 @@ public class TakeBestPricedOfferToBuyBtc extends AbstractBot { } void printCriteriaSummary() { - log.info("Looking for offers to {}, priced at or more than {}% {} the current market price {} {}.", - marketDescription.get(), - minMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". - aboveOrBelowMarketPrice.apply(minMarketPriceMargin), - currentMarketPrice, - isXmr.test(currencyCode) ? "BTC" : currencyCode); + if (isZero.test(minMarketPriceMargin)) { + log.info("Looking for offers to {}, priced at or higher than the current market price {} {}.", + marketDescription.get(), + currentMarketPrice, + isXmr.test(currencyCode) ? "BTC" : currencyCode); + } else { + log.info("Looking for offers to {}, priced at or more than {}% {} from the current market price {} {}.", + marketDescription.get(), + minMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". + aboveOrBelowMarketPrice.apply(minMarketPriceMargin), + currentMarketPrice, + isXmr.test(currencyCode) ? "BTC" : currencyCode); + } } void printOffersAgainstCriteria(List offers) { diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBsq.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBsq.java index 2919d7e..15a8ec7 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBsq.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBsq.java @@ -308,15 +308,21 @@ public class TakeBestPricedOfferToSellBsq extends AbstractBot { } void printCriteriaSummary() { - log.info("Looking for offers to {}, with a fixed-price at or less than" - + " {}% {} the 30-day average BSQ trade price of {} BTC.", - MARKET_DESCRIPTION, - maxMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". - aboveOrBelowMarketPrice.apply(maxMarketPriceMargin), - avgBsqPrice); + if (isZero.test(maxMarketPriceMargin)) { + log.info("Looking for offers to {}, with a fixed-price at or less than" + + " the 30-day average BSQ trade price of {} BTC.", + MARKET_DESCRIPTION, + avgBsqPrice); + } else { + log.info("Looking for offers to {}, with a fixed-price at or less than" + + " {}% {} the 30-day average BSQ trade price of {} BTC.", + MARKET_DESCRIPTION, + maxMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". + aboveOrBelowMarketPrice.apply(maxMarketPriceMargin), + avgBsqPrice); + } } - void printOffersAgainstCriteria(List offers) { log.info("Currently available {} offers -- want to take BSQ swap offer with fixed-price <= {} BTC.", MARKET_DESCRIPTION, diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java index 20c235b..48e2454 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java @@ -382,12 +382,19 @@ public class TakeBestPricedOfferToSellBtc extends AbstractBot { } void printCriteriaSummary() { - log.info("Looking for offers to {}, priced at or less than {}% {} the current market price {} {}.", - marketDescription.get(), - maxMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". - aboveOrBelowMarketPrice.apply(maxMarketPriceMargin), - currentMarketPrice, - isXmr.test(currencyCode) ? "BTC" : currencyCode); + if (isZero.test(maxMarketPriceMargin)) { + log.info("Looking for offers to {}, priced at or lower than the current market price {} {}.", + marketDescription.get(), + currentMarketPrice, + isXmr.test(currencyCode) ? "BTC" : currencyCode); + } else { + log.info("Looking for offers to {}, priced at or less than {}% {} from the current market price {} {}.", + marketDescription.get(), + maxMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". + aboveOrBelowMarketPrice.apply(maxMarketPriceMargin), + currentMarketPrice, + isXmr.test(currencyCode) ? "BTC" : currencyCode); + } } void printOffersAgainstCriteria(List offers) { diff --git a/java-examples/src/main/resources/TakeBestPricedOfferToBuyBtc.properties b/java-examples/src/main/resources/TakeBestPricedOfferToBuyBtc.properties index 0f92400..8a7c941 100644 --- a/java-examples/src/main/resources/TakeBestPricedOfferToBuyBtc.properties +++ b/java-examples/src/main/resources/TakeBestPricedOfferToBuyBtc.properties @@ -1,13 +1,13 @@ # # Maximum # of offers to take during one bot session. When reached, bot will shut down API daemon then itself. -maxTakeOffers=10 +maxTakeOffers=1 # # Taker bot's payment account id. Only BUY BTC offers using the same payment method will be considered for taking. -paymentAccountId=9ad3cc7a-7d32-453c-b9db-a3714b5b8f61 +paymentAccountId=28030c83-f07d-4f0b-b824-019529279630 # # Taker bot's min market price margin. A candidate BUY BTC offer's price margin must be >= minMarketPriceMargin. # -minMarketPriceMargin=1.00 +minMarketPriceMargin=0 # # Taker bot's min BTC amount to sell. The candidate BUY offer's amount must be >= minAmount BTC. minAmount=0.01 From bf876a977118d86d2d78813de5a4e17a326b58ea Mon Sep 17 00:00:00 2001 From: ghubstan <36207203+ghubstan@users.noreply.github.com> Date: Sat, 25 Jun 2022 12:25:50 -0300 Subject: [PATCH 2/2] Fix 'is margin price >= target price' filter, and some typos --- .../src/main/java/bisq/bots/BotUtils.java | 11 ++++++----- .../bisq/bots/TakeBestPricedOfferToBuyBtc.java | 16 ++++++++-------- .../bisq/bots/TakeBestPricedOfferToSellBtc.java | 4 ++-- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/java-examples/src/main/java/bisq/bots/BotUtils.java b/java-examples/src/main/java/bisq/bots/BotUtils.java index 98ae329..89d43af 100644 --- a/java-examples/src/main/java/bisq/bots/BotUtils.java +++ b/java-examples/src/main/java/bisq/bots/BotUtils.java @@ -72,7 +72,7 @@ public class BotUtils { public static BigDecimal calcTargetPrice(BigDecimal targetMarketPriceMargin, BigDecimal currentMarketPrice, String currencyCode) { - if (!isZero.test(targetMarketPriceMargin) && targetMarketPriceMargin.precision() <= 2) + if (!isZero.test(targetMarketPriceMargin) && targetMarketPriceMargin.precision() < 2) throw new IllegalArgumentException( format("Price margin percent literal argument %s is invalid;" + " it must have a precision of at least 2 decimal places.", @@ -133,12 +133,13 @@ public class BotUtils { return diff.subtract(factor); }; + /** - * Return true if the margin price based offer's market price margin (%) >= minMarketPriceMargin (%). + * Return true if the offer's margin based price >= target price. */ - public static final BiPredicate isMarginGEMinMarketPriceMargin = - (offer, minMarketPriceMargin) -> offer.getUseMarketBasedPrice() - && offer.getMarketPriceMarginPct() >= minMarketPriceMargin.doubleValue(); + public static final BiPredicate isMarginBasedPriceGETargetPrice = + (offer, targetPrice) -> offer.getUseMarketBasedPrice() + && new BigDecimal(offer.getPrice()).compareTo(targetPrice) >= 0; /** * Return true if the margin price based offer's market price margin (%) <= maxMarketPriceMargin (%). diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java index 31b2f93..030c9ae 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToBuyBtc.java @@ -37,7 +37,7 @@ import static protobuf.OfferDirection.SELL; /** * The TakeBestPricedOfferToBuyBtc bot waits for attractively priced BUY BTC offers to appear, takes the offers - * (up to a maximum of configured {@link #maxTakeOffers}, then shuts down both the API daemon and itself (the bot), + * (up to a maximum of configured {@link #maxTakeOffers}), then shuts down both the API daemon and itself (the bot), * to allow the user to start the desktop UI application and complete the trades. *

* The benefit this bot provides is freeing up the user time spent watching the offer book in the UI, waiting for the @@ -368,14 +368,14 @@ public class TakeBestPricedOfferToBuyBtc extends AbstractBot { return offers.stream() .filter(o -> usesSamePaymentMethod.test(o, getPaymentAccount())) .filter(isMakerPreferredTradingPeer) - .filter(o -> isMarginGEMinMarketPriceMargin.test(o, minMarketPriceMargin) + .filter(o -> isMarginBasedPriceGETargetPrice.test(o, targetPrice) || isFixedPriceGEMinMarketPriceMargin.test(o, currentMarketPrice)) .filter(isWithinBTCAmountBounds) .findFirst(); else return offers.stream() .filter(o -> usesSamePaymentMethod.test(o, getPaymentAccount())) - .filter(o -> isMarginGEMinMarketPriceMargin.test(o, minMarketPriceMargin) + .filter(o -> isMarginBasedPriceGETargetPrice.test(o, targetPrice) || isFixedPriceGEMinMarketPriceMargin.test(o, currentMarketPrice)) .filter(isWithinBTCAmountBounds) .findFirst(); @@ -388,7 +388,7 @@ public class TakeBestPricedOfferToBuyBtc extends AbstractBot { currentMarketPrice, isXmr.test(currencyCode) ? "BTC" : currencyCode); } else { - log.info("Looking for offers to {}, priced at or more than {}% {} from the current market price {} {}.", + log.info("Looking for offers to {}, priced at or more than {}% {} the current market price {} {}.", marketDescription.get(), minMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". aboveOrBelowMarketPrice.apply(minMarketPriceMargin), @@ -419,12 +419,12 @@ public class TakeBestPricedOfferToBuyBtc extends AbstractBot { iHavePreferredTradingPeers.get() ? isMakerPreferredTradingPeer.test(offer) ? "YES" : "NO" : "N/A"); - var marginPriceLabel = format("Is offer's price margin (%s%%) >= bot's min market price margin (%s%%)?", - offer.getMarketPriceMarginPct(), - minMarketPriceMargin); + var marginPriceLabel = format("Is offer's margin based price (%s) >= bot's target price (%s)?", + offer.getUseMarketBasedPrice() ? offer.getPrice() : "N/A", + offer.getUseMarketBasedPrice() ? targetPrice : "N/A"); filterResultsByLabel.put(marginPriceLabel, offer.getUseMarketBasedPrice() - ? isMarginGEMinMarketPriceMargin.test(offer, minMarketPriceMargin) + ? isMarginBasedPriceGETargetPrice.test(offer, targetPrice) : "N/A"); var fixedPriceLabel = format("Is offer's fixed-price (%s) >= bot's target price (%s)?", offer.getUseMarketBasedPrice() ? "N/A" : offer.getPrice() + " " + currencyCode, diff --git a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java index 48e2454..c34a5ec 100644 --- a/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java +++ b/java-examples/src/main/java/bisq/bots/TakeBestPricedOfferToSellBtc.java @@ -37,7 +37,7 @@ import static protobuf.OfferDirection.SELL; /** * The TakeBestPricedOfferToSellBtc bot waits for attractively priced SELL BTC offers to appear, takes the offers - * (up to a maximum of configured {@link #maxTakeOffers}, then shuts down both the API daemon and itself (the bot), + * (up to a maximum of configured {@link #maxTakeOffers}), then shuts down both the API daemon and itself (the bot), * to allow the user to start the desktop UI application and complete the trades. *

* The benefit this bot provides is freeing up the user time spent watching the offer book in the UI, waiting for the @@ -388,7 +388,7 @@ public class TakeBestPricedOfferToSellBtc extends AbstractBot { currentMarketPrice, isXmr.test(currencyCode) ? "BTC" : currencyCode); } else { - log.info("Looking for offers to {}, priced at or less than {}% {} from the current market price {} {}.", + log.info("Looking for offers to {}, priced at or less than {}% {} the current market price {} {}.", marketDescription.get(), maxMarketPriceMargin.abs(), // Hide the sign, text explains target price % "above or below". aboveOrBelowMarketPrice.apply(maxMarketPriceMargin),