SQL Server
SQL Server
Read Bitfinex WebSocket Ticker Channel
See more WebSocket Examples
Subscribes to the public Bitfinex websocket ticker channel and receives ticker 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 api.bitfinex.com
EXEC sp_OAMethod @rest, 'Connect', @success OUT, 'api.bitfinex.com', 443, 1, 0
EXEC sp_OAMethod @ws, 'UseConnection', @success OUT, @rest
EXEC sp_OAMethod @ws, 'AddClientHeaders', @success OUT
DECLARE @responseBody nvarchar(4000)
EXEC sp_OAMethod @rest, 'FullRequestNoBody', @responseBody OUT, 'GET', '/ws'
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
-- After connecting, the bitfinex websocket server will send
-- an info message that contains the actual version of the websocket stream.
-- Receive that message..
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
RETURN
END
-- We should get this:
-- {"event":"info","version":1.1,"platform":{"status":1}}
EXEC sp_OAMethod @ws, 'GetFrameData', @sTmp0 OUT
PRINT @sTmp0
-- Subscribe to the public ticker feed.
-- See https://docs.bitfinex.com/docs for more information.
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
EXEC sp_OAMethod @json, 'AppendString', @success OUT, 'event', 'subscribe'
EXEC sp_OAMethod @json, 'AppendString', @success OUT, 'channel', 'ticker'
EXEC sp_OAMethod @json, 'AppendString', @success OUT, 'pair', 'BTCUSD'
DECLARE @finalFrame int
SELECT @finalFrame = 1
EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
EXEC sp_OAMethod @ws, 'SendFrame', @success OUT, @sTmp0, @finalFrame
-- Read the response.
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
RETURN
END
-- Examine the response
-- We should get this:
-- {"event":"subscribed","channel":"ticker","chanId":2751,"pair":"BTCUSD"}
EXEC sp_OAMethod @ws, 'GetFrameData', @sTmp0 OUT
PRINT @sTmp0
-- Begin reading the ticker feed.
-- We'll just read the 1st 5 updates and then exit..
DECLARE @receivedFinalFrame int
SELECT @receivedFinalFrame = 0
DECLARE @numUpdatesReceived int
SELECT @numUpdatesReceived = 0
WHILE @numUpdatesReceived < 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
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 @receivedText nvarchar(4000)
EXEC sp_OAMethod @ws, 'GetFrameData', @receivedText OUT
PRINT @receivedText
-- 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]
SELECT @numUpdatesReceived = @numUpdatesReceived + 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
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
RETURN
END
PRINT 'Success.'
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
EXEC @hr = sp_OADestroy @json
END
GO