Przejdź do nawigacji

Ciągłe zapytania i paginacja

Ciągłe zapytania i paginacja: Agent Java SDK integracja v0.3.0, przykłady, parametry i semantyka odpowiedzi.

Zobacz jako Markdown

Ten przewodnik jest przeznaczony dla Agent Java SDK v0.3.0, Java 8+ i oznaczonych zamówień publicznych. Przykłady działają w zapleczu partnera po inicjalizacji client w Szybki start.

Przykładowe wymagania wstępne

Fragmenty Java dzielą ten import. Zainicjuj client za pomocą Szybki start i uzyskaj platformUserId z zapisanego powiązania. Przykładowe identyfikatory użytkowników/zamówień należy zastąpić własnymi, utrwalonymi wartościami.

import com.sixmm.agent.*;
import com.sixmm.agent.model.*;
import java.util.*;

Zapytanie o dane dotyczące umowy bezterminowej

Sześć typów interfejsów i metod Java.

Wszystkie żądania są podpisane POST wspólnym prefiksem /v1/agent/perpetual.

przyrostek ścieżkiJava Metoda/typ żądaniazasięg gracza
/orders/currentlistCurrentPerpetualOrders(CurrentPerpetualOrdersRequest)NORMAL Gracz może zostać pominięty; CONDITIONAL Należy określić gracza
/orders/historylistPerpetualOrderHistory(PerpetualOrderHistoryRequest)To samo co powyżej
/tradeslistPerpetualTrades(PerpetualTradesRequest)Należy określić gracza
/positions/currentlistCurrentPerpetualPositions(CurrentPerpetualPositionsRequest)Graczy można pominąć
/positions/historylistPerpetualPositionHistory(PerpetualPositionHistoryRequest)Graczy można pominąć
/account/ledgerlistPerpetualLedger(PerpetualLedgerRequest)Graczy można pominąć

platformUserIds to tablica ciągów zawierająca identyfikatory platform publicznych. Jeśli określono, wymaganych jest od 1 do 100 unikalnych graczy mających dostęp; na punktach końcowych, które pozwalają na pominięcie, sprawdzany jest tylko zakres bezpośrednich graczy, do których bieżący sprzedawca ma dostęp. Zapytania wypełniające transakcje zawsze wymagają tej tablicy; zapytania kolejności warunkowej również wymagają jawnych identyfikatorów użytkowników. Pominięcie nie jest równoznaczne z [], a puste tablice są nielegalne. Zakres jest określany przez sprzedawcę podpisującego i nie można przekazać innych identyfikatorów sprzedawców w celu rozszerzenia zakresu.

Wartości tablicy są serializowane jako kompaktowe JSON przed dołączeniem do ładunku podpisującego. Na przykład platformUserIds znakuje jako ["1188041528"], podając platformUserIds=["1188041528"] w ładunku k=v. Zachowaj kolejność elementów tablicy, podwójne cudzysłowy i identyfikatory ciągów; nie wstawiaj spacji formatujących ani nie używaj Java List.toString() (np. [1188041528]). SDK automatycznie obsługuje tę serializację.

Zapytanie o zamówienie musi przejść orderCategory=NORMAL lub CONDITIONAL. Użyj orderId dla zleceń zwykłych i conditionId dla zleceń warunkowych. Nie można ich mieszać w różnych kategoriach. Zlecenia warunkowe oraz zlecenia zwykłe generowane w wyniku ich uruchomienia przetwarzane są oddzielnie jako byty.

Warunki filtra

ZapytanieDostępne filtry biznesowe
Aktualne zamówienieorderCategory, symbol
porządek historycznyorderCategory, symbol, startTime, endTime, orderId, conditionId, clientOrderId, side, status
zawrzeć umowęsymbol, startTime, endTime, orderId
Aktualna pozycjasymbol
Stanowiska historycznesymbol, startTime, endTime, positionSide
Zmiany w umowiestartTime, endTime, assetType, changeType

Czas zapytania historycznego to Unix milisekundy, a interwał to [startTime, endTime); czas żądania podpisu to timestamp to Unix sekund. Zalecane jest naprawienie okna czasowego UTC i zapytanie w segmentach; używaj UTC do codziennego pojednania. Status i typ korzystają z wyliczenia umów platformy i nie są same w sobie tłumaczone na chińskie ciągi znaków.

