Coinbase API 更新 sgcWebSockets

· 功能

Coinbase Advanced Trade 是全球最广泛使用的加密货币交易所之一的专业交易平台。适用于 Delphi 的 TsgcWSAPI_Coinbase 组件提供对 WebSocket 和 REST API 的完整访问,支持实时行情流、订单管理、账户监控和期货余额追踪,所有功能均通过统一的 Delphi 接口实现。

目录

概述

Coinbase Advanced Trade API 取代了旧版 Coinbase Pro API,为专业加密货币交易提供现代化接口,支持多种加密资产的现货交易和期货合约。API 使用两种传输机制:

传输方式 使用场景 认证
WebSocket 实时流式传输行情数据、用户事件和期货余额 私有频道必须,公有频道可选
REST 账户查询、下单、产品数据和成交记录获取 所有私有端点必须

配置

使用 API 凭证配置 TsgcWSAPI_Coinbase 组件以访问私有端点。公有行情数据端点无需认证即可访问。

属性 类型 说明
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 提供行情数据和私有账户事件的实时流式频道。公有频道无需认证即可提供全市场数据,私有频道则流式推送账户专属事件。

公有频道

方法 说明
SubscribeHeartBeat / UnSubscribeHeartBeat 通过定期心跳消息监控指定产品的连接健康状态
SubscribeStatus / UnSubscribeStatus 产品状态更新,包括交易状态和拍卖信息
SubscribeTicker / UnSubscribeTicker 实时 Ticker 数据,包括价格、24 小时成交量和最优买卖价
SubscribeTickerBatch / UnSubscribeTickerBatch 以较低频率批量推送 Ticker 更新,降低带宽占用
SubscribeLevel2 / UnSubscribeLevel2 完整的 Level 2 订单簿快照和增量更新
SubscribeCandles / UnSubscribeCandles 用于图表展示的实时 OHLCV K 线数据
SubscribeMarketTrades / UnSubscribeMarketTrades 指定产品在交易所执行的所有成交实时推送

私有频道

方法 说明
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 投资组合。每个账户代表投资组合中的单一币种或资产,包含可用余额和锁定余额。

方法 说明
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 - 产品与行情数据

产品端点提供行情数据,包括可用交易对、订单簿快照、历史 K 线数据、近期成交和当前服务器时间。这些均为公有端点,无需认证。

方法 说明
GetPublicProducts 返回所有可用产品(交易对)及其详情的列表
GetPublicProduct 按 ID 返回单个产品的详情(如 BTC-USD)
GetPublicProductBook 返回指定产品的当前订单簿
GetPublicProductCandles 返回指定日期范围和粒度的产品 OHLCV K 线数据
GetTrades 返回指定产品的近期成交记录
GetTime 返回当前 Coinbase 服务器时间

K 线粒度选项

说明
ONE_MINUTE 1 分钟 K 线
FIVE_MINUTE 5 分钟 K 线
FIFTEEN_MINUTE 15 分钟 K 线
THIRTY_MINUTE 30 分钟 K 线
ONE_HOUR 1 小时 K 线
TWO_HOUR 2 小时 K 线
SIX_HOUR 6 小时 K 线
ONE_DAY 日 K 线
// 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 - 订单

订单端点提供完整的订单生命周期管理,支持下新单(市价、限价或止损)、查询现有订单、撤销订单以及执行前预览订单结果。

方法 说明
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 查询。

方法 说明
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 - 持仓

持仓端点用于管理期货持仓,支持平掉未平仓的期货持仓。

方法 说明
ClosePosition 平掉指定产品的未平仓期货持仓

完整代码示例

以下示例演示完整流程:连接到 Coinbase、列出账户、获取历史 K 线数据、订阅实时 Ticker 并下市价单。

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 密钥时,遵循最小权限原则。只读仪表盘只需启用 View 权限;交易机器人添加 Trade 权限,除非应用需要在账户间转移资金,否则不要启用 Transfer

订单方向常量

下单时,使用 Delphi 枚举常量指定订单方向:

常量 说明
cosBuy 买入订单(获取基础货币)
cosSell 卖出订单(卖出基础货币)

Ticker 与 TickerBatch 对比

当需要实时获取每次价格更新(如订单执行引擎)时使用 SubscribeTicker;当只需周期性快照(如仪表盘)时使用 SubscribeTickerBatch——以较低频率推送相同数据,节省带宽和处理开销。

频率限制

Coinbase Advanced Trade 对 REST API 调用实施频率限制,限制因端点类别(公有/私有、读/写)而异。避免在紧密循环中轮询 REST 端点;改用 WebSocket 订阅获取实时数据,将 REST 调用留给按需查询和订单操作。

提示:构建健壮的交易应用时,将 SubscribeUser 频道(实时订单状态更新)与 SubscribeTicker(实时市场价格)结合使用。通过 REST 的 PlaceMarketOrderPlaceLimitOrder 执行交易,并通过用户频道确认执行结果,而非轮询 GetOrder