Sample code for 30+ languages & platforms
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

Xbase++
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()