Skip to content

Commit d155220

Browse files
authored
[Poloniex] Add websocket candle feed (#799)
* Fix typo in CryptoUtiliy.SecondsToPeriodStringLongReverse XML tag summary * Grouping websocket methods * OnGetDeltaOrderBookWebSocketAsync to expression body * Implement GetCandlesWebSocketAsync
1 parent 82d9e60 commit d155220

File tree

2 files changed

+60
-46
lines changed

2 files changed

+60
-46
lines changed

src/ExchangeSharp/API/Exchanges/Poloniex/ExchangePoloniexAPI.cs

Lines changed: 59 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -456,51 +456,6 @@ protected override async Task<IEnumerable<KeyValuePair<string, ExchangeTicker>>>
456456
return tickers;
457457
}
458458

459-
protected override async Task<IWebSocket> OnGetTickersWebSocketAsync(
460-
Action<IReadOnlyCollection<KeyValuePair<string, ExchangeTicker>>> callback,
461-
params string[] symbols) =>
462-
await ConnectWebsocketPublicAsync(
463-
async (socket) => { await SubscribeToChannel(socket, "ticker", symbols); },
464-
async (socket, symbol, sArray, token) =>
465-
{
466-
var tickers = new List<KeyValuePair<string, ExchangeTicker>>
467-
{
468-
new KeyValuePair<string, ExchangeTicker>(symbol,
469-
await this.ParseTickerWebSocketAsync(symbol, token))
470-
};
471-
callback(tickers);
472-
});
473-
474-
protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(
475-
Func<KeyValuePair<string, ExchangeTrade>, Task> callback,
476-
params string[] marketSymbols) =>
477-
await ConnectWebsocketPublicAsync(
478-
async (socket) => { await SubscribeToChannel(socket, "trades", marketSymbols); },
479-
async (socket, symbol, sArray, token) =>
480-
{
481-
var trade = token.ParseTrade(amountKey: "quantity", priceKey: "price", typeKey: "takerSide",
482-
timestampKey: "ts", TimestampType.UnixMilliseconds, idKey: "id");
483-
await callback(new KeyValuePair<string, ExchangeTrade>(symbol, trade));
484-
});
485-
486-
protected override async Task<IWebSocket> OnGetDeltaOrderBookWebSocketAsync(
487-
Action<ExchangeOrderBook> callback,
488-
int maxCount = 20,
489-
params string[] marketSymbols)
490-
{
491-
return await ConnectWebsocketPublicAsync(
492-
async (socket) =>
493-
{
494-
await SubscribeToOrderBookDepthChannel(socket, marketSymbols, maxCount);
495-
}, (socket, symbol, sArray, token) =>
496-
{
497-
var book = token.ParseOrderBookFromJTokenArrays();
498-
book.MarketSymbol = symbol;
499-
callback(book);
500-
return Task.CompletedTask;
501-
});
502-
}
503-
504459
protected override async Task<ExchangeOrderBook> OnGetOrderBookAsync(string marketSymbol, int maxCount = 100)
505460
{
506461
//https://api.poloniex.com/markets/{symbol}/orderBook?scale={scale}&limit={limit}
@@ -853,6 +808,65 @@ protected override async Task<IEnumerable<ExchangeTransaction>> OnGetDepositHist
853808
return transactions;
854809
}
855810

811+
protected override async Task<IWebSocket> OnGetTickersWebSocketAsync(
812+
Action<IReadOnlyCollection<KeyValuePair<string, ExchangeTicker>>> callback,
813+
params string[] symbols) =>
814+
await ConnectWebsocketPublicAsync(
815+
async (socket) => { await SubscribeToChannel(socket, "ticker", symbols); },
816+
async (socket, symbol, sArray, token) =>
817+
{
818+
var tickers = new List<KeyValuePair<string, ExchangeTicker>>
819+
{
820+
new KeyValuePair<string, ExchangeTicker>(symbol,
821+
await this.ParseTickerWebSocketAsync(symbol, token))
822+
};
823+
callback(tickers);
824+
});
825+
826+
protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(
827+
Func<KeyValuePair<string, ExchangeTrade>, Task> callback,
828+
params string[] marketSymbols) =>
829+
await ConnectWebsocketPublicAsync(
830+
async (socket) => { await SubscribeToChannel(socket, "trades", marketSymbols); },
831+
async (socket, symbol, sArray, token) =>
832+
{
833+
var trade = token.ParseTrade(amountKey: "quantity", priceKey: "price", typeKey: "takerSide",
834+
timestampKey: "ts", TimestampType.UnixMilliseconds, idKey: "id");
835+
await callback(new KeyValuePair<string, ExchangeTrade>(symbol, trade));
836+
});
837+
838+
protected override async Task<IWebSocket> OnGetDeltaOrderBookWebSocketAsync(
839+
Action<ExchangeOrderBook> callback,
840+
int maxCount = 20,
841+
params string[] marketSymbols) =>
842+
await ConnectWebsocketPublicAsync(
843+
async (socket) => { await SubscribeToOrderBookDepthChannel(socket, marketSymbols, maxCount); },
844+
(socket, symbol, sArray, token) =>
845+
{
846+
var book = token.ParseOrderBookFromJTokenArrays();
847+
book.MarketSymbol = symbol;
848+
callback(book);
849+
return Task.CompletedTask;
850+
});
851+
852+
protected override async Task<IWebSocket> OnGetCandlesWebSocketAsync(
853+
Func<MarketCandle, Task> callback,
854+
int periodSeconds,
855+
params string[] marketSymbols) =>
856+
await ConnectWebsocketPublicAsync(
857+
async (socket) =>
858+
{
859+
await SubscribeToChannel(socket,
860+
$"candles_{CryptoUtility.SecondsToPeriodStringLongReverse(periodSeconds).ToLowerInvariant()}",
861+
marketSymbols);
862+
}, async (socket, symbol, sArray, token) =>
863+
{
864+
var candle = this.ParseCandle(token, symbol, periodSeconds, "open", "high", "low", "close",
865+
"ts", TimestampType.UnixMilliseconds, "quantity", "amount", null, "tradeCount");
866+
867+
await callback(candle);
868+
});
869+
856870
private static string ParseFeesCurrency(bool isBuy, string symbol)
857871
{
858872
string feesCurrency = null;

src/ExchangeSharp/Utility/CryptoUtility.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,7 @@ public static string SecondsToPeriodStringLong(int seconds)
12201220
}
12211221

12221222
/// <summary>
1223-
/// Convert seconds to a period string, i.e. SECOND_5, MINUTE_1, HOUR_2, DAY_3, WEEK_1week, MONTH_1, YEAR_1 etc.
1223+
/// Convert seconds to a period string, i.e. SECOND_5, MINUTE_1, HOUR_2, DAY_3, WEEK_1, MONTH_1, YEAR_1 etc.
12241224
/// </summary>
12251225
/// <param name="seconds">Seconds. Use 60 for minute, 3600 for hour, 3600*24 for day, 3600*24*30 for month.</param>
12261226
/// <returns>Period string</returns>

0 commit comments

Comments
 (0)