Sample code for 30+ languages & platforms
Xbase++

Binary.com Tick Stream

See more WebSocket Examples

Tick Stream Request -- Initiate a continuous stream of spot price updates for a given symbol.

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oWs
LOCAL oRest
LOCAL cResponseBody
LOCAL oJson
LOCAL nFinalFrame
LOCAL oJsonTickData
LOCAL nReceivedFinalFrame
LOCAL nNumTicksReceived
LOCAL cReceivedJson

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 ws.binaryws.com
nSuccess := oRest:Connect("ws.binaryws.com", 443, 1, 0)
oWs:UseConnection(oRest)
oWs:AddClientHeaders()

//  My app_id is 12332.  You'll wnat to use your own...
cResponseBody := oRest:FullRequestNoBody("GET", "/websockets/v3?app_id=12332")
nSuccess := oWs:ValidateServerHandshake()
IF (nSuccess != 1)
    ? oWs:LastErrorText
    ? cResponseBody
    ? oRest:ResponseHeader
    oWs:destroy()
    oRest:destroy()
    RETURN
ENDIF

//  Build and send the following message:

//  {
//    "ticks": "R_50",
//    "subscribe": 1
//  }

oJson := CreateObject("Chilkat.JsonObject")
oJson:AppendString("ticks", "R_50")
oJson:AppendInt("subscribe", 1)

//  Send a full message in a single frame
nFinalFrame := 1
nSuccess := oWs:SendFrame(oJson:Emit(), nFinalFrame)
IF (nSuccess != 1)
    ? oWs:LastErrorText
    oWs:destroy()
    oRest:destroy()
    oJson:destroy()
    RETURN
ENDIF

oJsonTickData := CreateObject("Chilkat.JsonObject")
oJsonTickData:EmitCompact := 0

//  Begin reading the tick stream response.
//  We'll just read the 1st 10 updates and then exit..
nReceivedFinalFrame := 0
nNumTicksReceived := 0
DO WHILE nNumTicksReceived < 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()
        oJsonTickData:destroy()
        RETURN
    ENDIF

    //  The responses we desire are in Text frames, where the opcode = 1.
    IF (oWs:FrameOpcodeInt == 1)
        cReceivedJson := oWs:GetFrameData()

        oJsonTickData:Load(cReceivedJson)
        ? oJsonTickData:Emit()

        nNumTicksReceived := nNumTicksReceived + 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()
    oJsonTickData: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()
    oJsonTickData:destroy()
    RETURN
ENDIF

? "Success."

//  The output of the above code is shown here:

//  {
//    "echo_req": {
//      "subscribe": 1,
//      "ticks": "R_50"
//    },
//    "msg_type": "tick",
//    "tick": {
//      "ask": "373.8725",
//      "bid": "373.8325",
//      "epoch": "1517437456",
//      "id": "2d3dedf1-45e2-66a5-d0d3-72bd7f0a6ea9",
//      "quote": "373.8525",
//      "symbol": "R_50"
//    }
//  }
//  
//  {
//    "echo_req": {
//      "subscribe": 1,
//      "ticks": "R_50"
//    },
//    "msg_type": "tick",
//    "tick": {
//      "ask": "373.7952",
//      "bid": "373.7552",
//      "epoch": "1517437458",
//      "id": "2d3dedf1-45e2-66a5-d0d3-72bd7f0a6ea9",
//      "quote": "373.7752",
//      "symbol": "R_50"
//    }
//  }
//  
//  {
//    "echo_req": {
//      "subscribe": 1,
//      "ticks": "R_50"
//    },
//    "msg_type": "tick",
//    "tick": {
//      "ask": "373.8638",
//      "bid": "373.8238",
//      "epoch": "1517437460",
//      "id": "2d3dedf1-45e2-66a5-d0d3-72bd7f0a6ea9",
//      "quote": "373.8438",
//      "symbol": "R_50"
//    }
//  }
//  
//  {
//    "echo_req": {
//      "subscribe": 1,
//      "ticks": "R_50"
//    },
//    "msg_type": "tick",
//    "tick": {
//      "ask": "373.7636",
//      "bid": "373.7236",
//      "epoch": "1517437462",
//      "id": "2d3dedf1-45e2-66a5-d0d3-72bd7f0a6ea9",
//      "quote": "373.7436",
//      "symbol": "R_50"
//    }
//  }
//  
//  {
//    "echo_req": {
//      "subscribe": 1,
//      "ticks": "R_50"
//    },
//    "msg_type": "tick",
//    "tick": {
//      "ask": "373.6870",
//      "bid": "373.6470",
//      "epoch": "1517437464",
//      "id": "2d3dedf1-45e2-66a5-d0d3-72bd7f0a6ea9",
//      "quote": "373.6670",
//      "symbol": "R_50"
//    }
//  }
//  
//  Success.

oWs:destroy()
oRest:destroy()
oJson:destroy()
oJsonTickData:destroy()