SQL Server
SQL Server
WebSocket Binance Trade Stream (subscribe and receive updates)
See more WebSocket Examples
Subscribe to a binance trade stream and receive updates.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @ws int
EXEC @hr = sp_OACreate 'Chilkat.WebSocket', @ws OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- 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.
DECLARE @rest int
EXEC @hr = sp_OACreate 'Chilkat.Rest', @rest OUT
-- Connect to wss://stream.binance.com:9443
EXEC sp_OAMethod @rest, 'Connect', @success OUT, 'stream.binance.com', 9443, 1, 0
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @rest, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
EXEC sp_OAMethod @ws, 'UseConnection', @success OUT, @rest
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
EXEC sp_OAMethod @ws, 'AddClientHeaders', @success OUT
-- Raw streams are accessed at /ws/<streamName>
DECLARE @responseBody nvarchar(4000)
EXEC sp_OAMethod @rest, 'FullRequestNoBody', @responseBody OUT, 'GET', '/ws/btcusdt'
EXEC sp_OAGetProperty @rest, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @rest, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
EXEC sp_OAMethod @ws, 'ValidateServerHandshake', @success OUT
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
PRINT @responseBody
EXEC sp_OAGetProperty @rest, 'ResponseHeader', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
PRINT @responseBody
EXEC sp_OAGetProperty @rest, 'ResponseHeader', @sTmp0 OUT
PRINT @sTmp0
-- POST JSON to subscribe to a stream
-- {
-- "method": "SUBSCRIBE",
-- "params":
-- [
-- "btcusdt@aggTrade",
-- "btcusdt@depth"
-- ],
-- "id": 1
-- }
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'method', 'SUBSCRIBE'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'params[0]', 'btcusdt@aggTrade'
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'params[1]', 'btcusdt@depth'
EXEC sp_OAMethod @json, 'UpdateInt', @success OUT, 'id', 1
-- Send a full message in a single frame
DECLARE @finalFrame int
SELECT @finalFrame = 1
EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
EXEC sp_OAMethod @ws, 'SendFrame', @success OUT, @sTmp0, @finalFrame
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
RETURN
END
DECLARE @jsonTradeData int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonTradeData OUT
EXEC sp_OASetProperty @jsonTradeData, 'EmitCompact', 0
-- Begin reading the trade stream response.
-- We'll just read the 1st 10 updates and then exit..
DECLARE @receivedFinalFrame int
SELECT @receivedFinalFrame = 0
DECLARE @numTradesReceived int
SELECT @numTradesReceived = 0
WHILE @numTradesReceived < 5
BEGIN
EXEC sp_OAMethod @ws, 'ReadFrame', @success OUT
IF @success <> 1
BEGIN
PRINT 'Failed to receive a frame'
EXEC sp_OAGetProperty @ws, 'ReadFrameFailReason', @iTmp0 OUT
PRINT 'ReadFrame fail reason = ' + @iTmp0
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonTradeData
RETURN
END
-- The responses we desire are in Text frames, where the opcode = 1.
EXEC sp_OAGetProperty @ws, 'FrameOpcodeInt', @iTmp0 OUT
IF @iTmp0 = 1
BEGIN
DECLARE @receivedJson nvarchar(4000)
EXEC sp_OAMethod @ws, 'GetFrameData', @receivedJson OUT
EXEC sp_OAMethod @jsonTradeData, 'Load', @success OUT, @receivedJson
EXEC sp_OAMethod @jsonTradeData, 'Emit', @sTmp0 OUT
PRINT @sTmp0
SELECT @numTradesReceived = @numTradesReceived + 1
END
END
-- Close the websocket connection.
EXEC sp_OAMethod @ws, 'SendClose', @success OUT, 1, 1000, 'Closing this websocket.'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonTradeData
RETURN
END
-- Read the Close response.
EXEC sp_OAMethod @ws, 'ReadFrame', @success OUT
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'ReadFrameFailReason', @iTmp0 OUT
PRINT 'ReadFrame fail reason = ' + @iTmp0
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonTradeData
RETURN
END
PRINT 'Success.'
-- The output of the above code is shown here:
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonTradeData
END
GO