Binance 거래소 실시간 체결가 저장 및 읽기 - slog

Binance 거래소 종목의 실시간 체결가를 수신하여 파일로 저장하는 모듈을 만들기 위해 슬로그를 시작합니다.

저장할 데이터는 체결가 및 체결시 호가 정보입니다.

저장할 파일구조는 빠르게 원하는 시간대의 체결가를 획득하기 위해 하루단위로 다음의 구조로 만듭니다.
[1분 간격의 체결가정보 시작 offset] [체결가 정보, …]
으로 구성하고 1분사이 체결가가 없으면 체결가정보 시작 offset을 0으로 합니다.

.NET용 Binance API를 직접 구현할 수도 있지만 이미 잘 구현되어 있는 Binance.Net을 사용해보도록 합니다.

저장된 체결가 정보를 읽는 모듈은 거래량이 많을 경우 상당히 큰 사이즈가 될 것이기 때문에 MemoryMappedFile를 사용해 보도록 합니다. 파일을 마치 메모리 처럼 접근하기 위한 Span<byte>으로의 접근은 기존애 간단히 테스트 했던 아래의 코드를 참고합니다.

파일은 하루 단위로 저장하며 체결가를 사용하기 위해 파일 및 하루가 넘어가는 경계에 신경쓸 필요없이 체결가를 사용할 수 있도록 API를 구성합니다.

Span<OrderInfo> sectionOrders = orderStore.Get(startDatetime, endDatetime);
3개의 좋아요

Binance.Net을 이용하면 쉽게 실시간 시세 정보 및 체결정보를 얻을 수 있습니다.

using Binance.Net.Clients;
using Binance.Net.Objects;


var binanceClient = new BinanceClient(new BinanceClientOptions()
{
    // Set options here for this client
});

var binanceSocketClient = new BinanceSocketClient(new BinanceSocketClientOptions()
{
    // Set options here for this client
});


var coinFuturesSymbolData = await binanceClient.CoinFuturesApi.ExchangeData.GetExchangeInfoAsync();


var subscribeResult = await binanceSocketClient.CoinFuturesStreams.SubscribeToAllTickerUpdatesAsync(data =>
{
    foreach (var coinTick in data.Data)
        Console.WriteLine($"{coinTick.Symbol}: {coinTick.LastPrice}");
    Console.WriteLine("------");
});

Console.ReadLine();

image

1개의 좋아요

실시간 시세는 SubscribeToTickerUpdatesAsync()
실시간 체결은 SubscribeToAggregatedTradeUpdatesAsync()
실시간 호가정보는 SubscribeToOrderBookUpdatesAsync()를 구독해서 얻을 수 있습니다.
(그런데 실시간 호가정보는 인터벌이 있습니다. 100ms, 250ms, 500ms를 지정해서 이 간격 미만으로는 수신할 수 없는 것 같습니다.)

사용하는 용어를 정리할 필요성이 있습니다. Binance.Net에서 사용하는 용어로 통일합니다.

시세 - Ticker
거래 - Trade
호가정보 - OrderBook

저장하는 거래 요소 값은 일단 (Price, Quantity, TradeTime)로 해봅시다.

1개의 좋아요

실시간 거래정보와 호가정보를 별도의 파일로 저장하려 합니다. 파일은 다음의 규칙으로 저장합니다.

거래가 발생하지 않은 호가정보는 의미가 없으므로 거래 발생 시 가장 최근의 호가정보를 파일에 기록하는 것으로 합니다.

/data/{symbol}/{year}/{month}/{year}-{month}-{day}.{symbol}.trade.dat
/data/{symbol}/{year}/{month}/{year}-{month}-{day}.{symbol}.orderbook.dat

/data/BTCUSD/2022/11/2022-11-17.BTCUSD.trade.dat
/data/BTCUSD/2022/11/2022-11-17.BTCUSD.orderbook.dat

1개의 좋아요