
com.tigerbrokers.stock.openapi.client.util.PageTokenUtil Maven / Gradle / Ivy
package com.tigerbrokers.stock.openapi.client.util;
import com.tigerbrokers.stock.openapi.client.TigerApiException;
import com.tigerbrokers.stock.openapi.client.config.ClientConfig;
import com.tigerbrokers.stock.openapi.client.https.client.TigerHttpClient;
import com.tigerbrokers.stock.openapi.client.https.domain.future.item.FutureKlineBatchItem;
import com.tigerbrokers.stock.openapi.client.https.domain.future.item.FutureKlineItem;
import com.tigerbrokers.stock.openapi.client.https.domain.future.model.FutureKlineModel;
import com.tigerbrokers.stock.openapi.client.https.domain.quote.item.KlineItem;
import com.tigerbrokers.stock.openapi.client.https.domain.quote.item.KlinePoint;
import com.tigerbrokers.stock.openapi.client.https.domain.quote.model.QuoteKlineModel;
import com.tigerbrokers.stock.openapi.client.https.request.future.FutureKlineRequest;
import com.tigerbrokers.stock.openapi.client.https.request.quote.QuoteKlineRequest;
import com.tigerbrokers.stock.openapi.client.https.response.future.FutureKlineResponse;
import com.tigerbrokers.stock.openapi.client.https.response.quote.QuoteKlineResponse;
import com.tigerbrokers.stock.openapi.client.struct.enums.FutureKType;
import com.tigerbrokers.stock.openapi.client.struct.enums.KType;
import com.tigerbrokers.stock.openapi.client.struct.enums.RightOption;
import com.tigerbrokers.stock.openapi.client.struct.enums.TigerApiCode;
import com.tigerbrokers.stock.openapi.client.struct.enums.TimeZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class PageTokenUtil {
public static int DEFAULT_PAGE_SIZE = 1000;
public static int DEFAULT_BATCH_TIME = 10;
public static int MAX_TOTAL_SIZE = 10000;
public static long DEFAULT_TIME_INTERVAL = 2000L;
public static final KlinePoint RETURN_KLINE = new KlinePoint();
public static final FutureKlineItem RETURN_FUTURE_KLINE = new FutureKlineItem();
private PageTokenUtil() {
}
/**
* get kline data by page, return the merge result(use default pageSize:1000, 10 queries in total)
* @param symbol symbol
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, KType period,
String beginTime, String endTime) throws TigerApiException {
return getKlineByPage(symbol, period, beginTime, endTime,
ClientConfig.DEFAULT_CONFIG.getDefaultTimeZone(),
RightOption.br, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE * DEFAULT_BATCH_TIME, DEFAULT_TIME_INTERVAL);
}
/**
* get kline data by page, return the merge result(use default pageSize:1000, 10 queries in total)
* @param symbol symbol
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @param totalSize total size. the max value is 10000
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, KType period,
String beginTime, String endTime, int totalSize) throws TigerApiException {
return getKlineByPage(symbol, period, beginTime, endTime,
ClientConfig.DEFAULT_CONFIG.getDefaultTimeZone(),
RightOption.br, DEFAULT_PAGE_SIZE, totalSize, DEFAULT_TIME_INTERVAL);
}
/**
* get kline data by page, return the merge result
* @param symbol symbol
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @param zoneId zone, the default is NewYork
* @param right adjust type. the default is br(adjusted)
* @param pageSize page size. the default is 1000
* @param totalSize total size. the default is 10000
* @param timeInterval request interval milliseconds, the default is 2000
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, KType period,
String beginTime, String endTime, TimeZoneId zoneId,
RightOption right, int pageSize, int totalSize, long timeInterval) throws TigerApiException {
return getKlineByPage(RETURN_KLINE, symbol, period == null ? null : period.name(),
beginTime, endTime, zoneId, right, pageSize, totalSize, timeInterval);
}
/**
* get futrue kline data by page, return the merge result(use default pageSize:1000, 10 queries in total)
* @param symbol contract code
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, FutureKType period,
String beginTime, String endTime) throws TigerApiException {
return getKlineByPage(symbol, period, beginTime, endTime,
ClientConfig.DEFAULT_CONFIG.getDefaultTimeZone(),
DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE * DEFAULT_BATCH_TIME, DEFAULT_TIME_INTERVAL);
}
/**
* get futrue kline data by page, return the merge result(use default pageSize:1000, 10 queries in total)
* @param symbol contract code
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @param totalSize total size. the max value is 10000
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, FutureKType period,
String beginTime, String endTime, int totalSize) throws TigerApiException {
return getKlineByPage(symbol, period, beginTime, endTime,
ClientConfig.DEFAULT_CONFIG.getDefaultTimeZone(),
DEFAULT_PAGE_SIZE, totalSize, DEFAULT_TIME_INTERVAL);
}
/**
* get futrue kline data by page, return the merge result
* @param symbol contract code
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @param zoneId zone, the default is NewYork
* @param pageSize page size. the default is 1000
* @param totalSize total size. the default is 10000
* @param timeInterval request interval milliseconds, the default is 2000
* @throws TigerApiException
*/
public static List getKlineByPage(String symbol, FutureKType period,
String beginTime, String endTime, TimeZoneId zoneId, int pageSize, int totalSize, long timeInterval) throws TigerApiException {
return getKlineByPage(RETURN_FUTURE_KLINE, symbol, period == null ? null : period.name(),
beginTime, endTime, zoneId, null, pageSize, totalSize, timeInterval);
}
/**
* get kline data by page, return the merge result
* @param t return type,only for FutureKlineItem(MethodName.FUTURE_KLINE) and KlineItem(MethodName.KLINE)
* @param symbol symbol or future contract code
* @param period kline tpye
* @param beginTime begin time. format:"2022-04-25 00:00:00"
* @param endTime end time. formae:"2022-04-28 00:00:00"
* @param zoneId zone, the default is NewYork
* @param right adjust type(only for stock). the default is br(adjusted)
* @param pageSize page size. the default is 1000
* @param totalSize total size. the default is 10000
* @param timeInterval request interval milliseconds, the default is 2000
* @throws TigerApiException
*/
public static List getKlineByPage(T t, String symbol, String period,
String beginTime, String endTime, TimeZoneId zoneId,
RightOption right, int pageSize, int totalSize, long timeInterval) throws TigerApiException {
if (t == null || !(t instanceof KlinePoint || t instanceof FutureKlineItem)) {
throw new TigerApiException(TigerApiCode.HTTP_BIZ_PARAM_VALUE_ERROR, "return type");
}
boolean isKline = (t instanceof KlinePoint);
if (symbol == null) {
throw new TigerApiException(TigerApiCode.HTTP_BIZ_PARAM_EMPTY_ERROR, "symbol");
}
if (totalSize <= 0) {
totalSize = DEFAULT_PAGE_SIZE * DEFAULT_BATCH_TIME;
}
if (totalSize > MAX_TOTAL_SIZE) {
throw new TigerApiException(TigerApiCode.HTTP_BIZ_PARAM_ERROR, "'totalSize' exceeds maximum: " + MAX_TOTAL_SIZE);
}
if (pageSize <= 0) {
pageSize = DEFAULT_PAGE_SIZE;
}
if (totalSize < pageSize) {
pageSize = totalSize;
}
if (zoneId == null) {
zoneId = ClientConfig.DEFAULT_CONFIG.getDefaultTimeZone();
}
if (timeInterval < 1000) {
timeInterval = DEFAULT_TIME_INTERVAL;
}
List results = new ArrayList<>(totalSize);
List symbols = new ArrayList<>();
symbols.add(symbol);
if (isKline) {
KType kType = KType.day;
if (period != null && KType.valueOf(period) != null) {
kType = KType.valueOf(period);
}
QuoteKlineRequest request = QuoteKlineRequest.newRequest(symbols, kType,
beginTime, endTime, zoneId);
request.withLimit(pageSize);
request.withRight(right == null ? RightOption.br : right);
do {
QuoteKlineResponse response = TigerHttpClient.getInstance().execute(request);
if (!response.isSuccess()) {
throw new TigerApiException(response.getMessage());
}
if (response.getKlineItems().size() == 0) {
break;
}
KlineItem klineItem = response.getKlineItems().get(0);
results.addAll((List) klineItem.getItems());
if (klineItem.getNextPageToken() == null) {
break;
}
// 60 times per minute
try {
TimeUnit.MILLISECONDS.sleep(timeInterval);
} catch (InterruptedException ignoreIE) {
}
// set pagination token then query the next page
request.withPageToken(klineItem.getNextPageToken());
if (results.size() + pageSize > totalSize) {
((QuoteKlineModel)request.getApiModel()).setLimit(totalSize - results.size());
}
} while (results.size() < totalSize);
} else {
Date beginDate = DateUtils.getZoneDate(beginTime, zoneId);
if (beginDate == null) {
throw new TigerApiException(TigerApiCode.HTTP_BIZ_PARAM_VALUE_ERROR, "beginTime");
}
Date endDate = DateUtils.getZoneDate(endTime, zoneId);
if (endDate == null) {
throw new TigerApiException(TigerApiCode.HTTP_BIZ_PARAM_VALUE_ERROR, "endTime");
}
FutureKType kType = FutureKType.day;
if (period != null && FutureKType.valueOf(period) != null) {
kType = FutureKType.valueOf(period);
}
FutureKlineRequest request = FutureKlineRequest.newRequest(symbols, kType,
beginDate.getTime(), endDate.getTime(), pageSize);
do {
FutureKlineResponse response = TigerHttpClient.getInstance().execute(request);
if (!response.isSuccess()) {
throw new TigerApiException(response.getMessage());
}
if (response.getFutureKlineItems().size() == 0) {
break;
}
FutureKlineBatchItem klineItem = response.getFutureKlineItems().get(0);
results.addAll((List)klineItem.getItems());
if (klineItem.getNextPageToken() == null) {
break;
}
// 60 times per minute
try {
TimeUnit.MILLISECONDS.sleep(timeInterval);
} catch (InterruptedException ignoreIE) {
}
// set pagination token then query the next page
request.withPageToken(klineItem.getNextPageToken());
if (results.size() + pageSize > totalSize) {
((FutureKlineModel)request.getApiModel()).setLimit(totalSize - results.size());
}
} while (results.size() < totalSize);
}
return results;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy