sgcWebSockets 中 Binance API 的新方法

· 功能

sgcWebSockets 库持续扩展其 Binance 集成功能,此次新增了大量方法,覆盖现货 REST API、合约 REST API 以及 WebSocket 数据流。本文从技术角度对每个新方法、其参数及实用的 Delphi 代码示例进行详细说明,帮助您快速上手。

目录

  1. 现货 REST API 新方法
  2. 现货行情数据:UI K线、滚动窗口与交易日行情
  3. 现货订单管理:OCO、OTO、OTOCO 与 SOR 订单
  4. 现货账户:手续费、分配记录、频率限制与阻止的撮合
  5. 合约 REST API 新方法
  6. 合约行情数据:连续合约 K 线、溢价指数等
  7. 合约订单管理:修改、批量与强制平仓订单
  8. 合约账户:V3 接口、配置与手续费抵扣
  9. 现货 WebSocket 数据流新增
  10. 合约 WebSocket 数据流新增
  11. 完整示例

1. 现货 REST API 新方法

TsgcHTTP_API_Binance_Rest 类新增了行情数据接口、高级订单类型和账户查询方法。所有方法均可通过 REST 组件直接调用,或通过 TsgcWS_API_BinanceREST_API 属性访问。

行情数据接口

方法 说明 Binance 接口
GetUIKLines 针对 UI 展示优化的 K 线数据,格式与 GetKLines 相同,但经 Binance 后端针对图表渲染进行了调优。 /api/v3/uiKlines
GetRollingWindowTicker 滚动窗口价格变动统计,支持自定义窗口大小(如 1h、4h、1d),与固定 24 小时行情不同。 /api/v3/ticker
GetTradingDayTicker 基于交易日(UTC 00:00 至当前)计算的价格变动统计,支持单个或多个交易对。 /api/v3/ticker/tradingDay
GetPriceTickers 通过 JSON 数组一次性获取多个交易对的价格行情。 /api/v3/ticker/price

GetUIKLines

function GetUIKLines(const aSymbol: String;
  aInterval: TsgcHTTPBinanceChartIntervals; aStartTime: Int64 = 0;
  aEndTime: Int64 = 0; aLimit: Integer = 500): String;

GetKLinesGetUIKLines 的区别较为细微:UI 版本由 Binance 后端专为图表渲染进行优化,可能会对 K 线边界进行调整以改善视觉呈现。响应格式完全相同,可作为图表场景的直接替代。

var
  vJSON: string;
begin
  // Retrieve 1-hour UI-optimized klines for BTCUSDT
  vJSON := sgcBinanceREST.GetUIKLines('BTCUSDT', bcih1h, 0, 0, 100);
  Memo1.Lines.Add(vJSON);
end;

GetRollingWindowTicker

function GetRollingWindowTicker(const aSymbol: String = '';
  const aSymbols: String = ''; const aWindowSize: String = ''): String;

此方法在传统 Get24hrTicker 基础上支持自定义窗口大小。aWindowSize 的有效值包括 '1h''4h''1d',若省略则使用默认窗口。

var
  vJSON: string;
begin
  // Get 4-hour rolling window stats for ETHUSDT
  vJSON := sgcBinanceREST.GetRollingWindowTicker('ETHUSDT', '', '4h');
  Memo1.Lines.Add(vJSON);
  // Get rolling window for multiple symbols
  vJSON := sgcBinanceREST.GetRollingWindowTicker('',
    '["BTCUSDT","ETHUSDT"]', '1h');
  Memo1.Lines.Add(vJSON);
end;

GetTradingDayTicker

function GetTradingDayTicker(const aSymbol: String = '';
  const aSymbols: String = ''; const aType: String = ''): String;
var
  vJSON: string;
begin
  // Get trading day statistics for BTCUSDT (FULL response)
  vJSON := sgcBinanceREST.GetTradingDayTicker('BTCUSDT', '', 'FULL');
  Memo1.Lines.Add(vJSON);
end;

高级订单类型

Binance 推出了多种新的订单列表类型,超越了原有的 OCO。sgcWebSockets 库现已原生支持所有这些类型。

NewOrderListOCO(新版 OCO 格式)

新版 OCO 格式替代了旧版 NewOCO,引入了更灵活的高低价格配置。OCO 的每条腿均可独立设置订单类型、止损价、追踪增量和有效期。

