Search in sources :

Example 1 with BitfinexApiBroker

use of com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker in project crypto-bot by jnidzwetzki.

the class BitfinexClientFactory method buildBifinexClient.

/**
 * Build a new bitfinex client
 * @return
 */
public static List<BitfinexApiBroker> buildBifinexClient() {
    final Properties prop = new Properties();
    final List<BitfinexApiBroker> resultList = new ArrayList<>();
    final ClassLoader classLoader = BitfinexClientFactory.class.getClassLoader();
    try (final InputStream input = classLoader.getResourceAsStream("auth.properties")) {
        if (input != null) {
            prop.load(input);
            final String apiConnectionsString = prop.getProperty("apiConnections");
            final int apiConnections = MathUtil.tryParseInt(apiConnectionsString, () -> "Invalid integer value: " + apiConnectionsString);
            for (int i = 0; i < apiConnections; i++) {
                final String apiKey = prop.getProperty("apiKey." + Integer.toString(i));
                final String apiSecret = prop.getProperty("apiSecret." + Integer.toString(i));
                if (apiKey == null || apiSecret == null) {
                    logger.warn("API key or secret are null ({})", i);
                } else {
                    logger.info("Building authenticated client");
                    final BitfinexApiBroker apiBroker = new BitfinexApiBroker(apiKey, apiSecret);
                    resultList.add(apiBroker);
                }
            }
            return resultList;
        }
    } catch (Exception e) {
        logger.error("Unable to load properties", e);
    }
    logger.error("Properties not found");
    return resultList;
}
Also used : BitfinexApiBroker(com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker) InputStream(java.io.InputStream) ArrayList(java.util.ArrayList) Properties(java.util.Properties)

Example 2 with BitfinexApiBroker

use of com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker in project crypto-bot by jnidzwetzki.

the class TestPersistence method testGetOpenTrades.

/**
 * Test get open trades from order manager
 */
@Test
public void testGetOpenTrades() {
    final BitfinexApiBroker apiBroker = Mockito.mock(BitfinexApiBroker.class);
    final PortfolioOrderManager ordermanager = new PortfolioOrderManager(apiBroker);
    Assert.assertTrue(ordermanager.getAllOpenTrades().isEmpty());
    final Trade trade = new Trade("ABC", TradeDirection.LONG, BitfinexCurrencyPair.BTC_USD, 1);
    trade.setTradeState(TradeState.CREATED);
    final Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save(trade);
    session.getTransaction().commit();
    Assert.assertTrue(ordermanager.getAllOpenTrades().isEmpty());
    session.beginTransaction();
    trade.setTradeState(TradeState.OPEN);
    session.saveOrUpdate(trade);
    session.getTransaction().commit();
    session.beginTransaction();
    Assert.assertEquals(1, ordermanager.getAllOpenTrades().size());
    session.getTransaction().commit();
    final Trade trade2 = new Trade("ABC", TradeDirection.LONG, BitfinexCurrencyPair.BTC_USD, 1);
    trade2.setTradeState(TradeState.OPEN);
    session.beginTransaction();
    session.save(trade2);
    session.getTransaction().commit();
    session.beginTransaction();
    Assert.assertEquals(2, ordermanager.getAllOpenTrades().size());
    session.getTransaction().commit();
    session.close();
}
Also used : Trade(com.github.jnidzwetzki.cryptobot.entity.Trade) BitfinexApiBroker(com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker) PortfolioOrderManager(com.github.jnidzwetzki.cryptobot.PortfolioOrderManager) Session(org.hibernate.Session) Test(org.junit.Test)

Example 3 with BitfinexApiBroker

use of com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker in project crypto-bot by jnidzwetzki.

the class DonchianBot method run.

@Override
public void run() {
    try {
        logger.info("===============================================");
        logger.info("Starting with {} API keys", apiBrokerList.size());
        logger.info("===============================================");
        for (final BitfinexApiBroker bitfinexApiBroker : apiBrokerList) {
            bitfinexApiBroker.connect();
        }
        final Map<BitfinexCandlestickSymbol, TimeSeries> historicalCandles = HistoricalCandlesHelper.requestHistoricalCandles(apiBrokerList.get(0), TIMEFRAME, tradedCurrencies);
        historicalCandles.forEach((k, v) -> timeSeries.put(k.getSymbol(), v));
        registerTicker();
        while (true) {
            if (tickerLatch != null) {
                tickerLatch.await();
            }
            executeSystem();
            tickerLatch = new CountDownLatch(tradedCurrencies.size());
        }
    } catch (Throwable e) {
        logger.error("Got exception", e);
    }
}
Also used : BitfinexApiBroker(com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker) TimeSeries(org.ta4j.core.TimeSeries) BitfinexCandlestickSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexCandlestickSymbol) CountDownLatch(java.util.concurrent.CountDownLatch)

