sgcWebSockets 라이브러리는 Spot REST API, Futures REST API, WebSocket 스트림을 포함하는 중요한 새 메서드 모음을 추가하며 Binance 통합을 계속 확장하고 있어요. 이 글은 각 새 메서드, 매개변수, 그리고 빠르게 시작할 수 있는 실용적인 Delphi 코드 예제에 대한 기술적 분석을 제공해요.
목차
- 새로운 Spot REST API 메서드
- Spot 시장 데이터: UI KLines, Rolling Window & Trading Day Tickers
- Spot 주문 관리: OCO, OTO, OTOCO & SOR 주문
- Spot 계정: 수수료, 할당, 요청 제한 & 방지된 매칭
- 새로운 Futures REST API 메서드
- Futures 시장 데이터: Continuous KLines, Premium Index & More
- Futures 주문 관리: 수정, 일괄 & 강제 주문
- Futures 계정: V3 엔드포인트, 설정 & 수수료 소각
- 새로운 Spot WebSocket 스트림
- 새로운 Futures WebSocket 스트림
- 완전한 작동 예제
1. 새로운 Spot REST API 메서드
TsgcHTTP_API_Binance_Rest 클래스에 새로운 시장 데이터 엔드포인트, 고급 주문 유형, 계정 조회 메서드가 추가되었어요. 모든 메서드는 REST 컴포넌트를 통해 직접 접근하거나 TsgcWS_API_Binance의 REST_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;
GetKLines와 GetUIKLines의 차이는 미묘해요. 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;
참고: NewOrder와 TestNewOrder 메서드도 새로운 선택적 매개변수 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 | 심볼별 현재 주문 요청 제한 상태예요. |
GetApiTradingStatus | API 거래 상태와 거래 제한을 트리거할 수 있는 지표예요. |
ChangeMultiAssetsMode | USDT-M 선물의 다중 자산 마진 모드를 활성화 또는 비활성화해요. |
GetMultiAssetsMode | 현재 다중 자산 마진 모드 설정을 조회해요. |
SetFeeBurn | BNB 수수료 소각을 활성화 또는 비활성화해요(할인된 가격으로 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) |
ApiKey와 ApiSecret 자격 증명이 필요해요. 프로덕션으로 이동하기 전에 TestNet := True로 설정하여 Binance TestNet에서 개발 및 테스트하는 것을 강력히 권장해요. 또한 API 키 권한(거래, 마진, 선물)이 수행하려는 작업과 일치하는지 확인하세요.
하위 호환성: 모든 추가 사항은 하위 호환성을 유지해요. 기존 메서드 서명이 기본 매개변수 값으로 확장되었으므로 이전에 컴파일된 코드는 수정 없이 계속 작동해요. 새 매개변수(aSelfTradePreventionMode, aStrategyId, aPriceMatch 등)는 API가 표준 동작을 사용하도록 하는 빈 값 또는 0 값을 기본값으로 해요.