function NewOrderListOCO(const aSymbol, aSide: String;
  aQuantity: Double; const aAboveType: String;
  const aBelowType: String;
  aAboveClientOrderId: String = '';
  aAboveIcebergQty: Double = 0; aAbovePrice: Double = 0;
  aAboveStopPrice: Double = 0; aAboveTrailingDelta: Int64 = 0;
  aAboveTimeInForce: String = '';
  aBelowClientOrderId: String = '';
  aBelowIcebergQty: Double = 0; aBelowPrice: Double = 0;
  aBelowStopPrice: Double = 0; aBelowTrailingDelta: Int64 = 0;
  aBelowTimeInForce: String = '';
  aListClientOrderId: String = '';
  aNewOrderRespType: String = '';
  aSelfTradePreventionMode: String = ''): String;
var
  vJSON: string;
begin
  // Place a new-format OCO: take-profit above + stop-loss below
  vJSON := sgcBinanceREST.NewOrderListOCO(
    'BTCUSDT',          // symbol
    'SELL',              // side
    0.001,              // quantity
    'LIMIT_MAKER',      // above type (take-profit)
    'STOP_LOSS_LIMIT',  // below type (stop-loss)
    '',                 // aboveClientOrderId
    0,                  // aboveIcebergQty
    72000.0,            // abovePrice (take-profit price)
    0,                  // aboveStopPrice
    0,                  // aboveTrailingDelta
    '',                 // aboveTimeInForce
    '',                 // belowClientOrderId
    0,                  // belowIcebergQty
    62000.0,            // belowPrice (limit price for stop)
    62500.0,            // belowStopPrice (trigger price)
    0,                  // belowTrailingDelta
    'GTC'               // belowTimeInForce
  );
  Memo1.Lines.Add(vJSON);
end;

NewOrderListOTO(触发下单)

OTO 订单列表由一个主动订单和一个待触发订单组成。当主动订单成交后,待触发订单将自动提交。这适用于设置入场订单并自动跟进后续操作。

function NewOrderListOTO(const aSymbol: String;
  const aWorkingType, aWorkingSide: String;
  aWorkingQuantity: Double; aWorkingPrice: Double;
  const aPendingType, aPendingSide: String;
  aPendingQuantity: Double;
  { ... additional optional parameters ... }
  ): String;
var
  vJSON: string;
begin
  // Buy BTCUSDT at limit, then automatically place a stop-loss sell
  vJSON := sgcBinanceREST.NewOrderListOTO(
    'BTCUSDT',
    'LIMIT', 'BUY',       // working order: limit buy
    0.001, 65000.0,        // working quantity and price
    'STOP_LOSS_LIMIT', 'SELL',  // pending: stop-loss sell
    0.001,                 // pending quantity
    '',                    // workingClientOrderId
    'GTC',                 // workingTimeInForce
    0,                     // workingIcebergQty
    '',                    // pendingClientOrderId
    62000.0,               // pendingPrice (limit)
    62500.0                // pendingStopPrice (trigger)
  );
  Memo1.Lines.Add(vJSON);
end;

NewOrderListOTOCO(触发 OCO)

结合 OTO 与 OCO 逻辑:主动订单成交后,自动触发一对 OCO(止盈 + 止损)。通过单次 API 调用即可实现完整的自动化入场与离场策略。

var
  vJSON: string;
begin
  // Entry: limit buy at 65000
  // On fill: places OCO with take-profit at 72000 and stop-loss at 62000
  vJSON := sgcBinanceREST.NewOrderListOTOCO(
    'BTCUSDT',
    'LIMIT', 'BUY',          // working order
    0.001, 65000.0,           // working qty & price
    'SELL',                   // pending side
    'LIMIT_MAKER',            // pending above type
    'STOP_LOSS_LIMIT',        // pending below type
    0.001,                   // pending quantity
    '',                      // workingClientOrderId
    'GTC',                   // workingTimeInForce
    0,                       // workingIcebergQty
    '',                      // pendingAboveClientOrderId
    72000.0,                 // pendingAbovePrice (take-profit)
    0,                       // pendingAboveStopPrice
    0,                       // pendingAboveTrailingDelta
    '',                      // pendingAboveTimeInForce
    0,                       // pendingAboveIcebergQty
    '',                      // pendingBelowClientOrderId
    62000.0,                 // pendingBelowPrice
    62500.0                  // pendingBelowStopPrice
  );
  Memo1.Lines.Add(vJSON);
