All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.objectlab.kit.fxcalc.FxRate Maven / Gradle / Ivy

package net.objectlab.kit.fxcalc;

import java.math.BigDecimal;
import java.util.Optional;

/**
 * Represents a read-only view on an FxRate.
 * @author Benoit Xhenseval
 */
public interface FxRate {
    /**
     * The CurrencyPair as in Ccy1/Ccy2 where the Bid will be the price for selling ccy1 and buying ccy2.
     */
    CurrencyPair getCurrencyPair();

    /**
     * This FxRate might come from a combination of 2 rates through a cross currency, if it is the case,
     * return the cross currency.
     */
    Optional getCrossCcy();

    /**
     * true if the CurrencyPair follows market convention, e.g. EUR/USD and not USD/EUR (but it gets more complicated for
     * other cross-currencies, eg CHF/JPY?)
     */
    boolean isMarketConvention();

    /**
     * The price at which the 'quoter' is willing to sell ccy1 and buy ccy2.
     */
    BigDecimal getBid();

    /**
     * Mid = (bid + ask) / 2
     */
    BigDecimal getMid();

    /**
     * The price at which the 'quoter' is willing to buy ccy1 and sell ccy2.
     */
    BigDecimal getAsk();

    /**
     * Useful for human readable display, returns the same value as Bid if FxRate is in market convention otherwise 1/ask.
     */
    BigDecimal getBidInMarketConvention();

    /**
     * Mid = (bid + ask) / 2
     */
    BigDecimal getMidInMarketConvention();

    /**
     * Useful for human readable display, returns the same value as Ask if FxRate is in market convention otherwise 1/bid.
     */
    BigDecimal getAskInMarketConvention();

    /**
     * Create the FX Rate for ccy2 / ccy1, return a new FxRate; the inverse of bid / ask are swapped around.
     */
    FxRate createInverse();

    /**
     * Create the FX Rate for ccy2 / ccy1, return a new FxRate with given precision; the inverse of bid / ask are swapped around.
     */
    FxRate createInverse(int precision);

    /**
     * Nice human readable description of the FX Rate, useful reminder.
     */
    String getDescription();

    /**
     * Given a monetary amount in the original currency, calculate the resulting amount in the other currency, using MID rate.
     * @param originalAmount the monetary amount (currency + amount)
     * @return depending on the originalAmount.currency, it will be amount / mid or amount * mid, rounded to 2 DP.
     * @throws IllegalArgumentException if the originalAmount.currency is not one of the currency pair.
     */
    CurrencyAmount convertAmountUsingMid(CurrencyAmount originalAmount);

    /**
     * Given a monetary amount in the original currency, calculate the resulting amount in the other currency, using BID or ASK
     * depending on the originalAmount.currency.
     * @param originalAmount the monetary amount (currency + amount)
     * @return depending on the originalAmount.currency, it will be amount / bid|ask or amount * bid|ask, rounded to 2 DP.
     * @throws IllegalArgumentException if the originalAmount.currency is not one of the currency pair.
     */
    CurrencyAmount convertAmountUsingBidOrAsk(CurrencyAmount originalAmount);

    /**
     * Calculates the amount to pay given an amount to buy, e.g. how much should you pay in Y if you are buying n X?
     * More explicitly, how many EURos should you pay to buy 1,000 USD?
     * Given EUR/USD rate, this would be 1,000 / bid.
     * @param amountToBuy amount you want to buy.
     * @return amount you have to pay in the other currency.
     */
    CurrencyAmount getPaymentAmountForBuying(CurrencyAmount amountToBuy);

    /**
     * Calculates the amount the seller would receive given an amount to sell, e.g. how many Y will you get if you are selling n X?
     * More explicitly, how many EURos should you get to sell 1,000 USD?
     * Given EUR/USD rate, this would be 1,000 / ask.
     * @param amountToSell amount you want to sell.
     * @return amount you will receive in the other currency.
     */
    CurrencyAmount getReceiptAmountForSelling(CurrencyAmount amountToSell);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy