Coinbase API 업데이트 sgcWebSockets

· 기능
Delphi에서 Coinbase Advanced Trade API 통합

Coinbase Advanced Trade는 세계에서 가장 널리 사용되는 암호화폐 거래소 중 하나의 전문 트레이딩 플랫폼이에요. Delphi용 TsgcWSAPI_Coinbase 컴포넌트는 WebSocket과 REST API 모두에 완전한 접근을 제공하여 통합된 Delphi 인터페이스에서 실시간 시장 데이터 스트리밍, 주문 관리, 계좌 모니터링, 선물 잔고 추적이 가능해요.

Table of Contents

개요

Coinbase Advanced Trade API는 기존 Coinbase Pro API를 대체하며 전문 암호화폐 거래를 위한 현대적인 인터페이스를 제공해요. 다양한 암호화폐 자산의 현물 거래와 선물 계약을 모두 지원해요. API는 두 가지 전송 방식을 사용해요:

전송 방식 용도 인증
WebSocket 시장 데이터, 사용자 이벤트, 선물 잔고의 실시간 스트리밍 비공개 채널에 필요, 공개 채널은 선택 사항
REST 계좌 조회, 주문 접수, 상품 데이터, 체결 조회 모든 비공개 엔드포인트에 필요

설정

비공개 엔드포인트에 접근하려면 TsgcWSAPI_Coinbase 컴포넌트에 API 인증 정보를 설정하세요. 공개 시장 데이터 엔드포인트는 인증 없이 접근할 수 있어요.

속성 유형 설명
Coinbase.ApiKey String Coinbase Advanced Trade API 키예요
Coinbase.ApiSecret String 요청 서명에 사용되는 Coinbase Advanced Trade API 시크릿이에요
참고: Coinbase 개발자 플랫폼에서 API 인증 정보를 생성하세요. 키를 만들 때 Advanced Trade API 유형을 선택하고 애플리케이션에 필요한 권한만 할당하세요. 시장 데이터 전용 애플리케이션의 경우 API 키 생성을 건너뛰고 공개 엔드포인트만 사용할 수 있어요.
var
  oClient: TsgcWebSocketClient;
  oCoinbase: TsgcWSAPI_Coinbase;
begin
  oClient := TsgcWebSocketClient.Create(nil);
  oCoinbase := TsgcWSAPI_Coinbase.Create(nil);
  oCoinbase.Client := oClient;
  // Configure API credentials
  oCoinbase.Coinbase.ApiKey := 'your_api_key';
  oCoinbase.Coinbase.ApiSecret := 'your_api_secret';
  // Connect to Coinbase
  oClient.Active := True;
end;

WebSocket API

WebSocket API는 시장 데이터와 비공개 계좌 이벤트를 위한 실시간 스트리밍 채널을 제공해요. 공개 채널은 인증 없이 시장 전체 데이터를 제공하고, 비공개 채널은 계좌별 이벤트를 스트리밍해요.

공개 채널

Method Description
SubscribeHeartBeat / UnSubscribeHeartBeat 지정된 상품에 대한 주기적 하트비트 메시지로 연결 상태를 모니터링해요
SubscribeStatus / UnSubscribeStatus 거래 상태와 경매 정보를 포함한 상품 상태 업데이트예요
SubscribeTicker / UnSubscribeTicker 가격, 24시간 거래량, 최우선 매수/매도호가를 포함한 실시간 티커 데이터예요
SubscribeTickerBatch / UnSubscribeTickerBatch 대역폭 절약을 위해 낮은 빈도로 제공되는 일괄 티커 업데이트예요
SubscribeLevel2 / UnSubscribeLevel2 전체 레벨 2 호가창 스냅샷과 증분 업데이트예요
SubscribeCandles / UnSubscribeCandles 차트 작성을 위한 실시간 OHLCV 캔들 데이터예요
SubscribeMarketTrades / UnSubscribeMarketTrades 지정된 상품에 대해 거래소에서 체결된 모든 거래의 실시간 피드예요

비공개 채널

Method Description
SubscribeUser / UnSubscribeUser 주문(신규, 체결, 취소)과 계좌 활동에 대한 실시간 업데이트예요
SubscribeFuturesBalanceSummary / UnSubscribeFuturesBalanceSummary 선물 계좌 잔고, 증거금, 청산 가격에 대한 실시간 업데이트예요
// Subscribe to real-time ticker for BTC-USD
oCoinbase.SubscribeTicker('BTC-USD');
// Subscribe to Level 2 order book updates
oCoinbase.SubscribeLevel2('BTC-USD');
// Subscribe to candle data for charting
oCoinbase.SubscribeCandles('ETH-USD');
// Subscribe to live market trades
oCoinbase.SubscribeMarketTrades('BTC-USD');
// Subscribe to private user channel (requires API key)
oCoinbase.SubscribeUser('BTC-USD');
// Subscribe to futures balance updates
oCoinbase.SubscribeFuturesBalanceSummary;

REST API - 계좌

계좌 엔드포인트를 통해 Coinbase 포트폴리오를 조회할 수 있어요. 각 계좌는 포트폴리오에서 사용 가능 잔고와 보유 잔고가 있는 단일 통화 또는 자산을 나타내요.

Method Description
ListAccounts 포트폴리오의 모든 계좌와 잔고를 페이지별 목록으로 반환해요
GetAccount UUID로 단일 계좌의 세부 정보를 반환해요
// List all accounts in your portfolio
ShowMessage(oCoinbase.REST_API.ListAccounts);
// Get details for a specific account by UUID
ShowMessage(oCoinbase.REST_API.GetAccount('account-uuid-here'));

REST API - 상품 및 시장 데이터

상품 엔드포인트는 이용 가능한 거래 쌍, 호가창 스냅샷, 과거 캔들 데이터, 최근 거래, 현재 서버 시간을 포함한 시장 데이터를 제공해요. 모두 공개 엔드포인트이므로 인증이 필요 없어요.

Method Description
GetPublicProducts 모든 이용 가능한 상품(거래 쌍)과 세부 정보를 목록으로 반환해요
GetPublicProduct ID(예: BTC-USD)로 단일 상품의 세부 정보를 반환해요
GetPublicProductBook 지정된 상품의 현재 호가창을 반환해요
GetPublicProductCandles 날짜 범위와 세분도에 따른 상품의 OHLCV 캔들 데이터를 반환해요
GetTrades 지정된 상품의 최근 거래를 반환해요
GetTime 현재 Coinbase 서버 시간을 반환해요

캔들 세분도 옵션

Value Description
ONE_MINUTE 1분 캔들
FIVE_MINUTE 5분 캔들
FIFTEEN_MINUTE 15분 캔들
THIRTY_MINUTE 30분 캔들
ONE_HOUR 1시간 캔들
TWO_HOUR 2시간 캔들
SIX_HOUR 6시간 캔들
ONE_DAY 일간 캔들
// Get all available products
ShowMessage(oCoinbase.REST_API.GetPublicProducts);
// Get details for BTC-USD
ShowMessage(oCoinbase.REST_API.GetPublicProduct('BTC-USD'));
// Get hourly candles for January 2024
ShowMessage(oCoinbase.REST_API.GetPublicProductCandles(
  'BTC-USD', '2024-01-01', '2024-01-31', 'ONE_HOUR'));
// Get recent trades
ShowMessage(oCoinbase.REST_API.GetTrades('BTC-USD'));

REST API - 주문

주문 엔드포인트는 완전한 주문 생명주기 관리를 제공해요. 새 주문(시장가, 지정가, 스탑)을 접수하거나 기존 주문을 조회하고, 주문을 취소하거나 실행 전에 주문 결과를 미리 볼 수 있어요.

Method Description
PlaceNewOrder 전체 파라미터를 제어하여 새 주문을 접수해요
PlaceMarketOrder 시장가 주문(현재 가격으로 매수 또는 매도) 접수를 위한 편의 메서드예요
PlaceLimitOrder 지정된 가격으로 지정가 주문 접수를 위한 편의 메서드예요
PlaceStopOrder 지정된 가격에서 실행되는 스탑 주문 접수를 위한 편의 메서드예요
ListOrders 상태 또는 상품으로 선택적 필터링이 가능한 주문의 페이지별 목록을 반환해요
GetOrder ID로 단일 주문의 세부 정보를 반환해요
CancelOrder ID로 미체결 주문 하나 이상을 취소해요
EditOrder 기존 주문을 수정해요 (예: 가격이나 수량 변경)
EditOrderPreview 실행 없이 주문 수정 결과를 미리 봐요
PreviewOrder 접수 없이 새 주문 결과를 미리 봐요 (예상 수수료, 슬리피지)
// Place a market buy order for 0.001 BTC
ShowMessage(oCoinbase.REST_API.PlaceMarketOrder(cosBuy, 'BTC-USD', 0.001));
// Place a limit buy order at $40,000
ShowMessage(oCoinbase.REST_API.PlaceLimitOrder(cosBuy, 'BTC-USD', 0.001, 40000));
// List all open orders
ShowMessage(oCoinbase.REST_API.ListOrders);
// Cancel an order by ID
oCoinbase.REST_API.CancelOrder('order-id-here');
팁: 실제 자금 위험 없이 예상 수수료와 실행 결과를 확인하려면 실제 주문 접수 전에 PreviewOrder를 사용하세요. 최종 실행 가격이 호가창 깊이에 따라 달라지는 시장가 주문에 특히 유용해요.

REST API - 체결

체결은 완료되거나 부분 체결된 주문을 구성하는 개별 실행을 나타내요. 단일 주문이 호가창의 여러 대기 주문과 매칭되면 여러 체결이 발생할 수 있어요. 주문 ID, 상품 ID, 또는 거래 ID로 체결을 조회할 수 있어요.

Method Description
GetFillsByOrderId 특정 주문의 모든 체결을 반환해요
GetFillsByProductId 특정 상품(예: BTC-USD)의 모든 체결을 반환해요
GetFillsByTradeId 특정 거래 ID의 체결 세부 정보를 반환해요
// Get fills for a specific order
ShowMessage(oCoinbase.REST_API.GetFillsByOrderId('order-id-here'));
// Get all fills for BTC-USD
ShowMessage(oCoinbase.REST_API.GetFillsByProductId('BTC-USD'));

REST API - 포지션

포지션 엔드포인트는 선물 포지션을 관리하는 데 사용해요. 미결 선물 포지션을 청산할 수 있어요.

Method Description
ClosePosition 지정된 상품의 미결 선물 포지션을 청산해요

전체 코드 예제

다음 예제는 Coinbase 연결, 계좌 목록 조회, 과거 캔들 데이터 조회, 실시간 티커 구독, 시장가 주문 접수 등 전체 워크플로를 보여줘요.

var
  oClient: TsgcWebSocketClient;
  oCoinbase: TsgcWSAPI_Coinbase;
begin
  // Create and configure the WebSocket client
  oClient := TsgcWebSocketClient.Create(nil);
  oCoinbase := TsgcWSAPI_Coinbase.Create(nil);
  oCoinbase.Client := oClient;
  // Configure API credentials
  oCoinbase.Coinbase.ApiKey := 'your_api_key';
  oCoinbase.Coinbase.ApiSecret := 'your_api_secret';
  // Connect to Coinbase
  oClient.Active := True;
  // REST: List all accounts in your portfolio
  ShowMessage(oCoinbase.REST_API.ListAccounts);
  // REST: Get hourly candles for BTC-USD
  ShowMessage(oCoinbase.REST_API.GetPublicProductCandles(
    'BTC-USD', '2024-01-01', '2024-01-31', 'ONE_HOUR'));
  // WebSocket: Subscribe to real-time ticker
  oCoinbase.SubscribeTicker('BTC-USD');
  // REST: Place a market buy order for 0.001 BTC
  ShowMessage(oCoinbase.REST_API.PlaceMarketOrder(cosBuy, 'BTC-USD', 0.001));
end;

참고 사항 및 모범 사례

API 키 권한

Coinbase 개발자 플랫폼에서 API 키를 생성할 때 최소 권한 원칙을 따르세요. 읽기 전용 대시보드에는 보기 권한만 활성화하세요. 거래 봇에는 거래 권한을 추가하되, 애플리케이션이 계좌 간 자금 이동이 필요하지 않으면 이체는 비활성화로 두세요.

주문 방향 상수

주문을 접수할 때 주문 방향에 Delphi 열거 상수를 사용하세요:

Constant Description
cosBuy 매수 주문 (기본 통화 취득)
cosSell 매도 주문 (기본 통화 판매)

Ticker vs. TickerBatch

모든 가격 업데이트가 실시간으로 필요할 때(예: 주문 실행 엔진)는 SubscribeTicker를 사용하세요. 주기적 스냅샷만 필요할 때(예: 대시보드)는 SubscribeTickerBatch를 사용하세요. 같은 데이터를 낮은 빈도로 제공하여 대역폭과 처리 부하를 절약해요.

속도 제한

Coinbase Advanced Trade는 REST API 호출에 속도 제한을 적용해요. 제한은 엔드포인트 범주(공개 vs. 비공개, 읽기 vs. 쓰기)에 따라 다양해요. 좁은 루프에서 REST 엔드포인트를 폴링하지 말고, 실시간 데이터에는 WebSocket 구독을 사용하고 REST 호출은 온디맨드 조회와 주문 작업에만 사용하세요.

팁: 견고한 거래 애플리케이션을 위해 실시간 주문 상태 업데이트에는 SubscribeUser 채널을, 실시간 시장 가격에는 SubscribeTicker를 조합해서 사용하세요. 거래 실행에는 REST PlaceMarketOrder 또는 PlaceLimitOrder 메서드를 사용하고, GetOrder를 폴링하는 대신 사용자 채널을 통해 실행을 확인하세요.