end;

智能订单路由(SOR)

SOR 订单允许 Binance 通过跨多个流动性池路由来优化成交。新增两个方法:NewSOROrder 用于实盘执行,TestSOROrder 用于在不实际下单的情况下进行验证。

function NewSOROrder(const aSymbol, aSide, aType: String;
  aQuantity: Double; aTimeInForce: String = '';
  aPrice: Double = 0; aNewClientOrderId: String = '';
  aNewOrderRespType: String = '';
  aIcebergQty: Double = 0;
  aSelfTradePreventionMode: String = '';
  aStrategyId: Int64 = 0; aStrategyType: Integer = 0): String;
var
  vJSON: string;
begin
  // Place a SOR limit order
  vJSON := sgcBinanceREST.NewSOROrder(
    'BTCUSDT', 'BUY', 'LIMIT',
    0.001,             // quantity
    'GTC',             // timeInForce
    65000.0            // price
  );
  Memo1.Lines.Add(vJSON);
  // Test a SOR order without execution
  vJSON := sgcBinanceREST.TestSOROrder('BTCUSDT', 'BUY', 'LIMIT',
    0.001, 'GTC', 65000.0);
  Memo1.Lines.Add(vJSON);
end;

CancelReplaceOrder

原子性地取消现有订单并提交新订单。对于需要修改订单且不希望在分开的取消和下单操作之间出现持仓缺口的策略而言,此方法至关重要。

var
  vJSON: string;
begin
  // Cancel order 123456 and replace it with a new limit buy
  vJSON := sgcBinanceREST.CancelReplaceOrder(
    'BTCUSDT', 'BUY', 'LIMIT',
    'STOP_ON_FAILURE',   // mode: only place new if cancel succeeds
    'GTC',               // timeInForce
    0.001,               // quantity
    0,                   // quoteOrderQty
    64500.0,             // new price
    '',                  // cancelNewClientOrderId
    '',                  // cancelOrigClientOrderId
    123456               // cancelOrderId
  );
  Memo1.Lines.Add(vJSON);
end;

账户与查询接口

方法 说明
GetAccountInformation(aOmitZeroBalances) 新增 aOmitZeroBalances 参数。设为 True 时,响应中将排除零余额资产。
GetOrderRateLimitUsage 返回当前订单计数和频率限制使用情况,适用于高频场景下控制 API 调用频率。
GetPreventedMatches 查询被阻止的自成交撮合记录,支持按交易对、订单 ID 或阻止撮合 ID 过滤,并支持分页。
GetAllocations 获取 SOR 订单的分配情况,展示订单在各流动性池中的分布。
GetAccountCommission 返回指定交易对的挂单/吃单手续费费率。
var
  vJSON: string;
begin
  // Get account info, omitting zero balances
  vJSON := sgcBinanceREST.GetAccountInformation(True);
  Memo1.Lines.Add(vJSON);
  // Check order rate limit usage
  vJSON := sgcBinanceREST.GetOrderRateLimitUsage;
  Memo1.Lines.Add(vJSON);
  // Get commission rates for BTCUSDT
  vJSON := sgcBinanceREST.GetAccountCommission('BTCUSDT');
  Memo1.Lines.Add(vJSON);
  // Get prevented matches for a symbol
  vJSON := sgcBinanceREST.GetPreventedMatches('BTCUSDT');
  Memo1.Lines.Add(vJSON);
  // Get SOR allocations for a symbol
  vJSON := sgcBinanceREST.GetAllocations('BTCUSDT');
  Memo1.Lines.Add(vJSON);
end;

注意: NewOrderTestNewOrder 方法同样新增了可选参数:aSelfTradePreventionModeaStrategyIdaStrategyTypeCancelOrder 方法新增了 aCancelRestrictions 参数,用于条件性取消。这些新增内容向下兼容——现有代码无需任何修改即可继续使用。


2. 合约 REST API 新方法

TsgcHTTP_API_Binance_Futures_Rest 类新增了最多方法,涵盖行情数据、订单管理、账户配置和数据流管理。所有方法均支持 USDT 本位合约和币本位合约,通过 FuturesContracts 属性进行控制。

合约行情数据

