@@ -440,6 +440,121 @@ protected override async Task<ExchangeWithdrawalResponse> OnWithdrawAsync(Exchan
440
440
441
441
// working on it. Hitbtc has extensive support for sockets, including trading
442
442
443
+ protected override IWebSocket OnGetTradesWebSocket ( Func < KeyValuePair < string , ExchangeTrade > , Task > callback , params string [ ] marketSymbols )
444
+ {
445
+ if ( marketSymbols == null || marketSymbols . Length == 0 )
446
+ {
447
+ marketSymbols = GetMarketSymbolsAsync ( ) . Sync ( ) . ToArray ( ) ;
448
+ }
449
+ return ConnectWebSocket ( null , messageCallback : async ( _socket , msg ) =>
450
+ {
451
+ JToken token = JToken . Parse ( msg . ToStringFromUTF8 ( ) ) ;
452
+ if ( token [ "error" ] != null )
453
+ { /* {
454
+ "jsonrpc": "2.0",
455
+ "error": {
456
+ "code": 2001,
457
+ "message": "Symbol not found",
458
+ "description": "Try get /api/2/public/symbol, to get list of all available symbols."
459
+ },
460
+ "id": 123
461
+ } */
462
+ Logger . Info ( token [ "error" ] [ "code" ] . ToStringInvariant ( ) + ", "
463
+ + token [ "error" ] [ "message" ] . ToStringInvariant ( ) + ", "
464
+ + token [ "error" ] [ "description" ] . ToStringInvariant ( ) ) ;
465
+ }
466
+ else if ( token [ "method" ] . ToStringInvariant ( ) == "snapshotTrades" )
467
+ { /* snapshot: {
468
+ "jsonrpc": "2.0",
469
+ "method": "snapshotTrades",
470
+ "params": {
471
+ "data": [
472
+ {
473
+ "id": 54469456,
474
+ "price": "0.054656",
475
+ "quantity": "0.057",
476
+ "side": "buy",
477
+ "timestamp": "2017-10-19T16:33:42.821Z"
478
+ },
479
+ {
480
+ "id": 54469497,
481
+ "price": "0.054656",
482
+ "quantity": "0.092",
483
+ "side": "buy",
484
+ "timestamp": "2017-10-19T16:33:48.754Z"
485
+ },
486
+ {
487
+ "id": 54469697,
488
+ "price": "0.054669",
489
+ "quantity": "0.002",
490
+ "side": "buy",
491
+ "timestamp": "2017-10-19T16:34:13.288Z"
492
+ }
493
+ ],
494
+ "symbol": "ETHBTC"
495
+ }
496
+ } */
497
+ token = token [ "params" ] ;
498
+ string marketSymbol = token [ "symbol" ] . ToStringInvariant ( ) ;
499
+ foreach ( var tradesToken in token [ "data" ] )
500
+ {
501
+ var trade = parseTrade ( tradesToken ) ;
502
+ trade . Flags |= ExchangeTradeFlags . IsFromSnapshot ;
503
+ await callback ( new KeyValuePair < string , ExchangeTrade > ( marketSymbol , trade ) ) ;
504
+ }
505
+ }
506
+ else if ( token [ "method" ] . ToStringInvariant ( ) == "updateTrades" )
507
+ { /* {
508
+ "jsonrpc": "2.0",
509
+ "method": "updateTrades",
510
+ "params": {
511
+ "data": [
512
+ {
513
+ "id": 54469813,
514
+ "price": "0.054670",
515
+ "quantity": "0.183",
516
+ "side": "buy",
517
+ "timestamp": "2017-10-19T16:34:25.041Z"
518
+ }
519
+ ],
520
+ "symbol": "ETHBTC"
521
+ }
522
+ } */
523
+ token = token [ "params" ] ;
524
+ string marketSymbol = token [ "symbol" ] . ToStringInvariant ( ) ;
525
+ foreach ( var tradesToken in token [ "data" ] )
526
+ {
527
+ var trade = parseTrade ( tradesToken ) ;
528
+ await callback ( new KeyValuePair < string , ExchangeTrade > ( marketSymbol , trade ) ) ;
529
+ }
530
+ }
531
+ } , connectCallback : async ( _socket ) =>
532
+ { /* {
533
+ "method": "subscribeTrades",
534
+ "params": {
535
+ "symbol": "ETHBTC",
536
+ "limit": 100
537
+ },
538
+ "id": 123
539
+ } */
540
+ foreach ( var marketSymbol in marketSymbols )
541
+ {
542
+ await _socket . SendMessageAsync ( new
543
+ {
544
+ method = "subscribeTrades" ,
545
+ @params = new {
546
+ symbol = marketSymbol ,
547
+ limit = 10 ,
548
+ } ,
549
+ id = CryptoUtility . UtcNow . Ticks // just need a unique number for client ID
550
+ } ) ;
551
+ }
552
+ } ) ;
553
+ ExchangeTrade parseTrade ( JToken token ) => token . ParseTrade ( amountKey : "quantity" ,
554
+ priceKey : "price" , typeKey : "side" , timestampKey : "timestamp" ,
555
+ timestampType : TimestampType . Iso8601 , idKey : "id" ) ;
556
+ }
557
+
443
558
#endregion
444
559
445
560
#region Hitbtc Public Functions outside the ExchangeAPI
0 commit comments