直接上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:用於控制是否寫入表頭,保證表頭只寫一次。
這段代碼的目的是為了能夠自動化地從幣安獲得特定時間範圍內的K線數據,方便進行加密貨幣的歷史數據分析或其他相關應用。