方法 说明
GetContinuousKLines连续合约的 K 线数据,需指定交易对、合约类型(如 'PERPETUAL''CURRENT_QUARTER')及时间间隔。
GetIndexPriceKLines基于交易对指数价格的 K 线数据。
GetMarkPriceKLines基于标记价格的 K 线数据。
GetPremiumIndexKLines溢价指数 K 线数据,用于基差计算和资金费率分析。
GetFundingInfo返回所有交易对的资金费率信息,包括结算周期及费率上下限。
GetPriceTickerV2V2 价格行情,响应格式有所改进。
GetIndexInfo返回合成指数交易对的指数价格及成分数据。
GetAssetIndex多资产模式下保证金计算所需的资产指数价格。
GetConstituents查询指定合成指数的成分及权重。
GetDeliveryPrice季度/双季度合约的历史交割价格。
GetBasis指定交易对及合约类型的基差数据(期货与现货价差)。
var
  vJSON: string;
begin
  // Continuous klines for BTCUSDT perpetual, 1h interval
  vJSON := sgcBinanceFutREST.GetContinuousKLines(
    'BTCUSDT', 'PERPETUAL', bcih1h, 0, 0, 100);
  Memo1.Lines.Add(vJSON);
  // Mark price klines for ETHUSDT, 15m interval
  vJSON := sgcBinanceFutREST.GetMarkPriceKLines('ETHUSDT', bcih15m);
  Memo1.Lines.Add(vJSON);
  // Index price klines
  vJSON := sgcBinanceFutREST.GetIndexPriceKLines('BTCUSDT', bcih4h);
  Memo1.Lines.Add(vJSON);
  // Premium index klines for funding analysis
  vJSON := sgcBinanceFutREST.GetPremiumIndexKLines('BTCUSDT', bcih1h);
  Memo1.Lines.Add(vJSON);
  // Get funding info for all symbols
  vJSON := sgcBinanceFutREST.GetFundingInfo;
  Memo1.Lines.Add(vJSON);
  // V2 price ticker
  vJSON := sgcBinanceFutREST.GetPriceTickerV2('BTCUSDT');
  Memo1.Lines.Add(vJSON);
  // Basis data
  vJSON := sgcBinanceFutREST.GetBasis('BTCUSDT', 'PERPETUAL', oip1h, 30);
  Memo1.Lines.Add(vJSON);
  // Delivery price history
  vJSON := sgcBinanceFutREST.GetDeliveryPrice('BTCUSD');
  Memo1.Lines.Add(vJSON);
end;

合约订单管理

新增的合约订单方法提供测单、订单修改、批量处理和强制平仓查询功能。

方法 说明
TestNewOrder验证新合约订单而不实际下单,参数签名与 NewOrder 相同。
ModifyOrder修改已有未成交订单的价格、数量或价格匹配模式。
NewBatchOrders通过 JSON 数组在单次请求中最多提交 5 笔订单。
ModifyBatchOrders在单次请求中最多修改 5 笔已有订单。
CancelBatchOrders通过订单 ID 列表或客户订单 ID 列表批量取消订单。
GetOrderAmendment获取指定订单的修改(变更)历史。
CountdownCancelAll设置倒计时(毫秒),到期后自动取消指定交易对的所有未成交订单。
GetForceOrders查询强制平仓订单,支持可选过滤条件。
GetADLQuantile获取持仓的自动减仓(ADL)分位数估算值。

合约 NewOrder 签名同样新增了参数:aPriceMatchaSelfTradePreventionModeaGoodTillDateaPriceProtect

var
  vJSON: string;
begin
  // Test a futures order without execution
  vJSON := sgcBinanceFutREST.TestNewOrder(
    'BTCUSDT', 'BUY', '', 'LIMIT',
    'GTC', 0.001, 'false', 65000.0);
  Memo1.Lines.Add('TestNewOrder: ' + vJSON);
  // Modify an existing order's price
  vJSON := sgcBinanceFutREST.ModifyOrder('BTCUSDT', 123456, '',
    'BUY', 0.001, 64800.0);
  Memo1.Lines.Add('ModifyOrder: ' + vJSON);
  // Cancel multiple orders at once
  vJSON := sgcBinanceFutREST.CancelBatchOrders('BTCUSDT',
    '[123456,123457,123458]');
  Memo1.Lines.Add('CancelBatch: ' + vJSON);
  // Set countdown cancel: cancel all BTCUSDT orders in 30 seconds
  vJSON := sgcBinanceFutREST.CountdownCancelAll('BTCUSDT', 30000);
  Memo1.Lines.Add('Countdown: ' + vJSON);
  // Query forced liquidation orders
  vJSON := sgcBinanceFutREST.GetForceOrders('BTCUSDT');
  Memo1.Lines.Add('ForceOrders: ' + vJSON);
  // ADL quantile estimation
  vJSON := sgcBinanceFutREST.GetADLQuantile('BTCUSDT');
  Memo1.Lines.Add('ADL: ' + vJSON);
