Sample code for 30+ languages & platforms
PureBasic

Binary.com Tick Stream

See more WebSocket Examples

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

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkRest.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkWebSocket.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    ws.i = CkWebSocket::ckCreate()
    If ws.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; 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.

    rest.i = CkRest::ckCreate()
    If rest.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Connect to ws.binaryws.com
    success = CkRest::ckConnect(rest,"ws.binaryws.com",443,1,0)
    CkWebSocket::ckUseConnection(ws,rest)
    CkWebSocket::ckAddClientHeaders(ws)

    ; My app_id is 12332.  You'll wnat to use your own...
    responseBody.s = CkRest::ckFullRequestNoBody(rest,"GET","/websockets/v3?app_id=12332")
    success = CkWebSocket::ckValidateServerHandshake(ws)
    If success <> 1
        Debug CkWebSocket::ckLastErrorText(ws)
        Debug responseBody
        Debug CkRest::ckResponseHeader(rest)
        CkWebSocket::ckDispose(ws)
        CkRest::ckDispose(rest)
        ProcedureReturn
    EndIf

    ; Build and send the following message:

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

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckAppendString(json,"ticks","R_50")
    CkJsonObject::ckAppendInt(json,"subscribe",1)

    ; Send a full message in a single frame
    finalFrame.i = 1
    success = CkWebSocket::ckSendFrame(ws,CkJsonObject::ckEmit(json),finalFrame)
    If success <> 1
        Debug CkWebSocket::ckLastErrorText(ws)
        CkWebSocket::ckDispose(ws)
        CkRest::ckDispose(rest)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    jsonTickData.i = CkJsonObject::ckCreate()
    If jsonTickData.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::setCkEmitCompact(jsonTickData, 0)

    ; Begin reading the tick stream response.
    ; We'll just read the 1st 10 updates and then exit..
    receivedFinalFrame.i = 0
    numTicksReceived.i = 0
    While numTicksReceived < 5

        success = CkWebSocket::ckReadFrame(ws)
        If success <> 1
            Debug "Failed to receive a frame"
            Debug "ReadFrame fail reason = " + Str(CkWebSocket::ckReadFrameFailReason(ws))
            Debug CkWebSocket::ckLastErrorText(ws)
            CkWebSocket::ckDispose(ws)
            CkRest::ckDispose(rest)
            CkJsonObject::ckDispose(json)
            CkJsonObject::ckDispose(jsonTickData)
            ProcedureReturn
        EndIf

        ; The responses we desire are in Text frames, where the opcode = 1.
        If CkWebSocket::ckFrameOpcodeInt(ws) = 1
            receivedJson.s = CkWebSocket::ckGetFrameData(ws)

            CkJsonObject::ckLoad(jsonTickData,receivedJson)
            Debug CkJsonObject::ckEmit(jsonTickData)

            numTicksReceived = numTicksReceived + 1
        EndIf

    Wend

    ; Close the websocket connection.
    success = CkWebSocket::ckSendClose(ws,1,1000,"Closing this websocket.")
    If success <> 1
        Debug CkWebSocket::ckLastErrorText(ws)
        CkWebSocket::ckDispose(ws)
        CkRest::ckDispose(rest)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonTickData)
        ProcedureReturn
    EndIf

    ; Read the Close response.
    success = CkWebSocket::ckReadFrame(ws)
    If success <> 1
        Debug "ReadFrame fail reason = " + Str(CkWebSocket::ckReadFrameFailReason(ws))
        Debug CkWebSocket::ckLastErrorText(ws)
        CkWebSocket::ckDispose(ws)
        CkRest::ckDispose(rest)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(jsonTickData)
        ProcedureReturn
    EndIf

    Debug "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.


    CkWebSocket::ckDispose(ws)
    CkRest::ckDispose(rest)
    CkJsonObject::ckDispose(json)
    CkJsonObject::ckDispose(jsonTickData)


    ProcedureReturn
EndProcedure