Example 4 with BitfinexApiBroker

use of com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker in project crypto-bot by jnidzwetzki.

the class EMABot method registerTicker.

protected void registerTicker(final BitfinexApiBroker bitfinexApiBroker) throws InterruptedException, APIException {
    logger.info("Register ticker");
    for (final BitfinexCurrencyPair currency : tradedCurrencies) {
        tickMerger.put(currency, new BarMerger(currency, TIMEFRAME, (s, t) -> barDoneCallback(s, t)));
        final BitfinexTickerSymbol symbol = new BitfinexTickerSymbol(currency);
        bitfinexApiBroker.getQuoteManager().subscribeTicker(symbol);
        logger.info("Wait for ticker");
        while (!bitfinexApiBroker.isTickerActive(symbol)) {
            Thread.sleep(100);
        }
        bitfinexApiBroker.getQuoteManager().registerTickCallback(symbol, (s, c) -> handleTickCallback(s, c));
    }
}
Also used : TimeSeries(org.ta4j.core.TimeSeries) Arrays(java.util.Arrays) BitfinexTick(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexTick) Decimal(org.ta4j.core.Decimal) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) OrderType(org.ta4j.core.Order.OrderType) BitfinexCandlestickSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexCandlestickSymbol) EMAStrategy03(com.github.jnidzwetzki.cryptobot.strategy.EMAStrategy03) ArrayList(java.util.ArrayList) APIException(com.github.jnidzwetzki.bitfinex.v2.entity.APIException) BitfinexTickerSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexTickerSymbol) ExchangeOrder(com.github.jnidzwetzki.bitfinex.v2.entity.ExchangeOrder) QuoteManager(com.github.jnidzwetzki.bitfinex.v2.manager.QuoteManager) Map(java.util.Map) BitfinexClientFactory(com.github.jnidzwetzki.cryptobot.util.BitfinexClientFactory) Strategy(org.ta4j.core.Strategy) TradeState(com.github.jnidzwetzki.cryptobot.entity.TradeState) TradeStrategyFactory(com.github.jnidzwetzki.cryptobot.strategy.TradeStrategyFactory) BitfinexApiBroker(com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker) Logger(org.slf4j.Logger) TradeDirection(com.github.jnidzwetzki.cryptobot.entity.TradeDirection) Collectors(java.util.stream.Collectors) Timeframe(com.github.jnidzwetzki.bitfinex.v2.entity.Timeframe) Bar(org.ta4j.core.Bar) TimeUnit(java.util.concurrent.TimeUnit) BitfinexCurrencyPair(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCurrencyPair) List(java.util.List) Trade(com.github.jnidzwetzki.cryptobot.entity.Trade) BarMerger(com.github.jnidzwetzki.cryptobot.util.BarMerger) BarMerger(com.github.jnidzwetzki.cryptobot.util.BarMerger) BitfinexCurrencyPair(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCurrencyPair) BitfinexTickerSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexTickerSymbol)

Example 5 with BitfinexApiBroker

use of com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker in project crypto-bot by jnidzwetzki.

the class HistoricalCandlesHelper method requestHistoricalCandles.

/**
 * Request historical candles
 *
 * @param bitfinexApiBroker
 * @param timeframe
 * @param tradedCurrencies
 * @return
 * @throws InterruptedException
 * @throws APIException
 */
