­čÜž

ConnectionClosed

Po┼é─ůczenia s─ů obs┼éugiwane przez zewn─Ötrzne proxy: CloudFlare. Operator by zapewni─ç jak najwy┼╝sz─ů jako┼Ť─ç ┼Ťwiadczonych us┼éug, zmienia kilka razy dziennie polityk─Ö obs┼éugi ruchu pomi─Ödzy serwerami, co mo┼╝e skutkowa─ç nag┼éym zerwaniem po┼é─ůczenia na kanale WebSocket. Zalecamy zatem ju┼╝ na samym pocz─ůtku pisania w┼éasnej aplikacji aby uwzgl─Ödni─ç i obs┼éu┼╝y─ç takie sytuacje.

­čôś

Adres bazowy, pod kt├│rym dost─Öpny jest interfejs:

wss://api.zondacrypto.exchange/websocket/

Aby nawi─ůza─ç po┼é─ůczenie z publiczn─ů subskrypcj─ů, nale┼╝y wys┼éa─ç w formacie JSON: akcj─Ö subscribe-public wraz z modu┼éem i ┼Ťcie┼╝k─ů z kt├│rej b─Ödziemy korzysta─ç. Ten rodzaj po┼é─ůczenia nie wymaga ┼╝adnych dodatkowych parametr├│w autoryzacyjnych. Aby przerwa─ç subskrypcj─Ö, wystarczy wys┼éa─ç akcj─Ö unsubscribe na ten sam modu┼é i ┼Ťcie┼╝k─Ö. Zamkni─Öcie websocketu automatycznie przerwie subskrypcj─Ö na wszystkich kana┼éach.

{
 "action": "subscribe-public",
 "module": "trading",
 "path": "orderbook/btc-pln"
}
{
 "action": "unsubscribe",
 "module": "trading",
 "path": "orderbook/btc-pln"
}

Struktura odpowiedzi

Pierwsza odpowied┼║ zawsze b─Ödzie zawiera─ç potwierdzenie otwarcia subskrypcji dla wybranego kana┼éu. Ka┼╝da kolejna otrzymana wiadomo┼Ť─ç przez WebSocket to tak zwany push, kt├│ry np w przypadku aktualizacji orderbooka b─Ödzie wygl─ůda┼é w ten spos├│b:

{
  "action": "push",
  "topic": "trading/orderbook/btc-pln",
  "message": {
    "changes": [
      {
        "marketCode": "BTC-PLN",
        "entryType": "Buy",
        "rate": "27601.35",
        "action": "update",
        "state": {
          "ra": "27601.35",
          "ca": "0.46205049",
          "sa": "0.46205049",
          "pa": "0.46205049",
          "co": 4
        }
      }
    ],
    "timestamp": "1576847016253"
  },
  "timestamp": "1576847016253",
  "seqNo": 40018807
}
{
  "action": "subscribe-public-confirm",
  "module": "trading",
  "path": "orderbook/btc-pln"
}

Parametry action, topic, message, timestamp oraz seqNo b─Öd─ů zwracane dla ka┼╝dego z kana┼é├│w i ich opis zostanie ju┼╝ pomini─Öty w kolejnych rozdzia┼éach.

­čôś

Spos├│b implementacji seqNo

Aby zachowa─ç sp├│jno┼Ť─ç danych i mie─ç ca┼ékowit─ů pewno┼Ť─ç, ┼╝e wewn─Ötrzna struktura w tworzonej aplikacji nie przegapi┼éa ┼╝adnych aktualizacji, nale┼╝y:

  • Po┼é─ůczy─ç si─Ö z kana┼éem i na osobnej li┼Ťcie zapisywa─ç otrzymane pushe.
  • Pobra─ç aktualnego snapshota, a nast─Öpnie zapisa─ç go w docelowej strukturze.
  • Zaktualizowa─ç dane z list─ů otrzymanych pushy, zaczynaj─ůc od warto┼Ťci o 1 wi─Ökszej od seqNo, wcze┼Ťniej pobranego snapshota.
  • W przypadku pierwszej, jak i kolejnych aktualizacji, nale┼╝y r├│wnie┼╝ sprawdza─ç, czy seqNo na pewno posiada warto┼Ť─ç o 1 wi─Öksz─ů od poprzedniej wiadomo┼Ťci oraz czy┼Ťci─ç list─Ö po wprowadzeniu zmian w implementacji.
  • Je┼╝eli tymczasowa lista nie b─Ödzie si─Ö zerowa─ç, b─Ödzie to wina zagubionego pusha i nale┼╝y na nowo powt├│rzy─ç ca┼éy proces.

Warto┼Ťci seqNo b─Öd─ů w┼éasne dla ka┼╝dego z limit├│w: 10 / 50 / 100 oraz s─ů sp├│jne dla kana┼éu aktualizacji, jak i snapshota.

KluczTypOpis
actionStringTyp akcji: push / subscribe-public-error / subscribe-private-error / subscribe-private-confirm / subscribe-public-confirm / proxy-response / pong / json-error.
topicStringPe┼éna ┼Ťcie┼╝ka kana┼éu, kt├│ry jest obecnie pod┼é─ůczony.
messageObjectWiadomo┼Ť─ç o aktualizacjach, kt├│ra jest r├│┼╝na dla ka┼╝dego z kana┼é├│w.
timestampUnix TimestampCzas wysłania pusha przez serwer.
seqNointegerNumer sekwencyjny. Pomaga zachowa─ç kolejno┼Ť─ç odbieranych wiadomo┼Ťci. Warto sprawdza─ç, czy ka┼╝da kolejna, otrzymana wiadomo┼Ť─ç posiada seqNo wi─Ökszy o 1 od poprzedniej.

Snapshot

Ka┼╝da z przedstawionych poni┼╝ej subskrypcji publicznych, udost─Öpnia dodatkow─ů mo┼╝liwo┼Ť─ç pobrania snapshota. Odbywa si─Ö to poprzez akcj─Ö proxy, kt├│ra jest wykonywana na metodzie RESTowej typu GET z dodatkowym parametrem requestId, kt├│ry stanowi unikalny identyfikator naszego zapytania.

{
	"requestId": "78539fe0-e9b0-4e4e-8c86-70b36aa93d4f",
	"action": "proxy",
	"module": "trading",
	"path": "ticker/eth-pln"
}
{
  "action": "proxy-response",
  "requestId": "78539fe0-e9b0-4e4e-8c86-70b36aa93d4f",
  "statusCode": 200,
  "body": {
    "status": "Ok",
    "ticker": {
      "market": {
        "code": "ETH-PLN",
        "first": {
          "currency": "ETH",
          "minOffer": "0.00045",
          "scale": 8
        },
        "second": {
          "currency": "PLN",
          "minOffer": "5",
          "scale": 2
        }
      },
      "time": "1576846031093",
      "highestBid": "491.44",
      "lowestAsk": "495",
      "rate": "495",
      "previousRate": "499.42"
    }
  }
}