@@ -1142,6 +1142,15 @@ private async Task<List<string>> GetMarketSymbolList(string[] marketSymbols)
1142
1142
return marketSymbolList ;
1143
1143
}
1144
1144
1145
+ /// <summary>
1146
+ /// Handle Kraken "book" channel message: https://docs.kraken.com/websockets/#message-book
1147
+ /// Note in the "update payload" case there may be varying number of update blocks for
1148
+ /// bid/ask updates. The last such block has a checksum. The market symbol is always the last item.
1149
+ /// </summary>
1150
+ /// <param name="callback"></param>
1151
+ /// <param name="maxCount"></param>
1152
+ /// <param name="marketSymbols"></param>
1153
+ /// <returns></returns>
1145
1154
protected override async Task < IWebSocket > OnGetDeltaOrderBookWebSocketAsync (
1146
1155
Action < ExchangeOrderBook > callback ,
1147
1156
int maxCount = 20 ,
@@ -1158,15 +1167,16 @@ params string[] marketSymbols
1158
1167
string message = msg . ToStringFromUTF8 ( ) ;
1159
1168
var book = new ExchangeOrderBook ( ) ;
1160
1169
1170
+ // SNAPSHOT payload
1161
1171
if ( message . Contains ( "\" as\" " ) || message . Contains ( "\" bs\" " ) )
1162
1172
{
1163
1173
// parse delta update
1164
- var delta = JsonConvert . DeserializeObject ( message ) as JArray ;
1174
+ var snapshot = JsonConvert . DeserializeObject ( message ) as JArray ;
1165
1175
1166
- book . MarketSymbol = delta [ 3 ] . ToString ( ) ;
1176
+ book . MarketSymbol = snapshot [ 3 ] . ToString ( ) ;
1167
1177
1168
- var asks = delta [ 1 ] [ "as" ] . ToList ( ) ;
1169
- var bids = delta [ 1 ] [ "bs" ] . ToList ( ) ;
1178
+ var asks = snapshot [ 1 ] [ "as" ] . ToList ( ) ;
1179
+ var bids = snapshot [ 1 ] [ "bs" ] . ToList ( ) ;
1170
1180
1171
1181
var lastUpdatedTime = DateTime . MinValue ;
1172
1182
@@ -1205,16 +1215,16 @@ params string[] marketSymbols
1205
1215
{
1206
1216
// parse delta update
1207
1217
var delta = JsonConvert . DeserializeObject ( message ) as JArray ;
1218
+ book . MarketSymbol = delta . Last . ToString ( ) ;
1208
1219
1209
- book . MarketSymbol = delta [ 3 ] . ToString ( ) ;
1220
+ var _a = delta . FirstOrDefault ( token => token is JObject && token [ "a" ] != null ) ;
1221
+ var _b = delta . FirstOrDefault ( token => token is JObject && token [ "b" ] != null ) ;
1210
1222
1211
1223
var lastUpdatedTime = DateTime . MinValue ;
1212
1224
1213
- var updates = delta [ 1 ] ;
1214
-
1215
- if ( updates [ "a" ] != null )
1225
+ if ( _a != null )
1216
1226
{
1217
- var asks = updates [ "a" ] . ToList ( ) ;
1227
+ var asks = _a [ "a" ] . ToList ( ) ;
1218
1228
1219
1229
foreach ( var ask in asks )
1220
1230
{
@@ -1230,9 +1240,9 @@ params string[] marketSymbols
1230
1240
}
1231
1241
}
1232
1242
1233
- if ( updates [ "b" ] != null )
1243
+ if ( _b != null )
1234
1244
{
1235
- var bids = updates [ "b" ] . ToList ( ) ;
1245
+ var bids = _b [ "b" ] . ToList ( ) ;
1236
1246
1237
1247
foreach ( var bid in bids )
1238
1248
{
@@ -1251,6 +1261,11 @@ params string[] marketSymbols
1251
1261
book . LastUpdatedUtc = lastUpdatedTime ;
1252
1262
book . SequenceId = lastUpdatedTime . Ticks ;
1253
1263
1264
+ //https://docs.kraken.com/websockets/#book-checksum
1265
+ //"c" belongs to the last update block
1266
+ var checksum = _b ? [ "c" ] ?? _a ? [ "c" ] ;
1267
+ book . Checksum = ( checksum as JValue ) ? . ToString ( ) ;
1268
+
1254
1269
callback ( book ) ;
1255
1270
}
1256
1271
0 commit comments