Nuovi metodi API Binance in sgcWebSockets

· Funzionalità

La libreria sgcWebSockets continua a estendere la sua integrazione con Binance con un'importante batch di nuovi metodi che coprono l'API REST Spot, l'API REST Futures e gli stream WebSocket. Questo articolo fornisce un'analisi tecnica di ogni nuovo metodo, dei suoi parametri ed esempi pratici di codice Delphi per metterti rapidamente all'opera.

Indice

  1. Nuovi metodi API REST Spot
  2. Dati di mercato Spot: UI KLines, Rolling Window e Trading Day Ticker
  3. Gestione ordini Spot: ordini OCO, OTO, OTOCO e SOR
  4. Account Spot: commission, allocations, rate limit e prevented match
  5. Nuovi metodi API REST Futures
  6. Dati di mercato Futures: Continuous KLines, Premium Index e altro
  7. Gestione ordini Futures: Modify, Batch e Force Ordini
  8. Account Futures: endpoint V3, configurazione e Fee Burn
  9. Nuovi stream WebSocket Spot
  10. Nuovi stream WebSocket Futures
  11. Esempi funzionanti completi

1. Nuovi metodi API REST Spot

La classe TsgcHTTP_API_Binance_Rest e' stata estesa con nuovi endpoint dei dati di mercato, tipi di ordine avanzati e metodi di query sull'account. Tutti i metodi sono accessibili sia direttamente tramite il componente REST sia tramite la proprieta' REST_API di TsgcWS_API_Binance.

Endpoint dei dati di mercato

Metodo Descrizione Endpoint Binance
GetUIKLines Dati di kline/candle ottimizzati per la presentazione UI. Restituisce dati in formato identico a GetKLines ma ottimizzati per il rendering grafico. /api/v3/uiKlines
GetRollingWindowTicker Statistiche di variazione prezzo su finestra mobile. Supporta dimensioni di finestra configurabili (ad esempio 1h, 4h, 1d) a differenza del ticker fisso a 24 ore. /api/v3/ticker
GetTradingDayTicker Statistiche di variazione prezzo calcolate sul trading day (dalle UTC 00:00 al momento corrente). Supporta uno o piu' simboli. /api/v3/ticker/tradingDay
GetPriceTickers Recupera i price ticker per piu' simboli in una singola richiesta utilizzando un array JSON di nomi di simboli. /api/v3/ticker/price

GetUIKLines

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

La differenza tra GetKLines e GetUIKLines e' sottile: la variante UI e' ottimizzata dal backend di Binance per il rendering grafico e puo' restituire confini di kline modificati per una migliore presentazione visiva. Il formato della risposta e' identico, rendendola un sostituto drop-in per qualsiasi scenario di charting.

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;

Questo metodo estende il tradizionale Get24hrTicker permettendo dimensioni di finestra personalizzate. I valori accettati per aWindowSize includono '1h', '4h' e '1d'. Se omesso, viene utilizzata la finestra di default.

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;

Tipi di ordine avanzati

Binance ha introdotto diversi nuovi tipi di order list che vanno oltre l'OCO originale. La libreria sgcWebSockets li supporta ora tutti nativamente.

NewOrderListOCO (nuovo formato OCO)

Il nuovo formato OCO sostituisce il legacy NewOCO e introduce configurazioni di prezzo above/below piu' flessibili. Ogni leg dell'OCO puo' essere configurata in modo indipendente con il proprio tipo di ordine, stop price, trailing delta e time-in-force.

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)

Una order list OTO e' composta da un working order e un pending order. Quando il working order viene eseguito, il pending order viene piazzato automaticamente. E' utile per configurare ordini di ingresso con follow-up automatico.

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)

Combina la logica OTO e OCO: un working order, una volta eseguito, attiva una coppia OCO (take-profit + stop-loss). Questo abilita strategie di ingresso con piano di uscita completamente automatizzate in una singola chiamata 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)