limit Wartość domyślna to 500, zakres to 1~1000; rozmiar strony nie gwarantuje, że za każdym razem zostanie zwrócona ta sama liczba. Sześć interfejsów ma obecnie wspólny limit zapytań wynoszący 2 razy na sekundę i 4 serie na sprzedawcę, a maksymalny limit współbieżności dla każdego sprzedawcy w instancji wynosi 2. Strona sprzedawcy korzysta z ujednoliconej kolejki i zaleca się rozpoczęcie od stronicowania sekwencyjnego i mniejszego okna historii.

Java przykłady zapytań

Zapytaj o bieżący zwyczajny porządek gracza:

CurrentPerpetualOrdersRequest current = new CurrentPerpetualOrdersRequest();
current.orderCategory = "NORMAL";
current.platformUserIds = Collections.singletonList(platformUserId);
current.symbol = "BTCUSDT";
current.limit = 100;
PerpetualResponse currentPage = client.listCurrentPerpetualOrders(current);

Zapytaj o zmiany w umowie w ciągu ostatniej godziny i przetwórz kursor. Poniższy przykład nie powoduje automatycznego ponawiania próby; gdy rzeczywista aplikacja napotka bieżące ograniczenie lub tymczasową awarię, postępuj zgodnie z powiązanym przewodnikiem, aby przywrócić tę samą stronę.

PerpetualLedgerRequest ledger = new PerpetualLedgerRequest();
ledger.platformUserIds = Collections.singletonList(platformUserId);
ledger.endTime = System.currentTimeMillis();
ledger.startTime = ledger.endTime - 3_600_000L;
ledger.limit = 100;
Set<String> seenCursors = new HashSet<>();
while (true) {
PerpetualResponse page = client.listPerpetualLedger(ledger);
for (PerpetualRecord row : page.data.items) {
// Persist records idempotently by platformUserId, entityType and entityId.
}
if (!page.data.hasMore) {
break;
}
String next = page.data.nextCursor;
if (next == null || next.isEmpty() || !seenCursors.add(next)) {
throw new IllegalStateException("游标未推进,停止查询并排查");
}
ledger.cursor = next;
Thread.sleep(650L); // Other queries must share the same partner rate-limit queue.
}

Struktura zwrotów i zasady zapisywania

Widzieć Wspólna odpowiedź i paginacja dla wspólnych pól. Pola zasobów są udokumentowane w Święcenia, Handel wypełnia, Pozycje I Księga kontraktowa.

Sześć interfejsów równomiernie zwraca PerpetualResponse:

{
"code": 0,
"message": "success",
"data": {
"items": [],
"nextCursor": "",
"hasMore": false
}
}

Każde items zawiera platformUserId, entityType, entityId, data. Typy jednostek obejmują ORDER, CONDITION_ORDER, TRADE_FILL, POSITION, ACCOUNT_LEDGER. Użyj tych trzech pól tożsamości, aby zbudować klucz idempotentny; nie traktuj identyfikatora zamówienia warunkowego, identyfikatora zamówienia i identyfikatora wypełnienia jako tego samego numeru.

data Zawiera pola, takie jak cena, ilość, status, wydatek, zysk i strata lub zmiana salda według zasobu. Kwota, cena, ilość i identyfikator jednostki są traktowane jako ciągi znaków; czas biznesowy jest podawany w milisekundach. Brakujące pola nie są uzupełniane do wartości 0 i nie są wnioskowane z innych podmiotów.

Kursor to pozycja stronicowania zapytania, a nie niezawodna subskrypcja przyrostowa ani gwarantowana migawka atomowa między stronami. Aktualny kursor obowiązuje przez 24 godziny od pierwszej rundy generowania; kolejne strony zachowują tych samych sprzedawców, zasoby, kolekcje graczy i warunki filtrów. Stałe okno historycznego ściągania jest idempotentne przy wielokrotnym wyciąganiu; status bieżącego zamówienia/pozycji jest odświeżany po ponownym zapytaniu. Gdy potrzebny jest interfejs czasu rzeczywistego, używany jest mechanizm danych frontonu platformy, a interfejsu odpytywania szóstego nie można uważać za interfejs rynkowy o wysokiej częstotliwości.

Błędy i odzyskiwanie

HTTP sukces nie oznacza sukcesu biznesowego, musisz sprawdzić code. Java SDK zgłosi błąd biznesowy jako AgentApiException.

