Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/github.com/knowm/XChange/d…
Browse files Browse the repository at this point in the history
…evelop' into PR/bybit-ws-orders

# Conflicts:
#	xchange-stream-coinbasepro/src/main/java/info/bitrich/xchangestream/coinbasepro/CoinbaseProStreamingExchange.java
  • Loading branch information
rizer1980 committed May 29, 2024
2 parents 91ade97 + 8dad542 commit c7390fe
Show file tree
Hide file tree
Showing 67 changed files with 675 additions and 779 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.knowm.xchange.bibox.service;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.knowm.xchange.Exchange;
Expand All @@ -11,12 +10,10 @@
import org.knowm.xchange.dto.account.AccountInfo;
import org.knowm.xchange.dto.account.FundingRecord;
import org.knowm.xchange.dto.account.FundingRecord.Type;
import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException;
import org.knowm.xchange.service.account.AccountService;
import org.knowm.xchange.service.trade.params.HistoryParamsFundingType;
import org.knowm.xchange.service.trade.params.TradeHistoryParamCurrency;
import org.knowm.xchange.service.trade.params.TradeHistoryParams;
import org.knowm.xchange.service.trade.params.WithdrawFundsParams;

/**
* @author odrotleff
Expand All @@ -33,19 +30,6 @@ public AccountInfo getAccountInfo() throws IOException {
return BiboxAdapters.adaptAccountInfo(getBiboxAccountInfo());
}

@Override
public String withdrawFunds(Currency currency, BigDecimal amount, String address)
throws IOException {
throw new NotYetImplementedForExchangeException(
"This operation is not yet implemented for this exchange");
}

@Override
public String withdrawFunds(WithdrawFundsParams params) throws IOException {
throw new NotYetImplementedForExchangeException(
"This operation is not yet implemented for this exchange");
}

@Override
public String requestDepositAddress(Currency currency, String... args) throws IOException {
return requestBiboxDepositAddress(currency);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.dto.trade.MarketOrder;
import org.knowm.xchange.dto.trade.OpenOrders;
import org.knowm.xchange.dto.trade.StopOrder;
import org.knowm.xchange.dto.trade.UserTrades;
import org.knowm.xchange.exceptions.ExchangeException;
import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException;
import org.knowm.xchange.service.trade.TradeService;
import org.knowm.xchange.service.trade.params.CancelOrderByIdParams;
import org.knowm.xchange.service.trade.params.CancelOrderParams;
Expand Down Expand Up @@ -71,21 +69,4 @@ public UserTrades getTradeHistory(TradeHistoryParams params) throws IOException
return BiboxAdapters.adaptUserTrades(getBiboxOrderHistory());
}

@Override
public TradeHistoryParams createTradeHistoryParams() {
throw new NotYetImplementedForExchangeException(
"This operation is not yet implemented for this exchange");
}

@Override
public OpenOrdersParams createOpenOrdersParams() {
throw new NotYetImplementedForExchangeException(
"This operation is not yet implemented for this exchange");
}

@Override
public String placeStopOrder(StopOrder arg0) throws IOException {
throw new NotYetImplementedForExchangeException(
"This operation is not yet implemented for this exchange");
}
}
1 change: 1 addition & 0 deletions xchange-binance/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
http-client.private.env.json
11 changes: 11 additions & 0 deletions xchange-binance/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Using IntelliJ Idea HTTP client

There are *.http files stored in `src/test/resources/rest` that can be used with IntelliJ Idea HTTP Client.

Some requests need authorization, so the api credentials have to be stored in `http-client.private.env.json` in module's root. Sample content can be found in `example.http-client.private.env.json`

> [!CAUTION]
> Never commit your api credentials to the repository!

[HTTP Client documentation](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html)
6 changes: 6 additions & 0 deletions xchange-binance/example.http-client.private.env.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"default": {
"api_key": "replace_me",
"api_secret": "replace_me"
}
}
6 changes: 6 additions & 0 deletions xchange-binance/http-client.env.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"default": {
"api_host": "https://api.binance.com",
"data_api_host": "https://data-api.binance.vision"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,13 @@
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.knowm.xchange.binance.dto.account.AssetDetail;
Expand All @@ -18,7 +23,7 @@
import org.knowm.xchange.binance.dto.marketdata.BinanceAggTrades;
import org.knowm.xchange.binance.dto.marketdata.BinanceFundingRate;
import org.knowm.xchange.binance.dto.marketdata.BinanceKline;
import org.knowm.xchange.binance.dto.marketdata.BinancePriceQuantity;
import org.knowm.xchange.binance.dto.marketdata.BinanceTicker24h;
import org.knowm.xchange.binance.dto.meta.exchangeinfo.BinanceExchangeInfo;
import org.knowm.xchange.binance.dto.meta.exchangeinfo.Filter;
import org.knowm.xchange.binance.dto.meta.exchangeinfo.Symbol;
Expand All @@ -36,18 +41,32 @@
import org.knowm.xchange.dto.account.Balance;
import org.knowm.xchange.dto.account.OpenPosition;
import org.knowm.xchange.dto.account.Wallet;
import org.knowm.xchange.dto.marketdata.*;
import org.knowm.xchange.dto.marketdata.CandleStick;
import org.knowm.xchange.dto.marketdata.CandleStickData;
import org.knowm.xchange.dto.marketdata.FundingRate;
import org.knowm.xchange.dto.marketdata.FundingRates;
import org.knowm.xchange.dto.marketdata.Ticker;
import org.knowm.xchange.dto.marketdata.Trade;
import org.knowm.xchange.dto.marketdata.Trades;
import org.knowm.xchange.dto.meta.CurrencyMetaData;
import org.knowm.xchange.dto.meta.ExchangeMetaData;
import org.knowm.xchange.dto.meta.InstrumentMetaData;
import org.knowm.xchange.dto.meta.WalletHealth;
import org.knowm.xchange.dto.trade.*;
import org.knowm.xchange.dto.trade.LimitOrder;
import org.knowm.xchange.dto.trade.MarketOrder;
import org.knowm.xchange.dto.trade.OpenOrders;
import org.knowm.xchange.dto.trade.StopOrder;
import org.knowm.xchange.dto.trade.UserTrade;
import org.knowm.xchange.dto.trade.UserTrades;
import org.knowm.xchange.instrument.Instrument;

public class BinanceAdapters {
private static final DateTimeFormatter DATE_TIME_FMT =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

private static final Map<String, CurrencyPair> SYMBOL_TO_CURRENCY_PAIR = new HashMap<>();


private BinanceAdapters() {}

/**
Expand Down Expand Up @@ -134,17 +153,6 @@ public static OrderSide convert(OrderType type) {
}
}

public static CurrencyPair convert(String symbol) {
// Iterate by base currency priority at binance.
for (Currency base : Arrays.asList(Currency.BTC, Currency.ETH, Currency.BNB, Currency.USDT)) {
if (symbol.contains(base.toString())) {
String counter = symbol.replace(base.toString(), "");
return new CurrencyPair(base, new Currency(counter));
}
}
throw new IllegalArgumentException("Could not parse currency pair from '" + symbol + "'");
}

public static long id(String id) {
try {
return Long.parseLong(id);
Expand Down Expand Up @@ -178,23 +186,19 @@ public static OrderType convertType(boolean isBuyer) {
return isBuyer ? OrderType.BID : OrderType.ASK;
}


public static void putSymbolMapping(String symbol, CurrencyPair currencyPair) {
SYMBOL_TO_CURRENCY_PAIR.put(symbol, currencyPair);
}


public static CurrencyPair toCurrencyPair(String symbol) {
return SYMBOL_TO_CURRENCY_PAIR.get(symbol);
}


public static Instrument adaptSymbol(String symbol, boolean isFuture) {
int pairLength = symbol.length();
CurrencyPair currencyPair;
if (symbol.endsWith("USDT")) {
currencyPair = new CurrencyPair(symbol.substring(0, pairLength - 4), "USDT");
} else if (symbol.endsWith("USDC")) {
currencyPair = new CurrencyPair(symbol.substring(0, pairLength - 4), "USDC");
} else if (symbol.endsWith("TUSD")) {
currencyPair = new CurrencyPair(symbol.substring(0, pairLength - 4), "TUSD");
} else if (symbol.endsWith("USDS")) {
currencyPair = new CurrencyPair(symbol.substring(0, pairLength - 4), "USDS");
} else if (symbol.endsWith("BUSD")) {
currencyPair = new CurrencyPair(symbol.substring(0, pairLength - 4), "BUSD");
} else {
currencyPair =
new CurrencyPair(symbol.substring(0, pairLength - 3), symbol.substring(pairLength - 3));
}
CurrencyPair currencyPair = toCurrencyPair(symbol);

return (isFuture) ? new FuturesContract(currencyPair, "PERP") : currencyPair;
}
Expand Down Expand Up @@ -243,22 +247,28 @@ public static Order adaptOrder(BinanceOrder order, boolean isFuture) {
return builder.build();
}

private static Ticker adaptPriceQuantity(BinancePriceQuantity priceQuantity, boolean isFuture) {

public static Ticker toTicker(BinanceTicker24h binanceTicker24h, boolean isFuture) {
Instrument instrument = (isFuture) ? new FuturesContract(binanceTicker24h.getCurrencyPair(), "PERP"): binanceTicker24h.getCurrencyPair();
return new Ticker.Builder()
.instrument(adaptSymbol(priceQuantity.symbol, isFuture))
.ask(priceQuantity.askPrice)
.askSize(priceQuantity.askQty)
.bid(priceQuantity.bidPrice)
.bidSize(priceQuantity.bidQty)
.instrument(instrument)
.open(binanceTicker24h.getOpenPrice())
.ask(binanceTicker24h.getAskPrice())
.bid(binanceTicker24h.getBidPrice())
.last(binanceTicker24h.getLastPrice())
.high(binanceTicker24h.getHighPrice())
.low(binanceTicker24h.getLowPrice())
.volume(binanceTicker24h.getVolume())
.vwap(binanceTicker24h.getWeightedAvgPrice())
.askSize(binanceTicker24h.getAskQty())
.bidSize(binanceTicker24h.getBidQty())
.quoteVolume(binanceTicker24h.getQuoteVolume())
.timestamp(
binanceTicker24h.getCloseTime() > 0 ? new Date(binanceTicker24h.getCloseTime()) : null)
.percentageChange(binanceTicker24h.getPriceChangePercent())
.build();
}

public static List<Ticker> adaptPriceQuantities(
List<BinancePriceQuantity> priceQuantities, boolean isFuture) {
return priceQuantities.stream()
.map(binancePriceQuantity -> adaptPriceQuantity(binancePriceQuantity, isFuture))
.collect(Collectors.toList());
}

static CurrencyMetaData adaptCurrencyMetaData(
Map<Currency, CurrencyMetaData> currencies,
Expand Down Expand Up @@ -462,7 +472,7 @@ public static CandleStickData adaptBinanceCandleStickData(

public static void adaptFutureExchangeMetaData(
ExchangeMetaData exchangeMetaData, BinanceExchangeInfo binanceExchangeInfo) {
Symbol[] futureSymbols = binanceExchangeInfo.getSymbols();
List<Symbol> futureSymbols = binanceExchangeInfo.getSymbols();

for (Symbol futureSymbol : futureSymbols) {
if (futureSymbol.getStatus().equals("TRADING")) { // Symbols which are trading
Expand Down Expand Up @@ -527,7 +537,7 @@ public static ExchangeMetaData adaptExchangeMetaData(
Map<Instrument, InstrumentMetaData> instruments = new HashMap<>();
Map<Currency, CurrencyMetaData> currencies = new HashMap<>();

Symbol[] symbols = binanceExchangeInfo.getSymbols();
List<Symbol> symbols = binanceExchangeInfo.getSymbols();

for (Symbol symbol : symbols) {
if (symbol.getStatus().equals("TRADING")) { // Symbols which are trading
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@
import java.util.List;
import java.util.Map;
import org.knowm.xchange.binance.dto.BinanceException;
import org.knowm.xchange.binance.dto.account.*;
import org.knowm.xchange.binance.dto.account.AssetDetail;
import org.knowm.xchange.binance.dto.account.AssetDividendResponse;
import org.knowm.xchange.binance.dto.account.BinanceAccountInformation;
import org.knowm.xchange.binance.dto.account.BinanceCurrencyInfo;
import org.knowm.xchange.binance.dto.account.BinanceDeposit;
import org.knowm.xchange.binance.dto.account.BinanceWithdraw;
import org.knowm.xchange.binance.dto.account.DepositAddress;
import org.knowm.xchange.binance.dto.account.TransferHistory;
import org.knowm.xchange.binance.dto.account.TransferSubUserHistory;
import org.knowm.xchange.binance.dto.account.WithdrawResponse;
import org.knowm.xchange.binance.dto.trade.BinanceCancelledOrder;
import org.knowm.xchange.binance.dto.trade.BinanceDustLog;
import org.knowm.xchange.binance.dto.trade.BinanceListenKey;
Expand Down Expand Up @@ -329,6 +338,17 @@ BinanceDustLog getDustLog(
@QueryParam(SIGNATURE) ParamsDigest signature)
throws IOException, BinanceException;


@GET
@Path("/sapi/v1/capital/config/getall")
List<BinanceCurrencyInfo> getCurrencyInfos(
@QueryParam("recvWindow") Long recvWindow,
@QueryParam("timestamp") SynchronizedValueFactory<Long> timestamp,
@HeaderParam(X_MBX_APIKEY) String apiKey,
@QueryParam(SIGNATURE) ParamsDigest signature)
throws IOException, BinanceException;


/**
* Submit a withdraw request.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@
import static org.knowm.xchange.binance.dto.ExchangeType.SPOT;

import java.util.Map;
import org.apache.commons.lang3.ObjectUtils;
import org.knowm.xchange.BaseExchange;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.ExchangeSpecification;
import org.knowm.xchange.binance.dto.ExchangeType;
import org.knowm.xchange.binance.dto.account.AssetDetail;
import org.knowm.xchange.binance.dto.meta.exchangeinfo.BinanceExchangeInfo;
import org.knowm.xchange.binance.service.BinanceAccountService;
import org.knowm.xchange.binance.service.BinanceMarketDataService;
import org.knowm.xchange.binance.service.BinanceMarketDataServiceRaw;
import org.knowm.xchange.binance.service.BinanceTradeService;
import org.knowm.xchange.client.ExchangeRestProxyBuilder;
import org.knowm.xchange.client.ResilienceRegistries;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.exceptions.ExchangeException;
import org.knowm.xchange.utils.AuthUtils;
import si.mazi.rescu.SynchronizedValueFactory;
Expand Down Expand Up @@ -100,34 +103,32 @@ public boolean usingSandbox() {
@Override
public void remoteInit() {
try {
BinanceMarketDataService marketDataService =
(BinanceMarketDataService) this.marketDataService;
BinanceMarketDataServiceRaw marketDataServiceRaw = (BinanceMarketDataServiceRaw) marketDataService;
BinanceAccountService accountService = (BinanceAccountService) getAccountService();
Map<String, AssetDetail> assetDetailMap = null;
if (!usingSandbox() && isAuthenticated()) {
assetDetailMap = accountService.getAssetDetails(); // not available in sndbox
}
//hook for Binance US
if(exchangeSpecification.getExchangeSpecificParametersItem(EXCHANGE_TYPE) ==null) {
exchangeMetaData =
BinanceAdapters.adaptExchangeMetaData(
marketDataService.getExchangeInfo(), assetDetailMap);
} else {
switch ((ExchangeType) exchangeSpecification.getExchangeSpecificParametersItem(
EXCHANGE_TYPE)) {
case SPOT: {
exchangeMetaData =
BinanceAdapters.adaptExchangeMetaData(
marketDataService.getExchangeInfo(), assetDetailMap);
break;
}
case FUTURES: {
BinanceAdapters.adaptFutureExchangeMetaData(
exchangeMetaData, marketDataService.getFutureExchangeInfo());
break;
}
}

BinanceExchangeInfo exchangeInfo;
// get exchange type or SPOT as default
ExchangeType exchangeType = (ExchangeType) ObjectUtils.defaultIfNull(exchangeSpecification.getExchangeSpecificParametersItem(EXCHANGE_TYPE), SPOT);

switch (exchangeType) {
case FUTURES:
exchangeInfo = marketDataServiceRaw.getFutureExchangeInfo();
BinanceAdapters.adaptFutureExchangeMetaData(exchangeMetaData, exchangeInfo);
break;
default:
exchangeInfo = marketDataServiceRaw.getExchangeInfo();
exchangeMetaData = BinanceAdapters.adaptExchangeMetaData(exchangeInfo, assetDetailMap);
}

// init symbol mappings
exchangeInfo.getSymbols().stream()
.filter(symbol -> ObjectUtils.allNotNull(symbol.getBaseAsset(), symbol.getQuoteAsset(), symbol.getSymbol()))
.forEach(symbol -> BinanceAdapters.putSymbolMapping(symbol.getSymbol(), new CurrencyPair(symbol.getBaseAsset(), symbol.getQuoteAsset())));

} catch (Exception e) {
throw new ExchangeException("Failed to initialize: " + e.getMessage(), e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.knowm.xchange.binance;

import static org.knowm.xchange.binance.dto.ExchangeType.SPOT;

import java.io.IOException;
import org.knowm.xchange.ExchangeSpecification;
import org.knowm.xchange.binance.service.BinanceMarketDataService;
Expand Down
Loading

0 comments on commit c7390fe

Please sign in to comment.