end;

合约账户与配置

新增了多个 V3 账户接口以及配置和手续费管理方法。

方法 说明
GetAccountBalanceV3V3 账户余额,改进了多资产保证金支持。
GetAccountInformationV3V3 账户详情,包含多资产保证金模式及更新的费率等级。
GetPositionInformationV3V3 持仓数据,附加精度字段。
GetCommissionRate返回指定合约交易对当前的挂单/吃单手续费费率。
GetAccountConfig账户级别配置:费率等级、持仓模式、多资产保证金模式。
GetSymbolConfig逐交易对配置:杠杆倍数、保证金类型和持仓模式。
GetOrderRateLimit逐交易对的当前订单频率限制状态。
GetApiTradingStatusAPI 交易状态及可能触发交易限制的指标。
ChangeMultiAssetsMode启用或禁用 USDT 本位合约的多资产保证金模式。
GetMultiAssetsMode查询当前多资产保证金模式设置。
SetFeeBurn启用或禁用 BNB 手续费抵扣(享受折扣)。
GetFeeBurn查询当前手续费抵扣设置。

Listen Key 管理

三个专用方法现可通过 REST 直接管理合约用户数据流的 Listen Key 生命周期,独立于 WebSocket 组件:

方法 说明
CreateListenKey为用户数据流生成新的 Listen Key(POST)。
KeepAliveListenKey延长 Listen Key 的有效期(PUT),需每 60 分钟调用一次。
CloseListenKey使 Listen Key 失效并关闭(DELETE)。
var
  vJSON: string;
begin
  // V3 balance and account info
  vJSON := sgcBinanceFutREST.GetAccountBalanceV3;
  Memo1.Lines.Add('V3 Balance: ' + vJSON);
  vJSON := sgcBinanceFutREST.GetAccountInformationV3;
  Memo1.Lines.Add('V3 Account: ' + vJSON);
  vJSON := sgcBinanceFutREST.GetPositionInformationV3('BTCUSDT');
  Memo1.Lines.Add('V3 Position: ' + vJSON);
  // Commission rate
  vJSON := sgcBinanceFutREST.GetCommissionRate('BTCUSDT');
  Memo1.Lines.Add('Commission: ' + vJSON);
  // Account and symbol configuration
  vJSON := sgcBinanceFutREST.GetAccountConfig;
  Memo1.Lines.Add('AccountConfig: ' + vJSON);
  vJSON := sgcBinanceFutREST.GetSymbolConfig('BTCUSDT');
  Memo1.Lines.Add('SymbolConfig: ' + vJSON);
  // Enable multi-asset margin mode
  vJSON := sgcBinanceFutREST.ChangeMultiAssetsMode(True);
  Memo1.Lines.Add('MultiAssets: ' + vJSON);
  // Enable BNB fee burn
  vJSON := sgcBinanceFutREST.SetFeeBurn(True);
  Memo1.Lines.Add('FeeBurn: ' + vJSON);
  // Check API trading status
  vJSON := sgcBinanceFutREST.GetApiTradingStatus('BTCUSDT');
  Memo1.Lines.Add('TradingStatus: ' + vJSON);
  // Listen key lifecycle (REST-only approach)
  vJSON := sgcBinanceFutREST.CreateListenKey;
  Memo1.Lines.Add('ListenKey: ' + vJSON);
end;

3. 现货 WebSocket 数据流新增

TsgcWS_API_Binance 类新增了三种数据流类型,各自提供订阅和取消订阅方法。

