Skip to content

Commit

Permalink
Fix cap problem (#865)
Browse files Browse the repository at this point in the history
  • Loading branch information
v36u authored Feb 7, 2025
1 parent 2f7603a commit a6e5527
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 46 deletions.
25 changes: 13 additions & 12 deletions src/ExchangeSharp/API/Exchanges/KuCoin/ExchangeKuCoinAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private ExchangeKuCoinAPI()
NonceEndPointField = "data";
NonceEndPointStyle = NonceStyle.UnixMilliseconds;
MarketSymbolSeparator = "-";
RateLimit = new RateGate(20, TimeSpan.FromSeconds(60.0));
RateLimit = new RateGate(60, TimeSpan.FromSeconds(1)); // https://www.kucoin.com/docs/basic-info/request-rate-limit/rest-api
WebSocketOrderBookType = WebSocketOrderBookType.FullBookFirstThenDeltas;
}

Expand Down Expand Up @@ -875,6 +875,16 @@ params string[] marketSymbols

var initialSequenceIds = new Dictionary<string, long>();

foreach (var marketSymbol in marketSymbols)
{
var initialBook = await OnGetOrderBookAsync(marketSymbol, maxCount);
initialBook.IsFromSnapshot = true;

callback(initialBook);

initialSequenceIds[marketSymbol] = initialBook.SequenceId;
}

var websocketUrlToken = GetWebsocketBulletToken();

return await ConnectPublicWebSocketAsync(
Expand Down Expand Up @@ -958,19 +968,10 @@ params string[] marketSymbols
},
connectCallback: async (_socket) =>
{
// Get full order book snapshot when connecting
foreach (var marketSymbol in marketSymbols)
{
var initialBook = await OnGetOrderBookAsync(marketSymbol, maxCount);
initialBook.IsFromSnapshot = true;

callback(initialBook);

initialSequenceIds[marketSymbol] = initialBook.SequenceId;
}
var marketSymbolsForSubscriptionString = string.Join(",", marketSymbols);

var id = CryptoUtility.UtcNow.Ticks;
var topic = $"/market/level2:{string.Join(",", marketSymbols)}";
var topic = $"/market/level2:{marketSymbolsForSubscriptionString}";
await _socket.SendMessageAsync(
new
{
Expand Down
43 changes: 24 additions & 19 deletions src/ExchangeSharp/API/Exchanges/MEXC/ExchangeMEXCAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -383,12 +383,28 @@ params string[] marketSymbols

var initialSequenceIds = new Dictionary<string, long>();

foreach (var marketSymbol in marketSymbols)
{
var initialBook = await OnGetOrderBookAsync(marketSymbol, maxCount);
initialBook.IsFromSnapshot = true;

callback(initialBook);

initialSequenceIds[marketSymbol] = initialBook.SequenceId;
}

return await ConnectPublicWebSocketAsync(
string.Empty,
(_socket, msg) =>
{
var json = msg.ToStringFromUTF8();

if (json.Contains("invalid") || json.Contains("Not Subscribed"))
{
Logger.Warn(json);
return Task.CompletedTask;
}

MarketDepthDiffUpdate update = null;
try
{
Expand Down Expand Up @@ -450,26 +466,15 @@ params string[] marketSymbols
},
async (_socket) =>
{
foreach (var marketSymbol in marketSymbols) // "Every websocket connection maximum support 30 subscriptions at one time." - API docs
{
var initialBook = await OnGetOrderBookAsync(marketSymbol, maxCount);
initialBook.IsFromSnapshot = true;

callback(initialBook);

initialSequenceIds[marketSymbol] = initialBook.SequenceId;

var subscriptionParams = new List<string>
{
$"[email protected]@{marketSymbol}"
};
var subscriptionParams = marketSymbols
.Select(ms => $"[email protected]@{ms}")
.ToList();

await _socket.SendMessageAsync(new WebSocketSubscription
{
Method = "SUBSCRIPTION",
Params = subscriptionParams,
});
}
await _socket.SendMessageAsync(new WebSocketSubscription
{
Method = "SUBSCRIPTION",
Params = subscriptionParams,
});
}
);
}
Expand Down
50 changes: 35 additions & 15 deletions src/ExchangeSharp/API/Exchanges/_Base/ExchangeAPIExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -474,28 +474,48 @@ internal static ExchangeOrderBook ParseOrderBookFromJTokenArrays(
string sequence = "ts"
)
{
var book = new ExchangeOrderBook
var book = new ExchangeOrderBook();

if (token == null)
{
SequenceId = token[sequence].ConvertInvariant<long>()
};
foreach (var array in token[asks])
Logger.Warn($"Null token in {nameof(ParseOrderBookFromJTokenArrays)}");
return book;
}

book.SequenceId = token[sequence].ConvertInvariant<long>();

if (token[asks] != null)
{
var depth = new ExchangeOrderPrice
foreach (var array in token[asks])
{
Price = array[0].ConvertInvariant<decimal>(),
Amount = array[1].ConvertInvariant<decimal>()
};
book.Asks[depth.Price] = depth;
var depth = new ExchangeOrderPrice
{
Price = array[0].ConvertInvariant<decimal>(),
Amount = array[1].ConvertInvariant<decimal>()
};
book.Asks[depth.Price] = depth;
}
}
else
{
Logger.Warn($"No asks in {nameof(ParseOrderBookFromJTokenArrays)}");
}

foreach (var array in token[bids])
if (token[bids] != null)
{
var depth = new ExchangeOrderPrice
foreach (var array in token[bids])
{
Price = array[0].ConvertInvariant<decimal>(),
Amount = array[1].ConvertInvariant<decimal>()
};
book.Bids[depth.Price] = depth;
var depth = new ExchangeOrderPrice
{
Price = array[0].ConvertInvariant<decimal>(),
Amount = array[1].ConvertInvariant<decimal>()
};
book.Bids[depth.Price] = depth;
}
}
else
{
Logger.Error($"No bids in {nameof(ParseOrderBookFromJTokenArrays)}");
}

return book;
Expand Down

0 comments on commit a6e5527

Please sign in to comment.