直接上code:
各個函數的說明:
Java:
private static long getTimestamp(LocalDate date) {
ZonedDateTime zonedDateTime = date.atStartOfDay(ZoneId.of("UTC"));
return zonedDateTime.toInstant().toEpochMilli();
}
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
// 換成你想要的交易對和時間範圍
String symbol = "BTCUSDT";
String interval = "1h";
// 設置日期範圍
LocalDate startDate = LocalDate.parse("2023-01-01");
LocalDate endDate = LocalDate.parse("2023-12-31");
// 初始時間戳
long startTime = getTimestamp(startDate);
long endTime = getTimestamp(endDate);
// 循環獲取數據直到覆蓋全部範圍
while (startTime < endTime) {
long nextTime = Math.min(startTime + 500 * 3600000L, endTime); // 假設每個間隔為1小時
fetchAndSaveData(symbol, interval, startTime, nextTime);
startTime = nextTime; // 更新 startTime 為下一批次的開始
}
}
private static void fetchAndSaveData(String symbol, String interval, long startTime, long endTime) {
String url = String.format("https://api.binance.com/api/v3/klines?symbol=%s&interval=%s&startTime=%d&endTime=%d", symbol, interval, startTime, endTime);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(BitcoinPricePrediction::writeDataToCSV)
.join();
}
public static boolean write = true;
private static void writeDataToCSV(String data) {
JSONArray json = new JSONArray(data);
try (FileWriter file = new FileWriter("E:/btc/data.csv", true)) {
if (write)
file.append("OpenTime,Open,High,Low,Close,Volume,CloseTime,Quote Asset Volume,Number of Trades\n");
for (int i = 0; i < json.length(); i++) {
JSONArray row = json.getJSONArray(i);
long openTime = row.getLong(0);
String open = row.getString(1);
String high = row.getString(2);
String low = row.getString(3);
String close = row.getString(4);
String volume = row.getString(5);
long closeTime = row.getLong(6);
String quoteAssetVolume = row.getString(7);
int numberOfTrades = row.getInt(8);
file.append(String.format("%s,%s,%s,%s,%s,%s,%s,%s,%d\n", openTime, open, high, low, close, volume, closeTime, quoteAssetVolume, numberOfTrades));
}
write = false;
} catch (IOException e) {
e.printStackTrace();
}
}
這段代碼是一個Java應用程序,主要用於從幣安(Binance)加密貨幣交易平台抓取比特幣(BTC)與USDT(泰達幣)的交易對歷史K線(蠟燭圖)數據,並將這些數據保存到本地CSV文件
各個函數的說明:
方法 getTimestamp(LocalDate date)
- 功能:將給定的 LocalDate 轉換成UTC時區的時間戳(毫秒)。
- 參數:LocalDate date - 日期對象,不包含時間信息。
- 返回:該日期在UTC時區下的0點時間戳(從1970年1月1日午夜開始的毫秒數)。
主方法 main(String[] args)
- 設置:定義了加密貨幣交易對、K線數據的時間間隔以及數據的起始和結束日期。
- 功能:使用迴圈從幣安API抓取指定日期範圍內的K線數據。考慮到幣安API對數據請求的限制,這個迴圈按每次最多500個小時的數據分批次進行數據抓取。
方法 fetchAndSaveData(String symbol, String interval, long startTime, long endTime)
- 參數:
- String symbol:交易對,這裡是 "BTCUSDT"。
- String interval:K線數據的時間間隔,設置為 "1h"(一小時)。
- long startTime、long endTime:查詢數據的起始和結束時間戳。
- 功能:構造HTTP請求並發送到幣安API,從API獲得數據後調用 writeDataToCSV 方法將數據寫入CSV文件。
方法 writeDataToCSV(String data)
- 功能:將從幣安API獲得的數據(JSON格式)解析並寫入到CSV文件中。首次調用時會在文件中寫入表頭。
- 流程:
- 首次寫入時添加CSV列名作為表頭。
- 解析JSON數據,提取每條K線的開盤時間、開盤價、最高價、最低價、收盤價、交易量、收盤時間、報價資產交易量和交易次數。
- 格式化提取的數據並追加到CSV文件中。
- 靜態變量 write:用於控制是否寫入表頭,保證表頭只寫一次。