Gli ordini SOR permettono a Binance di ottimizzare l'esecuzione instradando attraverso piu' liquidity pool. Sono forniti due nuovi metodi: NewSOROrder per l'esecuzione live e TestSOROrder per la convalida senza piazzamento effettivo.

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

Annulla atomicamente un ordine esistente e ne piazza uno nuovo. E' fondamentale per strategie che devono modificare ordini senza il rischio di rimanere senza posizione tra una chiamata di cancel e una di place separate.

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;

Endpoint Account e Query

Metodo Descrizione
GetAccountInformation(aOmitZeroBalances) Esteso con il parametro aOmitZeroBalances. Quando impostato a True, gli asset con saldo zero vengono esclusi dalla risposta.
GetOrderRateLimitUsage Restituisce il conteggio corrente degli ordini e l'uso dei rate limit, indispensabile per restare entro i limiti API in scenari ad alta frequenza.
GetPreventedMatches Interroga i match di self-trade prevenuti. Supporta filtraggio per simbolo, order ID o prevented match ID con paginazione.
GetAllocations Recupera le allocazioni degli ordini SOR, mostrando come un ordine e' stato distribuito tra i pool.
GetAccountCommission Restituisce il rate di commissione maker/taker per uno specifico simbolo.
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;
Nota: Anche i metodi NewOrder e TestNewOrder sono stati estesi con nuovi parametri opzionali: aSelfTradePreventionMode, aStrategyId e aStrategyType. Il metodo CancelOrder ora accetta un parametro aCancelRestrictions per l'annullamento condizionale. Queste aggiunte sono backward-compatible — il codice esistente continuera' a funzionare senza modifiche.

2. Nuovi metodi API REST Futures

La classe TsgcHTTP_API_Binance_Futures_Rest ha ricevuto il batch piu' grande di nuovi metodi, coprendo dati di mercato, gestione degli ordini, configurazione dell'account e gestione degli stream. Tutti i metodi funzionano sia con futures USDT-M sia COIN-M, controllati dalla proprieta' FuturesContracts.

Dati di mercato Futures

Metodo Descrizione
GetContinuousKLinesDati kline/candle per un contratto continuous. Richiede pair, contract type (ad esempio 'PERPETUAL', 'CURRENT_QUARTER') e intervallo.
GetIndexPriceKLinesDati kline basati sul prezzo dell'indice di una coppia di trading.
GetMarkPriceKLinesDati kline basati sul mark price di un simbolo.
GetPremiumIndexKLinesDati kline del premium index per il calcolo del basis e l'analisi del funding rate.
GetFundingInfoRestituisce informazioni sul funding rate per tutti i simboli, inclusi funding interval e rate cap/floor.
GetPriceTickerV2Price ticker V2 con formato di risposta migliorato.
GetIndexInfoRestituisce il prezzo dell'indice e i dati dei costituenti per un simbolo di composite index.
GetAssetIndexPrezzi degli asset index per i calcoli di margine in multi-asset mode.
GetConstituentsInterroga i costituenti e i relativi pesi per un dato composite index.
GetDeliveryPricePrezzi storici di delivery per contratti trimestrali/bi-trimestrali.
GetBasisDati del basis (spread tra prezzi futures e spot) per una data coppia e contract type.
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;

Gestione ordini Futures

I nuovi metodi sugli ordini Futures forniscono test order, modifica degli ordini, elaborazione batch e query sulle liquidazioni.

Metodo Descrizione
TestNewOrderConvalida un nuovo ordine futures senza piazzarlo. Riflette la signature di NewOrder.
ModifyOrderModifica prezzo, quantita' o price matching mode di un ordine aperto esistente.
NewBatchOrdiniPiazza fino a 5 ordini in una singola richiesta tramite un array JSON di oggetti ordine.
ModifyBatchOrdiniModifica fino a 5 ordini esistenti in una singola richiesta.
CancelBatchOrdiniAnnulla piu' ordini tramite una lista di order ID o di client order ID.
GetOrderAmendmentRecupera lo storico degli amendment (modifiche) di un ordine.
CountdownCancelAllImposta un countdown timer (in millisecondi) dopo il quale tutti gli ordini aperti per un simbolo vengono annullati.
GetForceOrdiniInterroga gli ordini di liquidazione forzata con filtraggio opzionale.
GetADLQuantileRecupera la stima del quantile ADL (Auto-Deleveraging) per le posizioni.