方法 数据流 说明
SubscribeAvgPrice / UnSubscribeAvgPrice <symbol>@avgPrice 指定交易对的实时均价数据流。
SubscribeRollingWindowTicker <symbol>@ticker_<window> 支持自定义窗口大小(1h、4h、1d)的滚动窗口统计。
SubscribeAllRollingWindowTickers !ticker_<window>@arr 指定窗口大小下所有交易对的滚动窗口统计。

新增枚举类型 TsgcWSBinanceRollingWindowSize,用于类型安全地指定窗口大小:

TsgcWSBinanceRollingWindowSize = (brw1h, brw4h, brw1d);
procedure TForm1.btnSubscribeClick(Sender: TObject);
begin
  if not sgcWebSocketClient1.Active then
    sgcWebSocketClient1.Active := True;
  // Subscribe to average price updates for BTCUSDT
  sgcBinance.SubscribeAvgPrice('btcusdt');
  // Subscribe to 1-hour rolling window ticker for ETHUSDT
  sgcBinance.SubscribeRollingWindowTicker('ethusdt', brw1h);
  // Subscribe to all tickers with a 4-hour rolling window
  sgcBinance.SubscribeAllRollingWindowTickers(brw4h);
end;
procedure TForm1.btnUnsubscribeClick(Sender: TObject);
begin
  sgcBinance.UnSubscribeAvgPrice('btcusdt');
  sgcBinance.UnSubscribeRollingWindowTicker('ethusdt', brw1h);
  sgcBinance.UnSubscribeAllRollingWindowTickers(brw4h);
end;

4. 合约 WebSocket 数据流新增

TsgcWS_API_Binance_Futures 类新增了最多的 WebSocket 订阅,涵盖连续合约、合成指数、资产指数、指数价格和标记价格 K 线。

方法 数据流 说明
SubscribeContinuousKLine<pair>_<contract>@continuousKline_<interval>连续合约的 K 线数据流,需指定交易对、合约类型和时间间隔。
SubscribeCompositeIndex<symbol>@compositeIndex含成分细分的合成指数价格数据流。
SubscribeContractInfo!contractInfo合约信息数据流,在上市、下架和档位变更时推送更新。
SubscribeAssetIndex / SubscribeAllAssetIndex<symbol>@assetIndex / !assetIndex@arr多资产保证金计算所需的资产指数价格,支持单交易对或全市场。
SubscribeIndexPrice<pair>@indexPrice指定交易对的指数价格数据流,支持可选更新速度参数。
SubscribeIndexPriceKLine<pair>@indexPriceKline_<interval>可配置时间间隔的指数价格 K 线数据流。
SubscribeMarkPriceKLine<symbol>@markPriceKline_<interval>标记价格 K 线数据流,用于追踪强制平仓所用的标记价格。
procedure TForm1.SubscribeFuturesStreams;
begin
  if not sgcWebSocketClient1.Active then
    sgcWebSocketClient1.Active := True;
  // Continuous kline for BTCUSDT perpetual contract, 1h interval
  sgcBinanceFutures.SubscribeContinuousKLine('btcusdt',
    'perpetual', bci1h);
  // Composite index stream
  sgcBinanceFutures.SubscribeCompositeIndex('defiusdt');
  // Contract info updates (no symbol needed)
  sgcBinanceFutures.SubscribeContractInfo;
  // Asset index for a single symbol
  sgcBinanceFutures.SubscribeAssetIndex('btcusd');
  // All asset index prices
  sgcBinanceFutures.SubscribeAllAssetIndex;
  // Index price with default update speed
  sgcBinanceFutures.SubscribeIndexPrice('btcusdt');
  // Index price kline, 15m interval
  sgcBinanceFutures.SubscribeIndexPriceKLine('btcusdt', bci15m);
  // Mark price kline, 5m interval
  sgcBinanceFutures.SubscribeMarkPriceKLine('btcusdt', bci5m);
end;

5. 完整示例

示例一:现货 REST + WebSocket 组合(VCL 应用)

典型模式是使用 REST API 下单,并通过 WebSocket API 接收实时行情。以下示例演示了如何通过 TsgcWS_API_Binance 组件同时使用两者。

unit MainForm;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  StdCtrls, sgcWebSocket_Classes, sgcWebSocket_API_Binance,
  sgcWebSocket_APIs, sgcBase_Classes, sgcWebSocket_Client, sgcWebSocket;