public static Map<BitfinexCandlestickSymbol, TimeSeries> requestHistoricalCandles(final BitfinexApiBroker bitfinexApiBroker, final Timeframe timeframe, final List<BitfinexCurrencyPair> tradedCurrencies) throws InterruptedException, APIException {
    logger.info("Request historical candles");
    final Map<BitfinexCandlestickSymbol, TimeSeries> timeSeries = new HashMap<>();
    for (final BitfinexCurrencyPair currency : tradedCurrencies) {
        final String bitfinexString = currency.toBitfinexString();
        final BaseTimeSeries currencyTimeSeries = new BaseTimeSeries(bitfinexString);
        final BitfinexCandlestickSymbol barSymbol = new BitfinexCandlestickSymbol(currency, timeframe);
        timeSeries.put(barSymbol, currencyTimeSeries);
        final CountDownLatch tickCountdown = new CountDownLatch(100);
        // Add bars to timeseries callback
        final BiConsumer<BitfinexCandlestickSymbol, BitfinexTick> callback = (channelSymbol, tick) -> {
            final TimeSeries timeSeriesToAdd = timeSeries.get(channelSymbol);
            final Bar bar = BarConverter.convertBitfinexTick(tick);
            try {
                timeSeriesToAdd.addBar(bar);
                tickCountdown.countDown();
            } catch (IllegalArgumentException e) {
                logger.error("Unable to add tick {} to time series, last tick is {}", bar, timeSeriesToAdd.getLastBar());
            }
        };
        bitfinexApiBroker.getQuoteManager().registerCandlestickCallback(barSymbol, callback);
        bitfinexApiBroker.getQuoteManager().subscribeCandles(barSymbol);
        // Wait for 100 bars or 10 seconds. All snapshot ticks are handled in
        // a synchronized block, so we receive the full snapshot even if we
        // call removeTickCallback.
        tickCountdown.await(10, TimeUnit.SECONDS);
        bitfinexApiBroker.getQuoteManager().registerCandlestickCallback(barSymbol, callback);
        bitfinexApiBroker.getQuoteManager().unsubscribeCandles(barSymbol);
        logger.info("Loaded ticks for symbol {} {}", bitfinexString, +timeSeries.get(barSymbol).getEndIndex());
    }
    return timeSeries;
}
Also used : TimeSeries(org.ta4j.core.TimeSeries) BitfinexApiBroker(com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker) BitfinexTick(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexTick) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) Timeframe(com.github.jnidzwetzki.bitfinex.v2.entity.Timeframe) BitfinexCandlestickSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexCandlestickSymbol) Bar(org.ta4j.core.Bar) APIException(com.github.jnidzwetzki.bitfinex.v2.entity.APIException) TimeUnit(java.util.concurrent.TimeUnit) BaseTimeSeries(org.ta4j.core.BaseTimeSeries) BitfinexCurrencyPair(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCurrencyPair) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) Map(java.util.Map) BiConsumer(java.util.function.BiConsumer) BarConverter(com.github.jnidzwetzki.cryptobot.util.BarConverter) TimeSeries(org.ta4j.core.TimeSeries) BaseTimeSeries(org.ta4j.core.BaseTimeSeries) BitfinexTick(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexTick) HashMap(java.util.HashMap) CountDownLatch(java.util.concurrent.CountDownLatch) Bar(org.ta4j.core.Bar) BitfinexCandlestickSymbol(com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexCandlestickSymbol) BaseTimeSeries(org.ta4j.core.BaseTimeSeries) BitfinexCurrencyPair(com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCurrencyPair)

Aggregations

BitfinexApiBroker (com.github.jnidzwetzki.bitfinex.v2.BitfinexApiBroker)46 Test (org.junit.Test)36 JSONArray (org.json.JSONArray)19 CountDownLatch (java.util.concurrent.CountDownLatch)18 APIException (com.github.jnidzwetzki.bitfinex.v2.entity.APIException)15 BitfinexCandlestickSymbol (com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexCandlestickSymbol)15 BitfinexTickerSymbol (com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexTickerSymbol)13 BitfinexCurrencyPair (com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCurrencyPair)12 QuoteManager (com.github.jnidzwetzki.bitfinex.v2.manager.QuoteManager)12 BitfinexTick (com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexTick)11 BitfinexExecutedTradeSymbol (com.github.jnidzwetzki.bitfinex.v2.entity.symbol.BitfinexExecutedTradeSymbol)11 OrderbookConfiguration (com.github.jnidzwetzki.bitfinex.v2.entity.OrderbookConfiguration)9 RawOrderbookConfiguration (com.github.jnidzwetzki.bitfinex.v2.entity.RawOrderbookConfiguration)9 Timeframe (com.github.jnidzwetzki.bitfinex.v2.entity.Timeframe)9 OrderManager (com.github.jnidzwetzki.bitfinex.v2.manager.OrderManager)9 ExecutorService (java.util.concurrent.ExecutorService)9 ExecutedTrade (com.github.jnidzwetzki.bitfinex.v2.entity.ExecutedTrade)7 RawOrderbookEntry (com.github.jnidzwetzki.bitfinex.v2.entity.RawOrderbookEntry)7 Assert (org.junit.Assert)7 ExchangeOrder (com.github.jnidzwetzki.bitfinex.v2.entity.ExchangeOrder)6