From 3233741c183bf4f5f878169378f9e5e96bcb30c4 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Sun, 13 Mar 2022 19:49:11 +0300 Subject: [PATCH 1/7] - polo okex candle stick --- .../xchange/dto/marketdata/CandleStick.java | 123 ++++++++++++++++++ .../dto/marketdata/CandleStickData.java | 25 ++++ .../service/marketdata/MarketDataService.java | 23 ++++ .../knowm/xchange/okex/v5/OkexAdapters.java | 29 ++++- .../v5/dto/marketdata/OkexCandleStick.java | 25 +--- .../v5/service/OkexMarketDataService.java | 23 ++++ .../xchange/poloniex/PoloniexAdapters.java | 35 +++-- .../service/PoloniexMarketDataService.java | 17 +++ 8 files changed, 263 insertions(+), 37 deletions(-) create mode 100644 xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java create mode 100644 xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java new file mode 100644 index 00000000000..e694c4f3ec2 --- /dev/null +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java @@ -0,0 +1,123 @@ +package org.knowm.xchange.dto.marketdata; + + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * Data object representing a CandleStick + */ +@JsonDeserialize(builder = CandleStick.Builder.class) +public class CandleStick { + + private final Date date; + private final BigDecimal open; + private final BigDecimal high; + private final BigDecimal low; + private final BigDecimal close; + private final BigDecimal volume; + private final BigDecimal currencyVolume; + + public CandleStick(Date date,BigDecimal open, BigDecimal high, BigDecimal low, BigDecimal close, BigDecimal volume, BigDecimal currencyVolume) { + this.date = date; + this.open = open; + this.high = high; + this.low = low; + this.close = close; + this.volume = volume; + this.currencyVolume = currencyVolume; + } + + public Date getDate() { + return date; + } + + public BigDecimal getOpen() { + return open; + } + + public BigDecimal getHigh() { + return high; + } + + public BigDecimal getLow() { + return low; + } + + public BigDecimal getClose() { + return close; + } + + public BigDecimal getVolume() { + return volume; + } + + public BigDecimal getCurrencyVolume() { + return currencyVolume; + } + + @JsonPOJOBuilder(withPrefix = "") + public static class Builder { + protected Date date; + protected BigDecimal open; + protected BigDecimal high; + protected BigDecimal low; + protected BigDecimal close; + protected BigDecimal volume; + protected BigDecimal currencyVolume; + + + public static Builder from(CandleStick candleStick) { + return new Builder() + .date(candleStick.getDate()) + .open(candleStick.getOpen()) + .high(candleStick.getHigh()) + .low(candleStick.getLow()) + .close(candleStick.getClose()) + .volume(candleStick.getVolume()) + .currencyVolume(candleStick.getCurrencyVolume()); + } + + public Builder date(Date date) { + this.date = date; + return this; + } + + public Builder open(BigDecimal open) { + this.open = open; + return this; + } + + public Builder high(BigDecimal high) { + this.high = high; + return this; + } + + public Builder low(BigDecimal low) { + this.low = low; + return this; + } + + public Builder close(BigDecimal close) { + this.close = close; + return this; + } + + public Builder volume(BigDecimal volume) { + this.volume = volume; + return this; + } + + public Builder currencyVolume(BigDecimal currencyVolume) { + this.currencyVolume = currencyVolume; + return this; + } + + public CandleStick build() { + return new CandleStick(date, open, high, low, close, volume, currencyVolume); + } + } +} diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java new file mode 100644 index 00000000000..12a996b244f --- /dev/null +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java @@ -0,0 +1,25 @@ +package org.knowm.xchange.dto.marketdata; + +import org.knowm.xchange.instrument.Instrument; + +import java.io.Serializable; +import java.util.List; + +public class CandleStickData implements Serializable { + + private final Instrument instrument; + private final List candleSticks; + + public CandleStickData(Instrument instrument, List candleSticks) { + this.instrument = instrument; + this.candleSticks = candleSticks; + } + + public Instrument getInstrument() { + return instrument; + } + + public List getCandleSticks() { + return candleSticks; + } +} diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java index adc7f73dd93..8961143d24a 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java +++ b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java @@ -4,6 +4,7 @@ import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.CandleStickData; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trades; @@ -177,4 +178,26 @@ default Trades getTrades(Instrument instrument, Object... args) throws IOExcepti default Trades getTrades(Params params) throws IOException { throw new NotYetImplementedForExchangeException("getTrades"); } + + + /** + * Get the CandleStickData for given currency between startDate to endDate. + * + * @param currencyPair currencyPair. + * @param startDate startDate of candle stick, E.G. march 2022 (Epoch timestamp in milis). + * @param endDate endDate of candle stick, E.G. april 2022 (Epoch timestamp in milis). + * @param period period of candle stick in milis. + * @param args extra exchange specific parameters. + * @return The CandleStickData, null if some sort of error occurred. Implementers should log the error. + * @throws ExchangeException - Indication that the exchange reported some kind of error with the + * request or response + * @throws NotAvailableFromExchangeException - Indication that the exchange does not support the + * requested function or data + * @throws NotYetImplementedForExchangeException - Indication that the exchange supports the + * requested function or data, but it has not yet been implemented + * @throws IOException - Indication that a networking error occurred while fetching JSON data + */ + default CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) throws IOException { + throw new NotYetImplementedForExchangeException("getCandleStickData"); + } } diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java index 3440c943136..855ecaa2013 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java @@ -7,9 +7,7 @@ import org.knowm.xchange.dto.Order.OrderType; import org.knowm.xchange.dto.account.Balance; import org.knowm.xchange.dto.account.Wallet; -import org.knowm.xchange.dto.marketdata.OrderBook; -import org.knowm.xchange.dto.marketdata.Trade; -import org.knowm.xchange.dto.marketdata.Trades; +import org.knowm.xchange.dto.marketdata.*; import org.knowm.xchange.dto.meta.CurrencyMetaData; import org.knowm.xchange.dto.meta.CurrencyPairMetaData; import org.knowm.xchange.dto.meta.ExchangeMetaData; @@ -23,10 +21,7 @@ import org.knowm.xchange.okex.v5.dto.account.OkexAssetBalance; import org.knowm.xchange.okex.v5.dto.account.OkexTradeFee; import org.knowm.xchange.okex.v5.dto.account.OkexWalletBalance; -import org.knowm.xchange.okex.v5.dto.marketdata.OkexCurrency; -import org.knowm.xchange.okex.v5.dto.marketdata.OkexInstrument; -import org.knowm.xchange.okex.v5.dto.marketdata.OkexOrderbook; -import org.knowm.xchange.okex.v5.dto.marketdata.OkexTrade; +import org.knowm.xchange.okex.v5.dto.marketdata.*; import org.knowm.xchange.okex.v5.dto.trade.OkexAmendOrderRequest; import org.knowm.xchange.okex.v5.dto.trade.OkexOrderDetails; import org.knowm.xchange.okex.v5.dto.trade.OkexOrderRequest; @@ -335,4 +330,24 @@ public static Wallet adaptOkexAssetBalances(List okexAssetBala private static BigDecimal checkForEmpty(String value) { return StringUtils.isEmpty(value) ? null : new BigDecimal(value); } + + public static CandleStickData adaptCandleStickData(List okexCandleStickList, CurrencyPair currencyPair) { + CandleStickData candleStickData = null; + if (!okexCandleStickList.isEmpty()) { + List candleStickList = new ArrayList<>(); + for (OkexCandleStick okexCandleStick : okexCandleStickList) { + candleStickList.add(new CandleStick.Builder() + .date(new Date(okexCandleStick.getTimestamp())) + .open(new BigDecimal(okexCandleStick.getOpenPrice())) + .high(new BigDecimal(okexCandleStick.getHighPrice())) + .low(new BigDecimal(okexCandleStick.getLowPrice())) + .close(new BigDecimal(okexCandleStick.getClosePrice())) + .volume(new BigDecimal(okexCandleStick.getVolume())) + .currencyVolume(new BigDecimal(okexCandleStick.getVolumeCcy())) + .build()); + } + candleStickData = new CandleStickData(currencyPair, candleStickList); + } + return candleStickData; + } } diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/dto/marketdata/OkexCandleStick.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/dto/marketdata/OkexCandleStick.java index 2c96f09f055..71a6a5deb4b 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/dto/marketdata/OkexCandleStick.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/dto/marketdata/OkexCandleStick.java @@ -11,6 +11,7 @@ public class OkexCandleStick { private final String highPrice; private final String lowPrice; private final String volume; + private final String volumeCcy; @JsonCreator public OkexCandleStick(JsonNode node) { @@ -20,6 +21,7 @@ public OkexCandleStick(JsonNode node) { this.highPrice = node.get(2).asText(); this.lowPrice = node.get(3).asText(); this.volume = node.get(5).asText(); + this.volumeCcy = node.get(6).asText(); } public Long getTimestamp() { @@ -46,26 +48,7 @@ public String getVolume() { return volume; } - @Override - public String toString() { - return "OkexCandleStick{" - + "timestamp=" - + timestamp - + ", openPrice='" - + openPrice - + '\'' - + ", closePrice='" - + closePrice - + '\'' - + ", highPrice='" - + highPrice - + '\'' - + ", lowPrice='" - + lowPrice - + '\'' - + ", volume='" - + volume - + '\'' - + '}'; + public String getVolumeCcy() { + return volumeCcy; } } diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java index 7d5fa2472d0..97de2f6e86c 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java @@ -1,13 +1,18 @@ package org.knowm.xchange.okex.v5.service; import java.io.IOException; +import java.util.List; + import org.knowm.xchange.client.ResilienceRegistries; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.CandleStickData; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Trades; import org.knowm.xchange.instrument.Instrument; import org.knowm.xchange.okex.v5.OkexAdapters; import org.knowm.xchange.okex.v5.OkexExchange; +import org.knowm.xchange.okex.v5.dto.OkexResponse; +import org.knowm.xchange.okex.v5.dto.marketdata.OkexCandleStick; import org.knowm.xchange.service.marketdata.MarketDataService; /** Author: Max Gao (gaamox@tutanota.com) Created: 08-06-2021 */ @@ -43,4 +48,22 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) throws IOExce return OkexAdapters.adaptTrades( getOkexTrades(OkexAdapters.adaptCurrencyPairId(currencyPair), 100).getData(), currencyPair); } + + @Override + public CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) + throws IOException { + + String limit = null; + if (args != null && args.length == 1) { + if (args[0] != null && args[0] instanceof String) { + limit = String.valueOf(args[0]); + } + } + + OkexResponse> historyCandle = getHistoryCandle( + OkexAdapters.adaptCurrencyPairId(currencyPair), endDate, startDate, period, limit); + + return OkexAdapters.adaptCandleStickData(historyCandle.getData(), currencyPair); + } + } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java index c17026a528b..5753759a22b 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java @@ -20,10 +20,7 @@ import org.knowm.xchange.dto.account.Balance; import org.knowm.xchange.dto.account.FundingRecord; import org.knowm.xchange.dto.account.FundingRecord.Type; -import org.knowm.xchange.dto.marketdata.OrderBook; -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.marketdata.*; import org.knowm.xchange.dto.marketdata.Trades.TradeSortType; import org.knowm.xchange.dto.meta.CurrencyMetaData; import org.knowm.xchange.dto.meta.CurrencyPairMetaData; @@ -36,11 +33,7 @@ import org.knowm.xchange.poloniex.dto.LoanInfo; import org.knowm.xchange.poloniex.dto.account.PoloniexBalance; import org.knowm.xchange.poloniex.dto.account.PoloniexLoan; -import org.knowm.xchange.poloniex.dto.marketdata.PoloniexCurrencyInfo; -import org.knowm.xchange.poloniex.dto.marketdata.PoloniexDepth; -import org.knowm.xchange.poloniex.dto.marketdata.PoloniexMarketData; -import org.knowm.xchange.poloniex.dto.marketdata.PoloniexPublicTrade; -import org.knowm.xchange.poloniex.dto.marketdata.PoloniexTicker; +import org.knowm.xchange.poloniex.dto.marketdata.*; import org.knowm.xchange.poloniex.dto.trade.PoloniexAdjustment; import org.knowm.xchange.poloniex.dto.trade.PoloniexDeposit; import org.knowm.xchange.poloniex.dto.trade.PoloniexDepositsWithdrawalsResponse; @@ -408,4 +401,28 @@ public static LimitOrder adaptUserTradesToOrderStatus( null, Order.OrderStatus.UNKNOWN); } + + public static CandleStickData adaptPoloniexCandleStickData( + PoloniexChartData[] poloniexChartData, CurrencyPair currencyPair) { + + CandleStickData candleStickData = null; + if (poloniexChartData.length != 0) { + List candleSticks = new ArrayList<>(); + for (PoloniexChartData chartData : poloniexChartData) { + candleSticks.add(new CandleStick.Builder() + .date(chartData.getDate()) + .open(chartData.getOpen()) + .high(chartData.getHigh()) + .low(chartData.getLow()) + .close(chartData.getClose()) + .volume(chartData.getVolume()) + .currencyVolume(chartData.getQuoteVolume()) + .build() + ); + } + candleStickData = new CandleStickData(currencyPair, candleSticks); + } + + return candleStickData; + } } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java index ff6b4c0dda2..593efe5c7f3 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java @@ -2,9 +2,11 @@ import java.io.IOException; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.CandleStickData; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trades; @@ -14,6 +16,7 @@ import org.knowm.xchange.poloniex.PoloniexErrorAdapter; import org.knowm.xchange.poloniex.PoloniexUtils; import org.knowm.xchange.poloniex.dto.PoloniexException; +import org.knowm.xchange.poloniex.dto.marketdata.PoloniexChartData; import org.knowm.xchange.poloniex.dto.marketdata.PoloniexDepth; import org.knowm.xchange.poloniex.dto.marketdata.PoloniexPublicTrade; import org.knowm.xchange.poloniex.dto.marketdata.PoloniexTicker; @@ -119,4 +122,18 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) throw PoloniexErrorAdapter.adapt(e); } } + + @Override + public CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) + throws IOException { + + try { + PoloniexChartDataPeriodType periodType = period != null ? PoloniexChartDataPeriodType.valueOf(period) : PoloniexChartDataPeriodType.PERIOD_300; + PoloniexChartData[] poloniexChartData = getPoloniexChartData( + currencyPair, TimeUnit.MILLISECONDS.toSeconds(Long.parseLong(startDate)), TimeUnit.MILLISECONDS.toSeconds(Long.parseLong(endDate)), periodType); + return PoloniexAdapters.adaptPoloniexCandleStickData(poloniexChartData, currencyPair); + } catch (PoloniexException e) { + throw PoloniexErrorAdapter.adapt(e); + } + } } From 8b4d6570a32bc4fa9ab01c18bbf11a84a03d97c6 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Sun, 13 Mar 2022 20:49:24 +0300 Subject: [PATCH 2/7] - polo okex candle stick 2 --- .../dto/marketdata/CandleStickData.java | 3 ++- .../service/marketdata/MarketDataService.java | 8 +++---- .../v5/service/OkexMarketDataService.java | 21 +++++++++++++------ .../service/PoloniexMarketDataService.java | 13 +++++++++--- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java index 12a996b244f..dd34ef62fa6 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStickData.java @@ -3,6 +3,7 @@ import org.knowm.xchange.instrument.Instrument; import java.io.Serializable; +import java.util.Collections; import java.util.List; public class CandleStickData implements Serializable { @@ -20,6 +21,6 @@ public Instrument getInstrument() { } public List getCandleSticks() { - return candleSticks; + return Collections.unmodifiableList(candleSticks); } } diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java index 8961143d24a..df6d93121ae 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java +++ b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java @@ -1,6 +1,7 @@ package org.knowm.xchange.service.marketdata; import java.io.IOException; +import java.util.Date; import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; @@ -184,9 +185,8 @@ default Trades getTrades(Params params) throws IOException { * Get the CandleStickData for given currency between startDate to endDate. * * @param currencyPair currencyPair. - * @param startDate startDate of candle stick, E.G. march 2022 (Epoch timestamp in milis). - * @param endDate endDate of candle stick, E.G. april 2022 (Epoch timestamp in milis). - * @param period period of candle stick in milis. + * @param startDate startDate of candle stick, E.G. march 2022. + * @param endDate endDate of candle stick, E.G. april 2022. * @param args extra exchange specific parameters. * @return The CandleStickData, null if some sort of error occurred. Implementers should log the error. * @throws ExchangeException - Indication that the exchange reported some kind of error with the @@ -197,7 +197,7 @@ default Trades getTrades(Params params) throws IOException { * requested function or data, but it has not yet been implemented * @throws IOException - Indication that a networking error occurred while fetching JSON data */ - default CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) throws IOException { + default CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) throws IOException { throw new NotYetImplementedForExchangeException("getCandleStickData"); } } diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java index 97de2f6e86c..31ac7300512 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java @@ -1,6 +1,7 @@ package org.knowm.xchange.okex.v5.service; import java.io.IOException; +import java.util.Date; import java.util.List; import org.knowm.xchange.client.ResilienceRegistries; @@ -50,19 +51,27 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) throws IOExce } @Override - public CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) + public CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) throws IOException { String limit = null; - if (args != null && args.length == 1) { - if (args[0] != null && args[0] instanceof String) { - limit = String.valueOf(args[0]); + String period = null; + + if (args != null) { + switch (args.length) { + case 2: + if (args[1] != null && args[1] instanceof String) { + limit = (String) args[1]; + } + case 1: + if (args[0] != null && args[0] instanceof String) { + period = (String) args[0]; + } } } OkexResponse> historyCandle = getHistoryCandle( - OkexAdapters.adaptCurrencyPairId(currencyPair), endDate, startDate, period, limit); - + OkexAdapters.adaptCurrencyPairId(currencyPair), String.valueOf(endDate.getTime()), String.valueOf(startDate.getTime()), period, limit); return OkexAdapters.adaptCandleStickData(historyCandle.getData(), currencyPair); } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java index 593efe5c7f3..b3afc6612e2 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java @@ -1,6 +1,7 @@ package org.knowm.xchange.poloniex.service; import java.io.IOException; +import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -124,13 +125,19 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) } @Override - public CandleStickData getCandleStickData(CurrencyPair currencyPair, String startDate, String endDate, String period, Object... args) + public CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) throws IOException { try { + String period = null; + if (args != null && args.length == 1) { + if (args[0] != null && args[0] instanceof String) { + period = (String) args[0]; + } + } PoloniexChartDataPeriodType periodType = period != null ? PoloniexChartDataPeriodType.valueOf(period) : PoloniexChartDataPeriodType.PERIOD_300; - PoloniexChartData[] poloniexChartData = getPoloniexChartData( - currencyPair, TimeUnit.MILLISECONDS.toSeconds(Long.parseLong(startDate)), TimeUnit.MILLISECONDS.toSeconds(Long.parseLong(endDate)), periodType); + + PoloniexChartData[] poloniexChartData = getPoloniexChartData(currencyPair, TimeUnit.MILLISECONDS.toSeconds(startDate.getTime()), TimeUnit.MILLISECONDS.toSeconds(endDate.getTime()), periodType); return PoloniexAdapters.adaptPoloniexCandleStickData(poloniexChartData, currencyPair); } catch (PoloniexException e) { throw PoloniexErrorAdapter.adapt(e); From d866fa8bd4d68d6bc69c9510f1c4dcc14cb923a0 Mon Sep 17 00:00:00 2001 From: Gokalp Peker Date: Sun, 15 May 2022 19:25:58 +0300 Subject: [PATCH 3/7] Review comments has been performed. More generalized candle stick parameter input is provided. --- .../xchange/dto/marketdata/CandleStick.java | 131 ++++++++++++++---- .../service/marketdata/MarketDataService.java | 7 +- .../trade/params/CandleStickDataParams.java | 4 + .../trade/params/DefaultCandleStickParam.java | 27 ++++ .../DefaultCandleStickParamWithLimit.java | 17 +++ .../knowm/xchange/okex/v5/OkexAdapters.java | 38 +++-- .../v5/service/OkexCandleStickPeriodType.java | 39 ++++++ .../v5/service/OkexMarketDataService.java | 47 ++++--- .../xchange/poloniex/PoloniexAdapters.java | 4 +- .../service/PoloniexChartDataPeriodType.java | 30 +++- .../service/PoloniexMarketDataService.java | 45 +++--- .../service/PoloniexMarketDataServiceRaw.java | 5 +- 12 files changed, 296 insertions(+), 98 deletions(-) create mode 100644 xchange-core/src/main/java/org/knowm/xchange/service/trade/params/CandleStickDataParams.java create mode 100644 xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParam.java create mode 100644 xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParamWithLimit.java create mode 100644 xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexCandleStickPeriodType.java diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java index e694c4f3ec2..b370d841c84 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/marketdata/CandleStick.java @@ -1,6 +1,5 @@ package org.knowm.xchange.dto.marketdata; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; @@ -13,32 +12,51 @@ @JsonDeserialize(builder = CandleStick.Builder.class) public class CandleStick { - private final Date date; private final BigDecimal open; + private final BigDecimal last; private final BigDecimal high; private final BigDecimal low; private final BigDecimal close; private final BigDecimal volume; - private final BigDecimal currencyVolume; - - public CandleStick(Date date,BigDecimal open, BigDecimal high, BigDecimal low, BigDecimal close, BigDecimal volume, BigDecimal currencyVolume) { - this.date = date; + private final BigDecimal quotaVolume; + private final BigDecimal vwap; // these 5 fields can be null if not provided by the exchange + private final BigDecimal bid; + private final BigDecimal bidSize; + private final BigDecimal ask; + private final BigDecimal askSize; + private final Date timestamp; + + public CandleStick(Date timestamp, BigDecimal open, BigDecimal last, BigDecimal high, + BigDecimal low, BigDecimal close, BigDecimal volume, + BigDecimal quotaVolume, BigDecimal vwap, BigDecimal bid, + BigDecimal bidSize, BigDecimal ask, BigDecimal askSize) { + this.timestamp = timestamp; this.open = open; + this.last = last; this.high = high; this.low = low; this.close = close; this.volume = volume; - this.currencyVolume = currencyVolume; + this.quotaVolume = quotaVolume; + this.vwap = vwap; + this.bid = bid; + this.bidSize = bidSize; + this.ask = ask; + this.askSize = askSize; } - public Date getDate() { - return date; + public Date getTimestamp() { + return timestamp; } public BigDecimal getOpen() { return open; } + public BigDecimal getLast() { + return last; + } + public BigDecimal getHigh() { return high; } @@ -55,34 +73,66 @@ public BigDecimal getVolume() { return volume; } - public BigDecimal getCurrencyVolume() { - return currencyVolume; + public BigDecimal getQuotaVolume() { + return quotaVolume; + } + + public BigDecimal getVwap() { + return vwap; + } + + public BigDecimal getBid() { + return bid; + } + + public BigDecimal getBidSize() { + return bidSize; + } + + public BigDecimal getAsk() { + return ask; + } + + public BigDecimal getAskSize() { + return askSize; } @JsonPOJOBuilder(withPrefix = "") public static class Builder { - protected Date date; - protected BigDecimal open; - protected BigDecimal high; - protected BigDecimal low; - protected BigDecimal close; - protected BigDecimal volume; - protected BigDecimal currencyVolume; + private Date timestamp; + private BigDecimal open; + private BigDecimal last; + private BigDecimal high; + private BigDecimal low; + private BigDecimal close; + private BigDecimal volume; + private BigDecimal quotaVolume; + private BigDecimal vwap; + private BigDecimal bid; + private BigDecimal bidSize; + private BigDecimal ask; + private BigDecimal askSize; public static Builder from(CandleStick candleStick) { return new Builder() - .date(candleStick.getDate()) + .timestamp(candleStick.getTimestamp()) .open(candleStick.getOpen()) + .last(candleStick.getLast()) .high(candleStick.getHigh()) .low(candleStick.getLow()) .close(candleStick.getClose()) .volume(candleStick.getVolume()) - .currencyVolume(candleStick.getCurrencyVolume()); + .quotaVolume(candleStick.getQuotaVolume()) + .vwap(candleStick.getVwap()) + .bid(candleStick.getBid()) + .bidSize(candleStick.getBidSize()) + .ask(candleStick.getAsk()) + .askSize(candleStick.getAskSize()); } - public Builder date(Date date) { - this.date = date; + public Builder timestamp(Date timestamp) { + this.timestamp = timestamp; return this; } @@ -91,6 +141,11 @@ public Builder open(BigDecimal open) { return this; } + public Builder last(BigDecimal last) { + this.last = last; + return this; + } + public Builder high(BigDecimal high) { this.high = high; return this; @@ -111,13 +166,39 @@ public Builder volume(BigDecimal volume) { return this; } - public Builder currencyVolume(BigDecimal currencyVolume) { - this.currencyVolume = currencyVolume; + public Builder quotaVolume(BigDecimal quotaVolume) { + this.quotaVolume = quotaVolume; + return this; + } + + public Builder vwap(BigDecimal vwap) { + this.vwap = vwap; + return this; + } + + public Builder bid(BigDecimal bid) { + this.bid = bid; + return this; + } + + public Builder bidSize(BigDecimal bidSize) { + this.bidSize = bidSize; + return this; + } + + public Builder ask(BigDecimal ask) { + this.ask = ask; + return this; + } + + public Builder askSize(BigDecimal askSize) { + this.askSize = askSize; return this; } public CandleStick build() { - return new CandleStick(date, open, high, low, close, volume, currencyVolume); + return new CandleStick(timestamp, open, last, high, low, close, volume, quotaVolume, + vwap, bid, bidSize, ask, askSize); } } } diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java index df6d93121ae..16b365faf53 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java +++ b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java @@ -15,6 +15,7 @@ import org.knowm.xchange.instrument.Instrument; import org.knowm.xchange.service.BaseService; import org.knowm.xchange.service.marketdata.params.Params; +import org.knowm.xchange.service.trade.params.CandleStickDataParams; /** * Interface to provide the following to {@link Exchange}: @@ -185,9 +186,7 @@ default Trades getTrades(Params params) throws IOException { * Get the CandleStickData for given currency between startDate to endDate. * * @param currencyPair currencyPair. - * @param startDate startDate of candle stick, E.G. march 2022. - * @param endDate endDate of candle stick, E.G. april 2022. - * @param args extra exchange specific parameters. + * @param params Params for query, including start(e.g. march 2022.) and end date, period etc., * @return The CandleStickData, null if some sort of error occurred. Implementers should log the error. * @throws ExchangeException - Indication that the exchange reported some kind of error with the * request or response @@ -197,7 +196,7 @@ default Trades getTrades(Params params) throws IOException { * requested function or data, but it has not yet been implemented * @throws IOException - Indication that a networking error occurred while fetching JSON data */ - default CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) throws IOException { + default CandleStickData getCandleStickData(CurrencyPair currencyPair, CandleStickDataParams params) throws IOException { throw new NotYetImplementedForExchangeException("getCandleStickData"); } } diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/CandleStickDataParams.java b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/CandleStickDataParams.java new file mode 100644 index 00000000000..fd9d2b51fb0 --- /dev/null +++ b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/CandleStickDataParams.java @@ -0,0 +1,4 @@ +package org.knowm.xchange.service.trade.params; + +public interface CandleStickDataParams { +} diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParam.java b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParam.java new file mode 100644 index 00000000000..10072f49624 --- /dev/null +++ b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParam.java @@ -0,0 +1,27 @@ +package org.knowm.xchange.service.trade.params; + +import java.util.Date; + +public class DefaultCandleStickParam implements CandleStickDataParams { + private final Date startDate; + private final Date endDate; + private final long periodInSecs; + + public DefaultCandleStickParam(Date startDate, Date endDate, long periodInSecs) { + this.startDate = startDate; + this.endDate = endDate; + this.periodInSecs = periodInSecs; + } + + public Date getStartDate() { + return startDate; + } + + public Date getEndDate() { + return endDate; + } + + public long getPeriodInSecs() { + return periodInSecs; + } +} diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParamWithLimit.java b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParamWithLimit.java new file mode 100644 index 00000000000..c1027cdaf51 --- /dev/null +++ b/xchange-core/src/main/java/org/knowm/xchange/service/trade/params/DefaultCandleStickParamWithLimit.java @@ -0,0 +1,17 @@ +package org.knowm.xchange.service.trade.params; + +import java.util.Date; + +public class DefaultCandleStickParamWithLimit extends DefaultCandleStickParam { + private final int limit; + + public DefaultCandleStickParamWithLimit(Date startDate, Date endDate, long periodInMillis, + int limit) { + super(startDate, endDate, periodInMillis); + this.limit = limit; + } + + public int getLimit() { + return limit; + } +} diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java index 855ecaa2013..b8b21da147e 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java @@ -41,24 +41,22 @@ public static UserTrades adaptUserTrades(List okexTradeHistory List userTradeList = new ArrayList<>(); okexTradeHistory.forEach( - okexOrderDetails -> { - userTradeList.add( - new UserTrade.Builder() - .originalAmount(new BigDecimal(okexOrderDetails.getAmount())) - .instrument(new CurrencyPair(okexOrderDetails.getInstrumentId())) - .currencyPair(new CurrencyPair(okexOrderDetails.getInstrumentId())) - .price(new BigDecimal(okexOrderDetails.getAverageFilledPrice())) - .type(adaptOkexOrderSideToOrderType(okexOrderDetails.getSide())) - .id(okexOrderDetails.getOrderId()) - .orderId(okexOrderDetails.getOrderId()) - .timestamp( - Date.from( - Instant.ofEpochMilli(Long.parseLong(okexOrderDetails.getUpdateTime())))) - .feeAmount(new BigDecimal(okexOrderDetails.getFee())) - .feeCurrency(new Currency(okexOrderDetails.getFeeCurrency())) - .orderUserReference(okexOrderDetails.getClientOrderId()) - .build()); - }); + okexOrderDetails -> userTradeList.add( + new UserTrade.Builder() + .originalAmount(new BigDecimal(okexOrderDetails.getAmount())) + .instrument(new CurrencyPair(okexOrderDetails.getInstrumentId())) + .currencyPair(new CurrencyPair(okexOrderDetails.getInstrumentId())) + .price(new BigDecimal(okexOrderDetails.getAverageFilledPrice())) + .type(adaptOkexOrderSideToOrderType(okexOrderDetails.getSide())) + .id(okexOrderDetails.getOrderId()) + .orderId(okexOrderDetails.getOrderId()) + .timestamp( + Date.from( + Instant.ofEpochMilli(Long.parseLong(okexOrderDetails.getUpdateTime())))) + .feeAmount(new BigDecimal(okexOrderDetails.getFee())) + .feeCurrency(new Currency(okexOrderDetails.getFeeCurrency())) + .orderUserReference(okexOrderDetails.getClientOrderId()) + .build())); return new UserTrades(userTradeList, Trades.TradeSortType.SortByTimestamp); } @@ -337,13 +335,13 @@ public static CandleStickData adaptCandleStickData(List okexCan List candleStickList = new ArrayList<>(); for (OkexCandleStick okexCandleStick : okexCandleStickList) { candleStickList.add(new CandleStick.Builder() - .date(new Date(okexCandleStick.getTimestamp())) + .timestamp(new Date(okexCandleStick.getTimestamp())) .open(new BigDecimal(okexCandleStick.getOpenPrice())) .high(new BigDecimal(okexCandleStick.getHighPrice())) .low(new BigDecimal(okexCandleStick.getLowPrice())) .close(new BigDecimal(okexCandleStick.getClosePrice())) .volume(new BigDecimal(okexCandleStick.getVolume())) - .currencyVolume(new BigDecimal(okexCandleStick.getVolumeCcy())) + .quotaVolume(new BigDecimal(okexCandleStick.getVolumeCcy())) .build()); } candleStickData = new CandleStickData(currencyPair, candleStickList); diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexCandleStickPeriodType.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexCandleStickPeriodType.java new file mode 100644 index 00000000000..a70a72fb193 --- /dev/null +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexCandleStickPeriodType.java @@ -0,0 +1,39 @@ +package org.knowm.xchange.okex.v5.service; + +public enum OkexCandleStickPeriodType { + CANDLE_STICK_1M(1, "1m"), + CANDLE_STICK_3M(3, "3m"), + CANDLE_STICK_5M(5, "5m"), + CANDLE_STICK_15M(15, "15m"), + CANDLE_STICK_30M(30, "30m"), + CANDLE_STICK_1H(60, "1H"), + CANDLE_STICK_2H(2 * 60, "2H"), + CANDLE_STICK_4H(4 * 60, "4H"); + private final long periodInSecs; + private final String fieldValue; + OkexCandleStickPeriodType(long periodInMinutes, String fieldValue) { + this.periodInSecs = periodInMinutes * 1000; + this.fieldValue = fieldValue; + } + static OkexCandleStickPeriodType getPeriodTypeFromSecs(long periodInSecs) { + OkexCandleStickPeriodType result = null; + for (OkexCandleStickPeriodType period : OkexCandleStickPeriodType.values()) { + if (period.periodInSecs == periodInSecs) { + result = period; + break; + } + } + return result; + } + public static long[] getSupportedPeriodsInSecs() { + long[] result = new long[OkexCandleStickPeriodType.values().length]; + int index = 0; + for (OkexCandleStickPeriodType period : OkexCandleStickPeriodType.values()) { + result[index++] = period.periodInSecs; + } + return result; + } + public String getFieldValue() { + return fieldValue; + } +} diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java index 31ac7300512..abe10c7fe44 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java @@ -1,20 +1,24 @@ package org.knowm.xchange.okex.v5.service; -import java.io.IOException; -import java.util.Date; -import java.util.List; - import org.knowm.xchange.client.ResilienceRegistries; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.CandleStickData; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Trades; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.knowm.xchange.instrument.Instrument; import org.knowm.xchange.okex.v5.OkexAdapters; import org.knowm.xchange.okex.v5.OkexExchange; import org.knowm.xchange.okex.v5.dto.OkexResponse; import org.knowm.xchange.okex.v5.dto.marketdata.OkexCandleStick; import org.knowm.xchange.service.marketdata.MarketDataService; +import org.knowm.xchange.service.trade.params.CandleStickDataParams; +import org.knowm.xchange.service.trade.params.DefaultCandleStickParam; +import org.knowm.xchange.service.trade.params.DefaultCandleStickParamWithLimit; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; /** Author: Max Gao (gaamox@tutanota.com) Created: 08-06-2021 */ public class OkexMarketDataService extends OkexMarketDataServiceRaw implements MarketDataService { @@ -50,29 +54,32 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) throws IOExce getOkexTrades(OkexAdapters.adaptCurrencyPairId(currencyPair), 100).getData(), currencyPair); } + @Override - public CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) + public CandleStickData getCandleStickData(CurrencyPair currencyPair, CandleStickDataParams params) throws IOException { - String limit = null; - String period = null; + if (!(params instanceof DefaultCandleStickParam)) { + throw new NotYetImplementedForExchangeException("Only DefaultCandleStickParam is supported"); + } + DefaultCandleStickParam defaultCandleStickParam = (DefaultCandleStickParam) params; + OkexCandleStickPeriodType periodType = + OkexCandleStickPeriodType.getPeriodTypeFromSecs(defaultCandleStickParam.getPeriodInSecs()); + if (periodType == null) { + throw new NotYetImplementedForExchangeException("Only discrete period values are supported;" + + Arrays.toString(OkexCandleStickPeriodType.getSupportedPeriodsInSecs())); + } - if (args != null) { - switch (args.length) { - case 2: - if (args[1] != null && args[1] instanceof String) { - limit = (String) args[1]; - } - case 1: - if (args[0] != null && args[0] instanceof String) { - period = (String) args[0]; - } - } + String limit = null; + if (params instanceof DefaultCandleStickParamWithLimit) { + limit = String.valueOf(((DefaultCandleStickParamWithLimit) params).getLimit()); } OkexResponse> historyCandle = getHistoryCandle( - OkexAdapters.adaptCurrencyPairId(currencyPair), String.valueOf(endDate.getTime()), String.valueOf(startDate.getTime()), period, limit); + OkexAdapters.adaptCurrencyPairId(currencyPair), + String.valueOf(defaultCandleStickParam.getEndDate().getTime()), + String.valueOf(defaultCandleStickParam.getStartDate().getTime()), + periodType.getFieldValue(), limit); return OkexAdapters.adaptCandleStickData(historyCandle.getData(), currencyPair); } - } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java index 5753759a22b..a75753130cb 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/PoloniexAdapters.java @@ -410,13 +410,13 @@ public static CandleStickData adaptPoloniexCandleStickData( List candleSticks = new ArrayList<>(); for (PoloniexChartData chartData : poloniexChartData) { candleSticks.add(new CandleStick.Builder() - .date(chartData.getDate()) + .timestamp(chartData.getDate()) .open(chartData.getOpen()) .high(chartData.getHigh()) .low(chartData.getLow()) .close(chartData.getClose()) .volume(chartData.getVolume()) - .currencyVolume(chartData.getQuoteVolume()) + .quotaVolume(chartData.getQuoteVolume()) .build() ); } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexChartDataPeriodType.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexChartDataPeriodType.java index a0332f1d150..6330aeea320 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexChartDataPeriodType.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexChartDataPeriodType.java @@ -8,13 +8,33 @@ public enum PoloniexChartDataPeriodType { PERIOD_14400(14400), PERIOD_86400(86400); - private final int period; + private final long periodInSecs; - PoloniexChartDataPeriodType(int period) { - this.period = period; + PoloniexChartDataPeriodType(int periodInSecs) { + this.periodInSecs = periodInSecs; } - public int getPeriod() { - return period; + static PoloniexChartDataPeriodType getPeriodTypeFromSecs(long periodInSecs) { + PoloniexChartDataPeriodType result = null; + for (PoloniexChartDataPeriodType period : PoloniexChartDataPeriodType.values()) { + if (period.periodInSecs == periodInSecs) { + result = period; + break; + } + } + return result; + } + + public static long[] getSupportedPeriodsInSecs() { + long[] result = new long[PoloniexChartDataPeriodType.values().length]; + int index = 0; + for (PoloniexChartDataPeriodType period : PoloniexChartDataPeriodType.values()) { + result[index++] = period.getPeriodInSecs(); + } + return result; + } + + public long getPeriodInSecs() { + return periodInSecs; } } diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java index b3afc6612e2..2663b83c274 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataService.java @@ -1,10 +1,5 @@ package org.knowm.xchange.poloniex.service; -import java.io.IOException; -import java.util.Date; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.CandleStickData; @@ -13,6 +8,7 @@ import org.knowm.xchange.dto.marketdata.Trades; import org.knowm.xchange.exceptions.CurrencyPairNotValidException; import org.knowm.xchange.exceptions.ExchangeException; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.knowm.xchange.poloniex.PoloniexAdapters; import org.knowm.xchange.poloniex.PoloniexErrorAdapter; import org.knowm.xchange.poloniex.PoloniexUtils; @@ -23,6 +19,14 @@ import org.knowm.xchange.poloniex.dto.marketdata.PoloniexTicker; import org.knowm.xchange.service.marketdata.MarketDataService; import org.knowm.xchange.service.marketdata.params.Params; +import org.knowm.xchange.service.trade.params.CandleStickDataParams; +import org.knowm.xchange.service.trade.params.DefaultCandleStickParam; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** @author Zach Holmes */ public class PoloniexMarketDataService extends PoloniexMarketDataServiceRaw @@ -31,10 +35,9 @@ public class PoloniexMarketDataService extends PoloniexMarketDataServiceRaw /** * Constructor * - * @param exchange + * @param exchange Exchange instance for the service */ public PoloniexMarketDataService(Exchange exchange) { - super(exchange); } @@ -71,8 +74,7 @@ public OrderBook getOrderBook(CurrencyPair currencyPair, Object... args) throws ExchangeException, IOException { try { - PoloniexDepth depth = null; - + PoloniexDepth depth; int depthLimit = 999999; // ~full order book if (args != null && args.length > 0) { if (args[0] instanceof Integer) { @@ -112,7 +114,7 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) } } } - PoloniexPublicTrade[] poloniexPublicTrades = null; + PoloniexPublicTrade[] poloniexPublicTrades; if (startTime == null && endTime == null) { poloniexPublicTrades = getPoloniexPublicTrades(currencyPair); } else { @@ -125,19 +127,24 @@ public Trades getTrades(CurrencyPair currencyPair, Object... args) } @Override - public CandleStickData getCandleStickData(CurrencyPair currencyPair, Date startDate, Date endDate, Object... args) + public CandleStickData getCandleStickData(CurrencyPair currencyPair, CandleStickDataParams params) throws IOException { - + if (!(params instanceof DefaultCandleStickParam)) { + throw new NotYetImplementedForExchangeException("Only DefaultCandleStickParam is supported"); + } try { - String period = null; - if (args != null && args.length == 1) { - if (args[0] != null && args[0] instanceof String) { - period = (String) args[0]; - } + DefaultCandleStickParam defaultCandleStickParam = (DefaultCandleStickParam) params; + PoloniexChartDataPeriodType periodType = + PoloniexChartDataPeriodType.getPeriodTypeFromSecs(defaultCandleStickParam.getPeriodInSecs()); + if (periodType == null) { + throw new NotYetImplementedForExchangeException("Only discrete period values are " + + "supported;" + Arrays.toString(PoloniexChartDataPeriodType.getSupportedPeriodsInSecs())); } - PoloniexChartDataPeriodType periodType = period != null ? PoloniexChartDataPeriodType.valueOf(period) : PoloniexChartDataPeriodType.PERIOD_300; - PoloniexChartData[] poloniexChartData = getPoloniexChartData(currencyPair, TimeUnit.MILLISECONDS.toSeconds(startDate.getTime()), TimeUnit.MILLISECONDS.toSeconds(endDate.getTime()), periodType); + PoloniexChartData[] poloniexChartData = getPoloniexChartData(currencyPair, + TimeUnit.MILLISECONDS.toSeconds(defaultCandleStickParam.getStartDate().getTime()), + TimeUnit.MILLISECONDS.toSeconds(defaultCandleStickParam.getEndDate().getTime()), + periodType); return PoloniexAdapters.adaptPoloniexCandleStickData(poloniexChartData, currencyPair); } catch (PoloniexException e) { throw PoloniexErrorAdapter.adapt(e); diff --git a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataServiceRaw.java b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataServiceRaw.java index 2e015e68733..12b881b5abc 100644 --- a/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataServiceRaw.java +++ b/xchange-poloniex/src/main/java/org/knowm/xchange/poloniex/service/PoloniexMarketDataServiceRaw.java @@ -28,10 +28,9 @@ public class PoloniexMarketDataServiceRaw extends PoloniexBaseService { /** * Constructor * - * @param exchange + * @param exchange Exchange instance for the service */ public PoloniexMarketDataServiceRaw(Exchange exchange) { - super(exchange); } @@ -117,6 +116,6 @@ public PoloniexChartData[] getPoloniexChartData( String command = "returnChartData"; String pairString = PoloniexUtils.toPairString(currencyPair); - return poloniex.getChartData(command, pairString, startTime, endTime, period.getPeriod()); + return poloniex.getChartData(command, pairString, startTime, endTime, period.getPeriodInSecs()); } } From 8edcfcce9ab04575523cc77deed4750897670b78 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Wed, 24 May 2023 20:43:21 +0900 Subject: [PATCH 4/7] polo okex candle data branch updated from upstream --- .../service/OkexCandleStickPeriodType.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/service/OkexCandleStickPeriodType.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/service/OkexCandleStickPeriodType.java index e69de29bb2d..8ef56d905f2 100644 --- a/xchange-okex/src/main/java/org/knowm/xchange/okex/service/OkexCandleStickPeriodType.java +++ b/xchange-okex/src/main/java/org/knowm/xchange/okex/service/OkexCandleStickPeriodType.java @@ -0,0 +1,39 @@ +package org.knowm.xchange.okex.service; + +public enum OkexCandleStickPeriodType { + CANDLE_STICK_1M(1, "1m"), + CANDLE_STICK_3M(3, "3m"), + CANDLE_STICK_5M(5, "5m"), + CANDLE_STICK_15M(15, "15m"), + CANDLE_STICK_30M(30, "30m"), + CANDLE_STICK_1H(60, "1H"), + CANDLE_STICK_2H(2 * 60, "2H"), + CANDLE_STICK_4H(4 * 60, "4H"); + private final long periodInSecs; + private final String fieldValue; + OkexCandleStickPeriodType(long periodInMinutes, String fieldValue) { + this.periodInSecs = periodInMinutes * 60; + this.fieldValue = fieldValue; + } + static OkexCandleStickPeriodType getPeriodTypeFromSecs(long periodInSecs) { + OkexCandleStickPeriodType result = null; + for (OkexCandleStickPeriodType period : OkexCandleStickPeriodType.values()) { + if (period.periodInSecs == periodInSecs) { + result = period; + break; + } + } + return result; + } + public static long[] getSupportedPeriodsInSecs() { + long[] result = new long[OkexCandleStickPeriodType.values().length]; + int index = 0; + for (OkexCandleStickPeriodType period : OkexCandleStickPeriodType.values()) { + result[index++] = period.periodInSecs; + } + return result; + } + public String getFieldValue() { + return fieldValue; + } +} \ No newline at end of file From 9152e34a8666a3fc7e263f1dd49237813a3ac250 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Wed, 24 May 2023 20:53:01 +0900 Subject: [PATCH 5/7] commit fix --- .../src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java | 0 .../org/knowm/xchange/okex/v5/service/OkexMarketDataService.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java delete mode 100644 xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/OkexAdapters.java deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java b/xchange-okex/src/main/java/org/knowm/xchange/okex/v5/service/OkexMarketDataService.java deleted file mode 100644 index e69de29bb2d..00000000000 From 8f1275e1378a55f6eac502d4e205173f18963128 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Wed, 24 May 2023 20:56:56 +0900 Subject: [PATCH 6/7] removed unused imports --- .../xchange/service/marketdata/MarketDataService.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java index 42db6039925..9b336727631 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java +++ b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java @@ -1,14 +1,7 @@ package org.knowm.xchange.service.marketdata; -import java.io.IOException; -import java.util.Date; -import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; -import org.knowm.xchange.dto.marketdata.CandleStickData; -import org.knowm.xchange.dto.marketdata.OrderBook; -import org.knowm.xchange.dto.marketdata.Ticker; -import org.knowm.xchange.dto.marketdata.Trades; import org.knowm.xchange.dto.marketdata.*; import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.exceptions.NotAvailableFromExchangeException; @@ -18,6 +11,9 @@ import org.knowm.xchange.service.marketdata.params.Params; import org.knowm.xchange.service.trade.params.CandleStickDataParams; +import java.io.IOException; +import java.util.List; + /** * Interface to provide the following to {@link Exchange}: * From 620140dc7e4f88e0dd1740f854bf985cf4ab9c09 Mon Sep 17 00:00:00 2001 From: maghteriton Date: Wed, 24 May 2023 21:56:50 +0900 Subject: [PATCH 7/7] fixed imports --- .../knowm/xchange/service/marketdata/MarketDataService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java index 9b336727631..670cb4a227e 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java +++ b/xchange-core/src/main/java/org/knowm/xchange/service/marketdata/MarketDataService.java @@ -1,5 +1,7 @@ package org.knowm.xchange.service.marketdata; +import java.io.IOException; +import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.*; @@ -11,9 +13,6 @@ import org.knowm.xchange.service.marketdata.params.Params; import org.knowm.xchange.service.trade.params.CandleStickDataParams; -import java.io.IOException; -import java.util.List; - /** * Interface to provide the following to {@link Exchange}: *