type
  TForm1 = class(TForm)
    sgcWebSocketClient1: TsgcWebSocketClient;
    sgcBinance: TsgcWSAPI_Binance;
    btnConnect: TButton;
    btnGetTicker: TButton;
    btnPlaceSOROrder: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure btnConnectClick(Sender: TObject);
    procedure btnGetTickerClick(Sender: TObject);
    procedure btnPlaceSOROrderClick(Sender: TObject);
    procedure sgcWebSocketClient1Message(Connection: TsgcWSConnection;
      const Text: string);
  end;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Configure API credentials
  sgcBinance.Binance.ApiKey := 'your-api-key';
  sgcBinance.Binance.ApiSecret := 'your-api-secret';
  sgcBinance.Binance.TestNet := True;  // use testnet during development
  sgcBinance.Binance.UserStream := False;
end;
procedure TForm1.btnConnectClick(Sender: TObject);
begin
  sgcWebSocketClient1.Active := True;
  // Subscribe to new streams
  sgcBinance.SubscribeAvgPrice('btcusdt');
  sgcBinance.SubscribeRollingWindowTicker('btcusdt', brw1h);
end;
procedure TForm1.btnGetTickerClick(Sender: TObject);
begin
  // Use new REST endpoints via the integrated REST_API property
  Memo1.Lines.Add(sgcBinance.REST_API.GetTradingDayTicker('BTCUSDT'));
  Memo1.Lines.Add(sgcBinance.REST_API.GetRollingWindowTicker('BTCUSDT',
    '', '4h'));
  Memo1.Lines.Add(sgcBinance.REST_API.GetAccountCommission('BTCUSDT'));
end;
procedure TForm1.btnPlaceSOROrderClick(Sender: TObject);
begin
  // Test a Smart Order Routing order
  Memo1.Lines.Add(sgcBinance.REST_API.TestSOROrder(
    'BTCUSDT', 'BUY', 'LIMIT', 0.001, 'GTC', 65000.0));
end;
procedure TForm1.sgcWebSocketClient1Message(Connection: TsgcWSConnection;
  const Text: string);
begin
  Memo1.Lines.Add(Text);
end;
end.

示例二:合约 REST + WebSocket(控制台应用)

控制台应用非常适合无界面机器人和后台服务。以下示例演示了在控制台环境中使用新合约方法。

program BinanceFuturesConsole;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  Classes, SysUtils,
  sgcWebSocket, sgcWebSocket_APIs, sgcWebSocket_Types,
  sgcWebSocket_Classes, sgcHTTP_API_Binance;
var
  FutREST: TsgcHTTP_API_Binance_Futures_Rest;
  vJSON: string;
begin
  try
    FutREST := TsgcHTTP_API_Binance_Futures_Rest.Create(nil);
    try
      FutREST.BinanceOptions.ApiKey := 'your-api-key';
      FutREST.BinanceOptions.ApiSecret := 'your-api-secret';
      FutREST.BinanceOptions.TestNet := True;
      FutREST.FuturesContracts := bfchUSDT;
      // New market data methods
      vJSON := FutREST.GetFundingInfo;
      WriteLn('Funding Info: ', Copy(vJSON, 1, 200), '...');
      vJSON := FutREST.GetPriceTickerV2('BTCUSDT');
      WriteLn('PriceV2: ', vJSON);
      vJSON := FutREST.GetContinuousKLines('BTCUSDT',
        'PERPETUAL', bcih1h, 0, 0, 5);
      WriteLn('ContinuousKLines: ', Copy(vJSON, 1, 200), '...');
      // V3 account endpoints
      vJSON := FutREST.GetAccountBalanceV3;
      WriteLn('V3 Balance: ', Copy(vJSON, 1, 200), '...');
      // Account configuration
      vJSON := FutREST.GetAccountConfig;
      WriteLn('Config: ', vJSON);
      vJSON := FutREST.GetSymbolConfig('BTCUSDT');
      WriteLn('SymbolConfig: ', vJSON);
      // Commission and fee management
      vJSON := FutREST.GetCommissionRate('BTCUSDT');
      WriteLn('Commission: ', vJSON);
      vJSON := FutREST.GetFeeBurn;
      WriteLn('FeeBurn: ', vJSON);
      // Listen key management
      vJSON := FutREST.CreateListenKey;
      WriteLn('ListenKey: ', vJSON);
    finally
      FutREST.Free;
    end;
  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.