Kod biznesowyTypowe znaczenieObsługiwanie
102001Brakuje wymaganych parametrów, na przykład w zapytaniu o zamówienie warunkowe brakuje graczy.Podaj brakujące parametry
102002Niedozwolone parametry, pusta tablica, niedopasowany kursor lub wygasłyPopraw parametry; ponownie sprawdź stałe okno po wyczyszczeniu wygasłego kursora i zapisz je idempotentnie.
102003Niedozwolony limit, liczba graczy lub zakres czasuWąski lub prawidłowy zakres
6001Błąd podpisuSprawdź klucz, serializację tablicy i pola podpisu
6009Metoda dostępu sprzedawcy lub zakres dostępu są niedozwoloneSprawdź uprawnienia sprzedawcy i własność gracza
6904Usługa jest chwilowo niedostępna, ochrona zasobów współbieżności lub zapytańZmniejsz współbieżność i zmniejsz okna; skontaktuj się z pomocą techniczną, jeśli błąd będzie się powtarzał
6905Udostępniony limit dla sześciu typów zapytań został wyczerpanyWycofaj się, a następnie spróbuj ponownie uruchomić oryginalną stronę, która się nie powiodła

cursor i wszystkie warunki filtra oryginalnej strony, która uległa awarii, zostaną zachowane po ograniczeniu prądu, przekroczeniu limitu czasu lub tymczasowej awarii; za każdym razem, gdy zostanie ponownie wywołane SDK, zostaną wygenerowane nowe timestamp, nonce, sign. Nie możesz przejść bezpośrednio do następnej strony i nie możesz traktować niepowodzeń jako pustych rezultatów. SDK nie jest odpowiedzialny za automatyczne ponawianie transakcji funduszami.

Wspólna odpowiedź i paginacja

PoleJSON typzilustrować
codeintegerKod biznesowy, 0 oznacza sukces; jeśli nie jest to 0, będzie to traktowane jako błąd, a awaria nie będzie traktowana jako pusta strona.
messagestringOpis wyników nie jest jedyną podstawą oceny biznesowej.
dataobjectPaginowane wyniki w przypadku sukcesu
data.itemsarrayRekordy na tej stronie; legalna pusta strona to []
data.nextCursorstringKursor następnej strony; zwykle pusty ciąg znaków, jeśli nie ma kolejnych stron
data.hasMorebooleanCzy istnieją kolejne strony; jeśli prawda, użyj nextCursor, aby kontynuować to samo zapytanie

Struktura każdego data.items[]:

PoleJSON typzilustrować
platformUserIdstringPubliczny identyfikator użytkownika platformy, zapisany w postaci ciągu znaków; nie wewnętrzny identyfikator użytkownika bazy danych
entityTypestringTyp jednostki, do której należy rekord, patrz tabela poniżej
entityIdstringIdentyfikator bieżącej jednostki jest łączony z użytkownikiem platformy i typem jednostki w celu skonstruowania lokalnego idempotentnego klucza.
dataobjectObszary działalności tego podmiotu; różne pola zasobów są różne
Zapytanie o zasobyentityTypeentityId Korespondencja
Zwykły porządekORDERdata.orderId
zamówienia warunkoweCONDITION_ORDERdata.conditionId
Szczegóły wypełnienia transakcjiTRADE_FILLdata.fillId, a nie tradeId
Aktualne/historyczne pozycjePOSITIONdata.positionId
Zapisy w księdze kontraktówACCOUNT_LEDGERIdentyfikacja szczegółów zmiany pojedynczego konta, ** nie jest danymi.ledgerId**

To samo ledgerId może oddzielić wiele szczegółów, takich jak opłaty manipulacyjne, zyski i straty itp.; naciśnięcie ledgerId w celu usunięcia duplikatów spowoduje utratę danych. Nie można mieszać identyfikatorów z różnych zasobów. Zobacz powiązany przewodnik w Przewodniku dostępu, aby zapoznać się z zasadami stronicowania i zapisywania pól.

