From 1fe0d9a6a7ed64ee65c83f078b70006da08d82fc Mon Sep 17 00:00:00 2001 From: Martin-Molinero Date: Thu, 16 Nov 2023 21:19:52 -0300 Subject: [PATCH] Minor data streaming fixes (#9) * Cleanup timer when there is a WS error * Fix no bid/ask price --- .../BybitBrokerageTests.Stream.cs | 1 + .../BybitBrokerageTests.cs | 1 + .../BybitBrokerage.Messaging.cs | 5 ++++ .../BybitWebSocketWrapper.cs | 24 +++++++++++++++---- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.Stream.cs b/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.Stream.cs index 7a7c2dc..79a2d63 100644 --- a/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.Stream.cs +++ b/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.Stream.cs @@ -33,6 +33,7 @@ private static TestCaseData[] TestParameters return new[] { // valid parameters, for example + new TestCaseData(MCUSDT, Resolution.Second, false), new TestCaseData(BTCUSDT, Resolution.Tick, false), new TestCaseData(BTCUSDT, Resolution.Minute, false), new TestCaseData(BTCUSDT, Resolution.Second, false), diff --git a/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.cs b/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.cs index 343fe89..6bf5e59 100644 --- a/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.cs +++ b/QuantConnect.BybitBrokerage.Tests/BybitBrokerageTests.cs @@ -36,6 +36,7 @@ namespace QuantConnect.BybitBrokerage.Tests [TestFixture, Explicit("Requires valid credentials to be setup and run outside USA")] public partial class BybitBrokerageTests : BrokerageTests { + private static Symbol MCUSDT = Symbol.Create("MCUSDT", SecurityType.CryptoFuture, "bybit"); private static Symbol BTCUSDT = Symbol.Create("BTCUSDT", SecurityType.Crypto, "bybit"); private BybitApi _client; protected override Symbol Symbol { get; } = BTCUSDT; diff --git a/QuantConnect.BybitBrokerage/BybitBrokerage.Messaging.cs b/QuantConnect.BybitBrokerage/BybitBrokerage.Messaging.cs index e36dcff..c690af7 100644 --- a/QuantConnect.BybitBrokerage/BybitBrokerage.Messaging.cs +++ b/QuantConnect.BybitBrokerage/BybitBrokerage.Messaging.cs @@ -326,6 +326,11 @@ private void HandleOrderBookSnapshot(BybitOrderBookUpdate orderBookUpdate, Bybit } orderBook.BestBidAskUpdated += OnBestBidAskUpdated; + if(orderBook.BestBidPrice == 0 && orderBook.BestAskPrice == 0) + { + // nothing to emit, can happen with illiquid assets + return; + } EmitQuoteTick(symbol, orderBook.BestBidPrice, orderBook.BestBidSize, orderBook.BestAskPrice, orderBook.BestAskSize); } diff --git a/QuantConnect.BybitBrokerage/BybitWebSocketWrapper.cs b/QuantConnect.BybitBrokerage/BybitWebSocketWrapper.cs index 197feb6..dcbef76 100644 --- a/QuantConnect.BybitBrokerage/BybitWebSocketWrapper.cs +++ b/QuantConnect.BybitBrokerage/BybitWebSocketWrapper.cs @@ -31,6 +31,7 @@ public class BybitWebSocketWrapper : WebSocketClientWrapper /// protected override void OnOpen() { + CleanUpTimer(); _pingTimer = new Timer(TimeSpan.FromSeconds(20).TotalMilliseconds); _pingTimer.Elapsed += PingTimerElapsed; _pingTimer.Start(); @@ -41,6 +42,24 @@ protected override void OnOpen() /// Event invocator for the event /// protected override void OnClose(WebSocketCloseData e) + { + CleanUpTimer(); + base.OnClose(e); + } + + /// + /// Event invocator for the event + /// + protected override void OnError(WebSocketError e) + { + CleanUpTimer(); + base.OnError(e); + } + + /// + /// Helper method to clean up timer if required + /// + private void CleanUpTimer() { if (_pingTimer != null) { @@ -49,11 +68,8 @@ protected override void OnClose(WebSocketCloseData e) _pingTimer.Dispose(); _pingTimer = null; } - - base.OnClose(e); } - - + private void PingTimerElapsed(object sender, ElapsedEventArgs e) { Send("{\"op\":\"ping\"}");