sgcWebSockets의 새 Binance API 메서드

· 기능

sgcWebSockets 라이브러리는 Spot REST API, Futures REST API, WebSocket 스트림을 포함하는 중요한 새 메서드 모음을 추가하며 Binance 통합을 계속 확장하고 있어요. 이 글은 각 새 메서드, 매개변수, 그리고 빠르게 시작할 수 있는 실용적인 Delphi 코드 예제에 대한 기술적 분석을 제공해요.

목차

  1. 새로운 Spot REST API 메서드
  2. Spot 시장 데이터: UI KLines, Rolling Window & Trading Day Tickers
  3. Spot 주문 관리: OCO, OTO, OTOCO & SOR 주문
  4. Spot 계정: 수수료, 할당, 요청 제한 & 방지된 매칭
  5. 새로운 Futures REST API 메서드
  6. Futures 시장 데이터: Continuous KLines, Premium Index & More
  7. Futures 주문 관리: 수정, 일괄 & 강제 주문
  8. Futures 계정: V3 엔드포인트, 설정 & 수수료 소각
  9. 새로운 Spot WebSocket 스트림
  10. 새로운 Futures WebSocket 스트림
  11. 완전한 작동 예제

1. 새로운 Spot REST API 메서드

TsgcHTTP_API_Binance_Rest 클래스에 새로운 시장 데이터 엔드포인트, 고급 주문 유형, 계정 조회 메서드가 추가되었어요. 모든 메서드는 REST 컴포넌트를 통해 직접 접근하거나 TsgcWS_API_BinanceREST_API 속성을 통해 접근할 수 있어요.

시장 데이터 Endpoints

메서드 설명 Binance Endpoint
GetUIKLines UI 표시를 위해 최적화된 kline/캔들스틱 데이터예요. GetKLines와 동일한 형식으로 데이터를 반환하지만 차트 렌더링에 맞게 최적화되어 있어요. /api/v3/uiKlines
GetRollingWindowTicker 롤링 윈도우 가격 변동 통계예요. 고정된 24시간 티커와 달리 설정 가능한 윈도우 크기(예: 1h, 4h, 1d)를 지원해요. /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 백엔드에서 차트 렌더링을 위해 최적화되어 시각적 표현을 개선하기 위해 수정된 kline 경계를 반환할 수 있어요. 응답 형식은 동일하므로 모든 차트 작업에 바로 대체할 수 있어요.

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 (New OCO Format)