Anche la signature di NewOrder per Futures e' stata estesa con nuovi parametri: aPriceMatch, aSelfTradePreventionMode, aGoodTillDate e 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.CancelBatchOrdini('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.GetForceOrdini('BTCUSDT');
  Memo1.Lines.Add('ForceOrdini: ' + vJSON);
  // ADL quantile estimation
  vJSON := sgcBinanceFutREST.GetADLQuantile('BTCUSDT');
  Memo1.Lines.Add('ADL: ' + vJSON);
end;

Account Futures e configurazione

Sono stati aggiunti diversi endpoint V3 dell'account insieme a metodi di configurazione e di gestione delle commissioni.

Metodo Descrizione
GetAccountBalanceV3Saldo dell'account V3 con supporto migliorato al multi-asset margin.
GetAccountInformationV3Dettagli dell'account V3 inclusi multi-asset margin mode e fee tier aggiornati.
GetPositionInformationV3Dati di posizione V3 con campi di precisione aggiuntivi.
GetCommissionRateRestituisce il rate corrente di commissione maker/taker per uno specifico simbolo futures.
GetAccountConfigConfigurazione a livello di account: fee tier, position mode, multi-asset margin mode.
GetSymbolConfigConfigurazione per simbolo: leva, margin type e position mode.
GetOrderRateLimitStato corrente del rate limit degli ordini per simbolo.
GetApiTradingStatusStato del trading via API ed eventuali indicatori che possono attivare restrizioni di trading.
ChangeMultiAssetsModeAbilita o disabilita il multi-asset margin mode per i futures USDT-M.
GetMultiAssetsModeInterroga l'impostazione corrente del multi-asset margin mode.
SetFeeBurnAbilita o disabilita il BNB fee burn (pagamento delle commissioni in BNB con sconto).
GetFeeBurnInterroga l'impostazione corrente del fee burn.

Gestione delle listen key

Tre metodi dedicati ora gestiscono il ciclo di vita della listen key dello user data stream Futures direttamente via REST, indipendentemente dal componente WebSocket:

Metodo Descrizione
CreateListenKeyGenera una nuova listen key per lo user data stream (POST).
KeepAliveListenKeyEstende la validita' di una listen key (PUT). Deve essere chiamato ogni 60 minuti.
CloseListenKeyInvalida e chiude una 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. Nuovi stream WebSocket Spot

La classe TsgcWS_API_Binance e' stata estesa con tre nuovi tipi di stream, ciascuno con metodi di subscribe e unsubscribe.

Metodo Stream Descrizione
SubscribeAvgPrice / UnSubscribeAvgPrice <symbol>@avgPrice Stream del prezzo medio in tempo reale per un simbolo.
SubscribeRollingWindowTicker <symbol>@ticker_<window> Statistiche su finestra mobile con dimensione di finestra configurabile (1h, 4h, 1d).
SubscribeAllRollingWindowTickers !ticker_<window>@arr Statistiche su finestra mobile per tutti i simboli trattati a una specifica dimensione di finestra.

E' fornito un nuovo tipo enumerato TsgcWSBinanceRollingWindowSize per specificare la dimensione della finestra in modo type-safe:

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. Nuovi stream WebSocket Futures

La classe TsgcWS_API_Binance_Futures riceve il set piu' ampio di nuove sottoscrizioni a stream WebSocket. Coprono contratti continuous, composite index, asset index, index price e kline del mark price.

