Xbase++
Xbase++
Read Bitfinex WebSocket Ticker Channel
See more WebSocket Examples
Subscribes to the public Bitfinex websocket ticker channel and receives ticker updates.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oWs
LOCAL oRest
LOCAL cResponseBody
LOCAL oJson
LOCAL nFinalFrame
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 public ticker feed.
// See https://docs.bitfinex.com/docs for more information.
oJson := CreateObject("Chilkat.JsonObject")
oJson:AppendString("event", "subscribe")
oJson:AppendString("channel", "ticker")
oJson:AppendString("pair", "BTCUSD")
nFinalFrame := 1
nSuccess := oWs:SendFrame(oJson:Emit(), nFinalFrame)
// Read the response.
nSuccess := oWs:ReadFrame()
IF (nSuccess != 1)
? "Failed to receive a frame"
? "ReadFrame fail reason = " + Str(oWs:ReadFrameFailReason)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson:destroy()
RETURN
ENDIF
// Examine the response
// We should get this:
// {"event":"subscribed","channel":"ticker","chanId":2751,"pair":"BTCUSD"}
? oWs:GetFrameData()
// Begin reading the ticker feed.
// We'll just read the 1st 5 updates and then exit..
nReceivedFinalFrame := 0
nNumUpdatesReceived := 0
DO WHILE nNumUpdatesReceived < 5
nSuccess := oWs:ReadFrame()
IF (nSuccess != 1)
? "Failed to receive a frame"
? "ReadFrame fail reason = " + Str(oWs:ReadFrameFailReason)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson: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]
nNumUpdatesReceived := nNumUpdatesReceived + 1
ENDIF
ENDDO
// Close the websocket connection.
nSuccess := oWs:SendClose(1, 1000, "Closing this websocket.")
IF (nSuccess != 1)
? oWs:LastErrorText
oWs:destroy()
oRest:destroy()
oJson: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()
oJson:destroy()
RETURN
ENDIF
? "Success."
oWs:destroy()
oRest:destroy()
oJson:destroy()