Rodzaje, jednostki i pola pomijane

  • Kwota, cena, ilość i ciąg znaków identyfikacyjny jednostki; używaj liczb dziesiętnych do przetwarzania kwot i nie możesz używać liczb zmiennoprzecinkowych ani konwertować długich identyfikatorów na liczby JavaScript. Waluta kwoty i jednostka ilości są wyjaśnione zgodnie ze specyfikacjami pary handlowej/kontraktu.
  • Czas biznesowy wykorzystuje liczbę całkowitą (int64), obie są milisekundami uniksowymi; sygnatura czasowa żądania uwierzytelnienia i dane uwierzytelniające expireAt używają sekund i nie można ich pomylić.
  • Pola biznesowe typu string zwykle nie są wyświetlane, gdy są puste, a niektóre zostaną pominięte, gdy pola numeryczne mają wartość 0. Brakujące pole nie oznacza, że ​​wartość biznesowa wynosi 0.
  • reduceOnly, closeOnly, makerOnly w ogólnym modelu rekordu nie pomijają fałszu, więc te trzy fałsze mogą również pojawić się w transakcjach lub pozycjach. Są one wyjaśnione jedynie w zasobach zamówienia; nie można uznać, że transakcja/pozycja wykonała odpowiednie reguły dotyczące zleceń.
  • closePosition to opcjonalna wartość logiczna: dostarczana przez zamówienia warunkowe, zwykle pomijana w przypadku innych zasobów. Brak ma inne znaczenie niż fałsz.
  • Poniższa tabela „obecnie dostępna” oznacza, że ​​logika odczytu ma źródło pola; pola opcjonalne można w dalszym ciągu pominąć, ponieważ nie mają one żadnej wartości. Nie ma gwarancji, że pola istniejące w modelu zostaną wypełnione w każdym interfejsie.

Różnica między trybem statusu i marginesu

ratunekbieżąca wartość zwracana
Aktualny stan zamówienia zwykłegoNEW, PENDING, PARTIALLY_FILLED
Historyczny status zamówienia zwykłegoFILLED, CANCELED, REJECTED, PARTIAL_FILLED_CANCELED lub PARTIALLY_FILLED_CANCELED; zachowaj rzeczywistą pisownię źródłową
Stan aktualny status zamówienia / triggerStatusPENDING_ACTIVATION, PENDING, TRIGGERING
Stan zamówienia stanu historycznego / triggerStatusTRIGGERED, CANCELLED, REJECTED, FIRED
Aktualny stan pozycjiCiąg numeryczny „1” jest na pozycji, „3” jest w likwidacji
Stan pozycji historycznejCiąg numeryczny „2” zamknął pozycję, „4” wymusił likwidację

Pisownia CANCELED w przypadku zamówienia zwykłego różni się od pisowni CANCELLED w przypadku zamówienia warunkowego; uruchomienie zlecenia warunkowego nie oznacza, że ​​wygenerowane zlecenie zwykłe zostało zrealizowane. Nie używaj ponownie tego samego zestawu tabel translacji statusów dla wszystkich zasobów.

Kolejność warunkowa marginMode zwraca CROSS / ISOLATED; historyczne zwykłe zlecenia i pozycje obecnie zwracają „1” / „2”, które stanowią odpowiednio depozyt krzyżowy/izolowany. marginMode nie jest obecnie dostępny dla zwykłych zamówień. Sprzedawcy mogą normalizować zasoby we własnej warstwie wyświetlania, a oryginalne wartości nadal muszą zostać zapisane.

Pola zadeklarowane w modelu, ale nie podane w tym zapytaniu

Generic RecordData / Java Model PerpetualData deklaruje również następujące pola, ale bieżąca logika odczytu produkcyjnego sześciu kategorii nie wypełnia ich. **Nie należy podawać jako dostępnych danych biznesowych ani nie należy zastępować rzeczywistych wyników wartościami domyślnymi pól. **

PoleTyp modeluobecną granicę
closeReasonstringNie podano powodów zamknięcia pozycji historycznych
walletDeltastringInterfejs zmiany konta nie zwraca delty portfela
frozenDeltastringInterfejs zmiany konta nie zwraca zamrożonej delty
usedDeltastringInterfejs zmiany konta nie zwraca wykorzystanej delty depozytu zabezpieczającego
feeDeltastringInterfejs zmiany konta nie zwraca różnicy opłat
pnlDeltastringInterfejs zmiany konta nie zwraca delty zysków i strat
accountVersionstringInterfejs zmiany konta nie zwraca wersji konta i nie można go używać do niezawodnej synchronizacji przyrostowej.
occurredAtintegerInterfejs zmiany konta wykorzystuje createdAt i nie zapewnia innego zestawu czasów wystąpienia zdarzeń.

Rzeczywisty zakres zastosowań terenowych podlega powyższym tabelom zasobów; w przypadku aktualizacji pól lub wyliczeń platforma zostanie dostosowana zgodnie z nowym opisem interfejsu i wersją SDK.

Źródło i powiązane przewodniki