@@ -83,7 +83,8 @@ protected override async Task<IEnumerable<string>> OnGetMarketSymbolsAsync()
8383 {
8484 foreach ( JToken token in obj )
8585 {
86- symbols . Add ( token [ "id" ] . ToStringInvariant ( ) ) ;
86+ if ( token [ "trade_status" ] . ToStringLowerInvariant ( ) == "tradable" )
87+ symbols . Add ( token [ "id" ] . ToStringInvariant ( ) ) ;
8788 }
8889 }
8990 return symbols ;
@@ -117,7 +118,7 @@ protected internal override async Task<IEnumerable<ExchangeMarket>> OnGetMarketS
117118 var market = new ExchangeMarket
118119 {
119120 MarketSymbol = marketSymbolToken [ "id" ] . ToStringUpperInvariant ( ) ,
120- IsActive = marketSymbolToken [ "trade_status" ] . ToStringUpperInvariant ( ) == "tradable" ,
121+ IsActive = marketSymbolToken [ "trade_status" ] . ToStringLowerInvariant ( ) == "tradable" ,
121122 QuoteCurrency = marketSymbolToken [ "quote" ] . ToStringUpperInvariant ( ) ,
122123 BaseCurrency = marketSymbolToken [ "base" ] . ToStringUpperInvariant ( ) ,
123124 } ;
@@ -433,15 +434,15 @@ protected override async Task OnCancelOrderAsync(string orderId, string symbol =
433434 await MakeJsonRequestAsync < JToken > ( $ "/spot/orders/{ orderId } ?currency_pair={ symbol } ", BaseUrl , payload , "DELETE" ) ;
434435 }
435436
437+ string unixTimeInSeconds => ( ( long ) CryptoUtility . UnixTimestampFromDateTimeSeconds ( DateTime . Now ) ) . ToStringInvariant ( ) ;
436438 protected override async Task ProcessRequestAsync ( IHttpWebRequest request , Dictionary < string , object > ? payload )
437439 {
438440 if ( CanMakeAuthenticatedRequest ( payload ) )
439441 {
440442 payload . Remove ( "nonce" ) ;
441- var timestamp = ( ( long ) CryptoUtility . UnixTimestampFromDateTimeSeconds ( DateTime . Now ) ) . ToStringInvariant ( ) ;
442443
443444 request . AddHeader ( "KEY" , PublicApiKey ! . ToUnsecureString ( ) ) ;
444- request . AddHeader ( "Timestamp" , timestamp ) ;
445+ request . AddHeader ( "Timestamp" , unixTimeInSeconds ) ;
445446
446447 var privateApiKey = PrivateApiKey ! . ToUnsecureString ( ) ;
447448
@@ -453,7 +454,7 @@ protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dicti
453454 var hashBytes = sha512Hash . ComputeHash ( sourceBytes ) ;
454455 var bodyHash = BitConverter . ToString ( hashBytes ) . Replace ( "-" , "" ) . ToLowerInvariant ( ) ;
455456 var queryString = string . IsNullOrEmpty ( request . RequestUri . Query ) ? "" : request . RequestUri . Query . Substring ( 1 ) ;
456- var signatureString = $ "{ request . Method } \n { request . RequestUri . AbsolutePath } \n { queryString } \n { bodyHash } \n { timestamp } ";
457+ var signatureString = $ "{ request . Method } \n { request . RequestUri . AbsolutePath } \n { queryString } \n { bodyHash } \n { unixTimeInSeconds } ";
457458
458459 using ( HMACSHA512 hmac = new HMACSHA512 ( Encoding . UTF8 . GetBytes ( privateApiKey ) ) )
459460 {
@@ -469,5 +470,52 @@ protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dicti
469470 await base . ProcessRequestAsync ( request , payload ) ;
470471 }
471472 }
473+
474+ protected override async Task < IWebSocket > OnGetTradesWebSocketAsync ( Func < KeyValuePair < string , ExchangeTrade > , Task > callback , params string [ ] marketSymbols )
475+ {
476+ if ( marketSymbols == null || marketSymbols . Length == 0 )
477+ {
478+ marketSymbols = ( await GetMarketSymbolsAsync ( true ) ) . ToArray ( ) ;
479+ }
480+ return await ConnectPublicWebSocketAsync ( null , messageCallback : async ( _socket , msg ) =>
481+ {
482+ JToken parsedMsg = JToken . Parse ( msg . ToStringFromUTF8 ( ) ) ;
483+
484+ if ( parsedMsg [ "channel" ] . ToStringInvariant ( ) . Equals ( "spot.trades" ) )
485+ {
486+ if ( parsedMsg [ "error" ] != null )
487+ throw new APIException ( $ "Exchange returned error: { parsedMsg [ "error" ] . ToStringInvariant ( ) } ") ;
488+ else if ( parsedMsg [ "result" ] [ "status" ] . ToStringInvariant ( ) . Equals ( "success" ) )
489+ {
490+ // successfully subscribed to trade stream
491+ }
492+ else
493+ {
494+ var exchangeTrade = parsedMsg [ "result" ] . ParseTrade ( "amount" , "price" , "side" , "create_time_ms" , TimestampType . UnixMillisecondsDouble , "id" ) ;
495+
496+ await callback ( new KeyValuePair < string , ExchangeTrade > ( parsedMsg [ "result" ] [ "currency_pair" ] . ToStringInvariant ( ) , exchangeTrade ) ) ;
497+ }
498+ }
499+ } , connectCallback : async ( _socket ) =>
500+ { /*{ "time": int(time.time()),
501+ "channel": "spot.trades",
502+ "event": "subscribe", # "unsubscribe" for unsubscription
503+ "payload": ["BTC_USDT"]
504+ }*/
505+
506+ // this doesn't work for some reason
507+ //await _socket.SendMessageAsync(new
508+ //{
509+ // time = unixTimeInSeconds,
510+ // channel = "spot.trades",
511+ // @event = "subscribe",
512+ // payload = marketSymbols,
513+ //});
514+ var quotedSymbols = marketSymbols . Select ( s => $ "\" { s } \" ") ;
515+ var combinedString = string . Join ( "," , quotedSymbols ) ;
516+ await _socket . SendMessageAsync (
517+ $ "{{ \" time\" : { unixTimeInSeconds } ,\" channel\" : \" spot.trades\" ,\" event\" : \" subscribe\" ,\" payload\" : [{ combinedString } ] }}") ;
518+ } ) ;
519+ }
472520 }
473521}
0 commit comments