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

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