示例三:OTOCO 订单策略

OTOCO 订单类型代表最完整的自动化交易生命周期:单次调用即可提交入场订单,成交后自动设置止盈和止损。

procedure TForm1.PlaceOTOCOStrategy;
var
  vResult: string;
begin
  // Strategy: buy ETHUSDT at 3400, take profit at 3600, stop-loss at 3300
  vResult := sgcBinance.REST_API.NewOrderListOTOCO(
    'ETHUSDT',
    // Working order: limit buy entry
    'LIMIT',              // workingType
    'BUY',                // workingSide
    0.1,                  // workingQuantity
    3400.0,               // workingPrice
    // Pending OCO (triggered after entry fills)
    'SELL',                // pendingSide
    'LIMIT_MAKER',         // pendingAboveType (take-profit)
    'STOP_LOSS_LIMIT',     // pendingBelowType (stop-loss)
    0.1,                  // pendingQuantity
    '',                   // workingClientOrderId
    'GTC',                // workingTimeInForce
    0,                    // workingIcebergQty
    '',                   // pendingAboveClientOrderId
    3600.0,               // pendingAbovePrice (take-profit target)
    0,                    // pendingAboveStopPrice
    0,                    // pendingAboveTrailingDelta
    '',                   // pendingAboveTimeInForce
    0,                    // pendingAboveIcebergQty
    '',                   // pendingBelowClientOrderId
    3250.0,               // pendingBelowPrice (stop-loss limit)
    3300.0                // pendingBelowStopPrice (trigger)
  );
  if Pos('"orderListId"', vResult) > 0 then
    Memo1.Lines.Add('OTOCO placed successfully')
  else
    Memo1.Lines.Add('OTOCO error: ' + vResult);
end;

汇总

下表汇总了各类组件新增方法数量:

组件 类名 新增方法
现货 REST API TsgcHTTP_API_Binance_Rest GetUIKLines、GetRollingWindowTicker、GetTradingDayTicker、NewOrderListOCO、NewOrderListOTO、NewOrderListOTOCO、NewSOROrder、TestSOROrder、CancelReplaceOrder、GetOrderRateLimitUsage、GetPreventedMatches、GetAllocations、GetAccountCommission
合约 REST API TsgcHTTP_API_Binance_Futures_Rest TestNewOrder、ModifyOrder、NewBatchOrders、ModifyBatchOrders、CancelBatchOrders、GetOrderAmendment、CountdownCancelAll、GetForceOrders、GetADLQuantile、GetAccountBalanceV3、GetAccountInformationV3、GetPositionInformationV3、GetCommissionRate、GetAccountConfig、GetSymbolConfig、GetOrderRateLimit、GetApiTradingStatus、ChangeMultiAssetsMode、GetMultiAssetsMode、SetFeeBurn、GetFeeBurn、GetContinuousKLines、GetIndexPriceKLines、GetMarkPriceKLines、GetPremiumIndexKLines、GetFundingInfo、GetPriceTickerV2、GetIndexInfo、GetAssetIndex、GetConstituents、GetDeliveryPrice、GetBasis、CreateListenKey、KeepAliveListenKey、CloseListenKey
现货 WebSocket TsgcWS_API_Binance SubscribeAvgPrice、SubscribeRollingWindowTicker、SubscribeAllRollingWindowTickers(及对应的 UnSubscribe 方法)
合约 WebSocket TsgcWS_API_Binance_Futures SubscribeContinuousKLine、SubscribeCompositeIndex、SubscribeContractInfo、SubscribeAssetIndex、SubscribeAllAssetIndex、SubscribeIndexPrice、SubscribeIndexPriceKLine、SubscribeMarkPriceKLine(及对应的 UnSubscribe 方法)

重要提示: 所有涉及下单、修改或取消订单的交易方法均需有效的 ApiKeyApiSecret 凭证。强烈建议在上线前通过设置 TestNet := True 在 Binance 测试网进行开发和测试,并确保 API 密钥权限(交易、保证金、合约)与您要执行的操作一致。

向下兼容: 所有新增内容均向下兼容。现有方法签名通过默认参数值进行扩展,因此此前编译的代码无需任何修改即可继续正常使用。新增参数(aSelfTradePreventionModeaStrategyIdaPriceMatch 等)默认为空值或零值,API 将使用其标准行为。