새로운 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 (One-Triggers-the-Other)

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 (One-Triggers-an-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;

Smart Order Routing (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로 설정하면 잔고가 0인 자산이 응답에서 제외돼요.
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 메서드도 새로운 선택적 매개변수 aSelfTradePreventionMode, aStrategyId, aStrategyType으로 확장되었어요. CancelOrder 메서드는 이제 조건부 취소를 위한 aCancelRestrictions 매개변수를 허용해요. 이러한 추가 사항은 하위 호환성을 유지해요 — 기존 코드는 변경 없이 계속 작동해요.

2. 새로운 Futures REST API 메서드

TsgcHTTP_API_Binance_Futures_Rest 클래스에 시장 데이터, 주문 관리, 계정 설정, 스트림 관리를 포함하는 가장 많은 새 메서드 모음이 추가되었어요. 모든 메서드는 FuturesContracts 속성으로 제어하는 USDT-M과 COIN-M 선물 모두에서 작동해요.

Futures 시장 데이터

메서드 설명
GetContinuousKLines연속 계약의 kline/캔들스틱 데이터예요. 페어, 계약 유형(예: 'PERPETUAL', 'CURRENT_QUARTER'), 인터벌이 필요해요.
GetIndexPriceKLines거래 페어의 인덱스 가격을 기반으로 한 kline 데이터예요.
GetMarkPriceKLines심볼의 마크 가격을 기반으로 한 kline 데이터예요.
GetPremiumIndexKLines기저 계산 및 자금 조달 비율 분석을 위한 프리미엄 인덱스 kline 데이터예요.
GetFundingInfo자금 조달 인터벌과 상한/하한 비율을 포함한 모든 심볼의 자금 조달 비율 정보를 반환해요.
GetPriceTickerV2개선된 응답 형식을 가진 V2 가격 티커예요.
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;

Futures 주문 관리

새로운 Futures 주문 메서드는 테스트 주문, 주문 수정, 일괄 처리, 청산 조회를 제공해요.

메서드 설명
TestNewOrder실제로 접수하지 않고 새 선물 주문을 검증해요. NewOrder 서명을 그대로 반영해요.
ModifyOrder기존 미체결 주문의 가격, 수량, 가격 매칭 모드를 수정해요.
NewBatchOrders주문 객체의 JSON 배열을 통해 단일 요청으로 최대 5개의 주문을 접수해요.
ModifyBatchOrders단일 요청으로 최대 5개의 기존 주문을 수정해요.
CancelBatchOrders주문 ID 목록 또는 클라이언트 주문 ID 목록으로 여러 주문을 취소해요.
GetOrderAmendment주문의 수정 이력을 가져와요.
CountdownCancelAll카운트다운 타이머(밀리초)를 설정하며, 만료 후 심볼의 모든 미체결 주문이 취소돼요.
GetForceOrders선택적 필터링을 통해 강제 청산 주문을 조회해요.
GetADLQuantile포지션에 대한 ADL(자동 디레버리징) 분위수 추정값을 가져와요.

Futures의 NewOrder 서명도 새로운 매개변수 aPriceMatch, aSelfTradePreventionMode, aGoodTillDate, aPriceProtect로 확장되었어요.

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;

Futures Account & 설정

Several V3 account endpoints have been added alongside configuration and fee management methods.

메서드 설명
GetAccountBalanceV3개선된 다중 자산 마진 지원이 포함된 V3 계정 잔고예요.
GetAccountInformationV3다중 자산 마진 모드와 업데이트된 수수료 등급이 포함된 V3 계정 세부 정보예요.
GetPositionInformationV3추가 정밀도 필드가 포함된 V3 포지션 데이터예요.
GetCommissionRate특정 선물 심볼의 현재 메이커/테이커 수수료율을 반환해요.
GetAccountConfig계정 수준 설정이에요: 수수료 등급, 포지션 모드, 다중 자산 마진 모드.
GetSymbolConfig심볼별 설정이에요: 레버리지, 마진 유형, 포지션 모드.
GetOrderRateLimit심볼별 현재 주문 요청 제한 상태예요.
GetApiTradingStatusAPI 거래 상태와 거래 제한을 트리거할 수 있는 지표예요.
ChangeMultiAssetsModeUSDT-M 선물의 다중 자산 마진 모드를 활성화 또는 비활성화해요.
GetMultiAssetsMode현재 다중 자산 마진 모드 설정을 조회해요.
SetFeeBurnBNB 수수료 소각을 활성화 또는 비활성화해요(할인된 가격으로 BNB로 수수료 납부).
GetFeeBurn현재 수수료 소각 설정을 조회해요.

Listen Key Management

세 가지 전용 메서드가 이제 WebSocket 컴포넌트와 독립적으로 REST를 통해 직접 Futures 사용자 데이터 스트림 수신 키 라이프사이클을 처리해요:

메서드 설명
CreateListenKey사용자 데이터 스트림의 새 수신 키를 생성해요(POST).
KeepAliveListenKey수신 키의 유효성을 연장해요(PUT). 60분마다 호출해야 해요.
CloseListenKey수신 키를 무효화하고 닫아요(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. 새로운 Spot WebSocket 스트림

TsgcWS_API_Binance 클래스에 구독 및 구독 취소 메서드가 있는 세 가지 새로운 스트림 유형이 추가되었어요.

메서드 Stream 설명
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. 새로운 Futures WebSocket 스트림

TsgcWS_API_Binance_Futures 클래스에 가장 많은 새로운 WebSocket 스트림 구독이 추가되었어요. 연속 계약, 복합 인덱스, 자산 인덱스, 인덱스 가격, 마크 가격 kline을 포함해요.

메서드 Stream 설명
SubscribeContinuousKLine<pair>_<contract>@continuousKline_<interval>연속 계약의 kline 스트림이에요. 페어, 계약 유형, 인터벌이 필요해요.
SubscribeCompositeIndex<symbol>@compositeIndex구성 요소 분석이 포함된 복합 인덱스 가격 스트림이에요.
SubscribeContractInfo!contractInfo계약 정보 스트림이에요. 상장, 상장폐지, 브래킷 변경에 대한 업데이트를 푸시해요.
SubscribeAssetIndex / SubscribeAllAssetIndex<symbol>@assetIndex / !assetIndex@arr다중 자산 마진 계산을 위한 자산 인덱스 가격이에요. 심볼별 또는 전체 시장.
SubscribeIndexPrice<pair>@indexPrice거래 페어의 인덱스 가격 스트림이에요. 선택적 업데이트 속도 매개변수를 지원해요.
SubscribeIndexPriceKLine<pair>@indexPriceKline_<interval>설정 가능한 인터벌의 인덱스 가격 kline/캔들스틱 스트림이에요.
SubscribeMarkPriceKLine<symbol>@markPriceKline_<interval>청산 계산에 사용되는 마크 가격을 추적하기 위한 마크 가격 kline 스트림이에요.
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. 완전한 작동 예제

예제 1: Spot 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.

예제 2: Futures REST + WebSocket (콘솔 애플리케이션)

콘솔 애플리케이션은 헤드리스 봇과 백그라운드 서비스에 이상적이에요. 다음 예제는 콘솔 컨텍스트에서 새로운 Futures 메서드를 사용하는 방법을 보여줘요.

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.

예제 3: 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;

요약

다음 표는 각 클래스에 추가된 새 메서드 수를 요약해요:

컴포넌트 Class 새로운 메서드
현물 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
Spot WebSocket TsgcWS_API_Binance SubscribeAvgPrice, SubscribeRollingWindowTicker, SubscribeAllRollingWindowTickers (+ matching UnSubscribe methods)
Futures WebSocket TsgcWS_API_Binance_Futures SubscribeContinuousKLine, SubscribeCompositeIndex, SubscribeContractInfo, SubscribeAssetIndex, SubscribeAllAssetIndex, SubscribeIndexPrice, SubscribeIndexPriceKLine, SubscribeMarkPriceKLine (+ matching UnSubscribe methods)
중요: 주문을 접수, 수정 또는 취소하는 모든 거래 메서드에는 유효한 ApiKeyApiSecret 자격 증명이 필요해요. 프로덕션으로 이동하기 전에 TestNet := True로 설정하여 Binance TestNet에서 개발 및 테스트하는 것을 강력히 권장해요. 또한 API 키 권한(거래, 마진, 선물)이 수행하려는 작업과 일치하는지 확인하세요. 하위 호환성: 모든 추가 사항은 하위 호환성을 유지해요. 기존 메서드 서명이 기본 매개변수 값으로 확장되었으므로 이전에 컴파일된 코드는 수정 없이 계속 작동해요. 새 매개변수(aSelfTradePreventionMode, aStrategyId, aPriceMatch 등)는 API가 표준 동작을 사용하도록 하는 빈 값 또는 0 값을 기본값으로 해요.