Metodo Stream Descrizione
SubscribeContinuousKLine<pair>_<contract>@continuousKline_<interval>Stream di kline per contratti continuous. Richiede pair, contract type e intervallo.
SubscribeCompositeIndex<symbol>@compositeIndexStream del prezzo del composite index con breakdown dei componenti.
SubscribeContractInfo!contractInfoStream delle informazioni sui contratti. Notifica aggiornamenti su listing, delisting e modifiche dei bracket.
SubscribeAssetIndex / SubscribeAllAssetIndex<symbol>@assetIndex / !assetIndex@arrPrezzi degli asset index per i calcoli di margine multi-asset. Per simbolo o per l'intero mercato.
SubscribeIndexPrice<pair>@indexPriceStream del prezzo dell'indice per una coppia di trading. Supporta un parametro opzionale di update speed.
SubscribeIndexPriceKLine<pair>@indexPriceKline_<interval>Stream di kline/candle del prezzo dell'indice con intervalli configurabili.
SubscribeMarkPriceKLine<symbol>@markPriceKline_<interval>Stream di kline del mark price per tracciare il mark price utilizzato nei calcoli di liquidazione.
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. Esempi funzionanti completi

Esempio 1: REST Spot + WebSocket combinati (applicazione VCL)

Un pattern tipico e' usare l'API REST per piazzare ordini e l'API WebSocket per dati di mercato in tempo reale. L'esempio seguente mostra come configurare entrambi tramite il componente TsgcWS_API_Binance.

unit MainForm;
interface
uses
  Windows, Messages, SysUtils, Classees, Graphics, Controls, Forms,
  StdCtrls, sgcWebSocket_Classees, sgcWebSocket_API_Binance,
  sgcWebSocket_APIs, sgcBase_Classees, 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.

Esempio 2: REST Futures + WebSocket (applicazione console)

Le applicazioni console sono ideali per bot headless e servizi in background. L'esempio seguente mostra come usare i nuovi metodi Futures in un contesto console.

program BinanceFuturesConsole;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  Classees, SysUtils,
  sgcWebSocket, sgcWebSocket_APIs, sgcWebSocket_Types,
  sgcWebSocket_Classees, 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.ClasseName, ': ', E.Message);
  end;
end.

Esempio 3: strategia di ordine OTOCO

Il tipo di ordine OTOCO rappresenta il ciclo di vita di trade automatizzato piu' completo: una singola chiamata piazza un ordine di ingresso che, una volta eseguito, imposta automaticamente sia un take-profit sia uno stop-loss.

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;

La tabella seguente riassume il conteggio dei nuovi metodi aggiunti a ciascuna classe:

Componente Classe Nuovi metodi
Spot REST API TsgcHTTP_API_Binance_Rest GetUIKLines, GetRollingWindowTicker, GetTradingDayTicker, NewOrderListOCO, NewOrderListOTO, NewOrderListOTOCO, NewSOROrder, TestSOROrder, CancelReplaceOrder, GetOrderRateLimitUsage, GetPreventedMatches, GetAllocations, GetAccountCommission
Futures REST API TsgcHTTP_API_Binance_Futures_Rest TestNewOrder, ModifyOrder, NewBatchOrdini, ModifyBatchOrdini, CancelBatchOrdini, GetOrderAmendment, CountdownCancelAll, GetForceOrdini, 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)
Importante: Tutti i metodi di trading che piazzano, modificano o annullano ordini richiedono credenziali ApiKey e ApiSecret valide. Si raccomanda fortemente di sviluppare e testare sulla Binance TestNet impostando TestNet := True prima di passare in produzione. Assicurati inoltre che i permessi dell'API key (trading, margin, futures) corrispondano alle operazioni che intendi eseguire. Compatibilita' all'indietro: Tutte le aggiunte sono backward-compatible. Le signature dei metodi esistenti sono state estese con valori di default per i parametri, quindi il codice gia' compilato continua a funzionare senza modifiche. I nuovi parametri (aSelfTradePreventionMode, aStrategyId, aPriceMatch, ecc.) hanno come default valori vuoti o zero che fanno usare all'API il suo comportamento standard.