use of com.github.jnidzwetzki.bitfinex.v2.entity.APIException in project crypto-bot by jnidzwetzki.
the class PortfolioManager method calculatePositionSizes.
/**
* Calculate the position sizes
* @param entries
* @throws APIException
*/
@VisibleForTesting
public void calculatePositionSizes(final Map<BitfinexCurrencyPair, CurrencyEntry> entries) throws APIException {
final Wallet wallet = getWalletForCurrency("USD");
// Wallet could be empty
if (wallet == null) {
throw new APIException("Unable to find USD wallet");
}
final double capitalAvailable = getAvailablePortfolioValueInUSD() * getInvestmentRate();
double capitalNeeded = 0;
for (final BitfinexCurrencyPair currency : entries.keySet()) {
final CurrencyEntry entry = entries.get(currency);
final double positionSize = calculatePositionSize(entry);
entry.setPositionSize(positionSize);
capitalNeeded = capitalNeeded + (positionSize * entry.getEntryPrice());
}
// Need the n% risk per position more than the available capital
if (capitalNeeded > capitalAvailable) {
final double investmentCorrectionFactor = capitalAvailable / capitalNeeded;
logger.info("Needed capital {}, available capital {} ({})", capitalNeeded, capitalAvailable, investmentCorrectionFactor);
capitalNeeded = 0;
for (final BitfinexCurrencyPair currency : entries.keySet()) {
final CurrencyEntry entry = entries.get(currency);
final double newPositionSize = roundPositionSize(entry.getPositionSize() * investmentCorrectionFactor);
entry.setPositionSize(newPositionSize);
capitalNeeded = capitalNeeded + (entry.getPositionSize() * entry.getEntryPrice());
}
}
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.APIException in project crypto-bot by jnidzwetzki.
the class PortfolioManager method placeNewEntryOrders.
/**
* Place the new entry orders
* @param entries
* @throws APIException
* @throws InterruptedException
*/
private void placeNewEntryOrders(final Map<BitfinexCurrencyPair, CurrencyEntry> entries) throws APIException, InterruptedException {
// Check current limits and position sizes
for (final BitfinexCurrencyPair currency : entries.keySet()) {
final ExchangeOrder order = getOpenOrderForSymbol(currency.toBitfinexString());
final CurrencyEntry entry = entries.get(currency);
final double entryPrice = entry.getEntryPrice();
final double positionSize = entry.getPositionSize();
if (positionSize < currency.getMinimumOrderSize()) {
logger.info("Not placing order for {}, position size is too small {}", currency, positionSize);
continue;
}
// Old order present
if (order != null) {
if (hasEntryOrderChanged(order, entryPrice, positionSize)) {
logger.info("Entry order for {}, values changed (amount: {} / {}} (price: {} / {})", currency, order.getAmount(), positionSize, order.getPrice(), entryPrice);
cancelOrder(order);
} else {
logger.info("Not placing a new order for {}, old order still active", currency);
continue;
}
}
final BitfinexOrder newOrder = BitfinexOrderBuilder.create(currency, getOrderType(), positionSize).withPrice(entryPrice).setPostOnly().build();
placeOrder(newOrder);
}
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.APIException in project crypto-bot by jnidzwetzki.
the class TestCapitalAllocation method buildPortfolioManager.
/**
* Build the portfolio manager
* @return
* @throws APIException
*/
private PortfolioManager buildPortfolioManager() throws APIException {
final Collection<Wallet> wallets = new ArrayList<>();
wallets.add(new Wallet(Wallet.WALLET_TYPE_EXCHANGE, "USD", 1000, 0, 1000));
final BitfinexApiBroker apiBroker = Mockito.mock(BitfinexApiBroker.class);
final WalletManager walletManager = Mockito.mock(WalletManager.class);
Mockito.when(walletManager.getWallets()).thenReturn(wallets);
Mockito.when(apiBroker.getWalletManager()).thenReturn(walletManager);
return new BasePortfolioManager(apiBroker, 0.05);
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.APIException in project crypto-bot by jnidzwetzki.
the class TestCapitalAllocation method testCapitalAllocationExchangeMaxPositionLoss2.
@Test
public void testCapitalAllocationExchangeMaxPositionLoss2() throws APIException {
final PortfolioManager portfolioManager = buildPortfolioManager();
final Map<BitfinexCurrencyPair, CurrencyEntry> entries = new HashMap<>();
final CurrencyEntry entry1 = new CurrencyEntry(BitfinexCurrencyPair.BTC_USD, 1000, 0);
entries.put(BitfinexCurrencyPair.BTC_USD, entry1);
final CurrencyEntry entry2 = new CurrencyEntry(BitfinexCurrencyPair.IOT_USD, 1000, 990);
entries.put(BitfinexCurrencyPair.IOT_USD, entry2);
portfolioManager.calculatePositionSizes(entries);
// Max loss = 10, max capital allocation 50%
Assert.assertEquals(0.045, entry1.getPositionSize(), DELTA);
Assert.assertEquals(0.45, entry2.getPositionSize(), DELTA);
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.APIException in project crypto-bot by jnidzwetzki.
the class TestCapitalAllocation method testCapitalAllocationExchangeMaxPositionLoss3.
@Test
public void testCapitalAllocationExchangeMaxPositionLoss3() throws APIException {
final PortfolioManager portfolioManager = buildPortfolioManager();
final Map<BitfinexCurrencyPair, CurrencyEntry> entries = new HashMap<>();
final CurrencyEntry entry1 = new CurrencyEntry(BitfinexCurrencyPair.BTC_USD, 1000, 0);
entries.put(BitfinexCurrencyPair.BTC_USD, entry1);
final CurrencyEntry entry2 = new CurrencyEntry(BitfinexCurrencyPair.IOT_USD, 1000, 990);
entries.put(BitfinexCurrencyPair.IOT_USD, entry2);
final CurrencyEntry entry3 = new CurrencyEntry(BitfinexCurrencyPair.XRP_USD, 1000, 500);
entries.put(BitfinexCurrencyPair.XRP_USD, entry3);
portfolioManager.calculatePositionSizes(entries);
// Max loss = 10, max capital allocation 50%
Assert.assertEquals(0.045, entry1.getPositionSize(), DELTA);
Assert.assertEquals(0.45, entry2.getPositionSize(), DELTA);
Assert.assertEquals(0.09, entry3.getPositionSize(), DELTA);
}
Aggregations