Xbase++
Xbase++
Subscribe to Multiple Bitfinex Tickers on One Connection
See more WebSocket Examples
Subscribes to multiple ticker symbols on the public Bitfinex websocket ticker channel and receives ticker updates.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oWs
LOCAL oRest
LOCAL cResponseBody
LOCAL oJson1
LOCAL nFinalFrame
LOCAL oJson2
LOCAL nReceivedFinalFrame
LOCAL nNumUpdatesReceived
LOCAL cReceivedText
nSuccess := 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
oWs := CreateObject("Chilkat.WebSocket")
// For brevity, this example does not check for errors when etablishing the WebSocket connection.
// See Establish WebSocket Connection for more complete sample code for making the connection.
oRest := CreateObject("Chilkat.Rest")
// Connect to api.bitfinex.com
nSuccess := oRest:Connect("api.bitfinex.com", 443, 1, 0)
oWs:UseConnection(oRest)
oWs:AddClientHeaders()
cResponseBody := oRest:FullRequestNoBody("GET", "/ws")
nSuccess := oWs:ValidateServerHandshake()
IF (nSuccess != 1)
? oWs:LastErrorText
? cResponseBody
? oRest:ResponseHeader
oWs:destroy()
oRest:destroy()
RETURN
ENDIF
// After connecting, the bitfinex websocket server will send
// an info message that contains the actual version of the websocket stream.
// Receive that message..
nSuccess := oWs:ReadFrame()
IF (nSuccess != 1)
? "Failed to receive a frame"
? "ReadFrame fail reason = " + Str(oWs:ReadFrameFailReason)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
RETURN
ENDIF
// We should get this:
// {"event":"info","version":1.1,"platform":{"status":1}}
? oWs:GetFrameData()
// Subscribe to the BTCUSD ticker feed.
// See https://docs.bitfinex.com/docs for more information.
oJson1 := CreateObject("Chilkat.JsonObject")
oJson1:AppendString("event", "subscribe")
oJson1:AppendString("channel", "ticker")
oJson1:AppendString("pair", "BTCUSD")
nFinalFrame := 1
nSuccess := oWs:SendFrame(oJson1:Emit(), nFinalFrame)
// Subscribe to the ETHUSD ticker feed.
oJson2 := CreateObject("Chilkat.JsonObject")
oJson2:AppendString("event", "subscribe")
oJson2:AppendString("channel", "ticker")
oJson2:AppendString("pair", "ETHUSD")
nSuccess := oWs:SendFrame(oJson2:Emit(), nFinalFrame)
// Begin reading the ticker feed.
// / This will include a single confirmation response for each subscription.
// We'll just read the 1st 5 updates and then exit..
nReceivedFinalFrame := 0
nNumUpdatesReceived := 0
DO WHILE nNumUpdatesReceived < 7
nSuccess := oWs:ReadFrame()
IF (nSuccess != 1)
? "Failed to receive a frame"
? "ReadFrame fail reason = " + Str(oWs:ReadFrameFailReason)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson1:destroy()
oJson2:destroy()
RETURN
ENDIF
// The responses we desire are in Text frames, where the opcode = 1.
IF (oWs:FrameOpcodeInt == 1)
cReceivedText := oWs:GetFrameData()
? cReceivedText
// Should receive a line of text such as this:
// [2751,7349,36.34269559,7349.1,41.01777063,-116.2,-0.0156,7349.1,22188.26055319,7560,7270.5]
// Initially, a single confirmation response for each subscription would be received, such as this:
// {"event":"subscribed","channel":"ticker","chanId":810,"pair":"BTCUSD"}
nNumUpdatesReceived := nNumUpdatesReceived + 1
ENDIF
ENDDO
// This is sample output:
// You can see that the 1st message received is the subscription confirmation for the BTCUSD subscribe request.
// The next message is a BTCUSD ticker update.
// The next message is the confirmation for the ETHUSD subscription.
// The next message is an ETHUSD update.
// The BTCUSD channel ID is "537", and the ETHUSD channel ID is "700". The channel IDs are provided in the
// subscription confirmation messages. Each ticker update begins with the channel ID..
// {"event":"subscribed","channel":"ticker","chanId":537,"pair":"BTCUSD"}
// [537,6457.9,79.59102302,6458,22.49395741,-24.1,-0.0037,6457.9,13644.52820029,6540,6370.76958739]
// {"event":"subscribed","channel":"ticker","chanId":700,"pair":"ETHUSD"}
// [700,496.9,247.24493326,496.92,284.09636979,-2.47,-0.0049,496.9,74154.05945261,502.85,486.96]
// [537,"hb"]
// [700,"hb"]
// [700,496.92,233.34338276,496.93,431.78867277,-2.45,-0.0049,496.92,74167.99173586,502.85,486.96]
// Close the websocket connection.
nSuccess := oWs:SendClose(1, 1000, "Closing this websocket.")
IF (nSuccess != 1)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson1:destroy()
oJson2:destroy()
RETURN
ENDIF
// Read the Close response.
nSuccess := oWs:ReadFrame()
IF (nSuccess != 1)
? "ReadFrame fail reason = " + Str(oWs:ReadFrameFailReason)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson1:destroy()
oJson2:destroy()
RETURN
ENDIF
? "Success."
oWs:destroy()
oRest:destroy()
oJson1:destroy()
oJson2:destroy()