Skip to content

Commit 063f646

Browse files
authored
add trade stream to Gate.IO (#739)
- fixed ExchangeMarket.Active bug
1 parent ae96858 commit 063f646

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

src/ExchangeSharp/API/Exchanges/GateIo/ExchangeGateIoAPI.cs

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)