use of com.github.jnidzwetzki.bitfinex.v2.entity.Position in project crypto-bot by jnidzwetzki.
the class PortfolioManager method cancelRemovedEntryOrders.
/**
* Cancel the removed entry orders
* Position is at the moment not interesting for an entry
*
* @param entries
* @throws APIException
* @throws InterruptedException
*/
private void cancelRemovedEntryOrders(final Map<BitfinexCurrencyPair, CurrencyEntry> entries) throws APIException, InterruptedException {
final List<ExchangeOrder> entryOrders = getAllOpenEntryOrders();
for (final ExchangeOrder order : entryOrders) {
final String symbol = order.getSymbol();
final BitfinexCurrencyPair currencyPair = BitfinexCurrencyPair.fromSymbolString(symbol);
if (!entries.containsKey(currencyPair)) {
logger.info("Entry order for {} is not contained, canceling", currencyPair);
cancelOrder(order);
}
}
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.Position in project bitfinex-v2-wss-api-java by jnidzwetzki.
the class BitfinexApiBroker method handleChannelDataArray.
/**
* Handle the channel data with has an array at first position
* @param jsonArray
* @param channelSymbol
* @throws APIException
*/
private void handleChannelDataArray(final JSONArray jsonArray, final BitfinexStreamSymbol channelSymbol) throws APIException {
final JSONArray subarray = jsonArray.getJSONArray(1);
if (channelSymbol instanceof BitfinexCandlestickSymbol) {
final ChannelCallbackHandler handler = new CandlestickHandler();
handler.handleChannelData(this, channelSymbol, subarray);
} else if (channelSymbol instanceof RawOrderbookConfiguration) {
final RawOrderbookHandler handler = new RawOrderbookHandler();
handler.handleChannelData(this, channelSymbol, subarray);
} else if (channelSymbol instanceof OrderbookConfiguration) {
final OrderbookHandler handler = new OrderbookHandler();
handler.handleChannelData(this, channelSymbol, subarray);
} else if (channelSymbol instanceof BitfinexTickerSymbol) {
final ChannelCallbackHandler handler = new TickHandler();
handler.handleChannelData(this, channelSymbol, subarray);
} else if (channelSymbol instanceof BitfinexExecutedTradeSymbol) {
final ChannelCallbackHandler handler = new ExecutedTradeHandler();
handler.handleChannelData(this, channelSymbol, subarray);
} else {
logger.error("Unknown stream type: {}", channelSymbol);
}
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.Position in project crypto-bot by jnidzwetzki.
the class MarginPortfolioManager method getOpenPositionSizeForCurrency.
/**
* Get the position size for the symbol
* @param symbol
* @return
* @throws APIException
*/
@Override
protected double getOpenPositionSizeForCurrency(final String currency) throws APIException {
final List<Position> positions = bitfinexApiBroker.getPositionManager().getPositions();
final Position position = positions.stream().filter(p -> p.getCurreny().getCurrency1().equals(currency)).findAny().orElse(null);
if (position == null) {
return 0;
}
return position.getAmount();
}
use of com.github.jnidzwetzki.bitfinex.v2.entity.Position 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.Position 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);
}
}
Aggregations