Skip to content

Commit 9c11abb

Browse files
authored
add trade stream for UPbit (#765)
1 parent b5662df commit 9c11abb

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using Newtonsoft.Json.Linq;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace ExchangeSharp
9+
{
10+
public sealed partial class ExchangeUPbitAPI : ExchangeAPI
11+
{
12+
public override string BaseUrl { get; set; } = "https://api.upbit.com";
13+
public override string BaseUrlWebSocket { get; set; } = "wss://api.upbit.com/websocket/v1";
14+
15+
public ExchangeUPbitAPI()
16+
{
17+
//NonceStyle = NonceStyle.Iso8601; unclear what this is
18+
NonceOffset = TimeSpan.FromSeconds(0.1);
19+
// WebSocketOrderBookType = not implemented
20+
MarketSymbolSeparator = "-";
21+
MarketSymbolIsUppercase = true;
22+
// ExchangeGlobalCurrencyReplacements[] not implemented
23+
}
24+
25+
public override async Task<IEnumerable<string>> GetMarketSymbolsAsync()
26+
{ /*[
27+
{
28+
"market": "KRW-BTC",
29+
"korean_name": "비트코인",
30+
"english_name": "Bitcoin"
31+
},
32+
...
33+
] */
34+
var instruments = await MakeJsonRequestAsync<JToken>("v1/market/all");
35+
var markets = new List<ExchangeMarket>();
36+
foreach (JToken instrument in instruments)
37+
{
38+
markets.Add(new ExchangeMarket
39+
{
40+
MarketSymbol = instrument["market"].ToStringInvariant(),
41+
AltMarketSymbol = instrument["korean_name"].ToStringInvariant(),
42+
MarketId = instrument["english_name"].ToStringInvariant(),
43+
});
44+
}
45+
return markets.Select(m => m.MarketSymbol);
46+
}
47+
48+
public override async Task<IWebSocket> GetTradesWebSocketAsync(Func<KeyValuePair<string, ExchangeTrade>, Task> callback, params string[] marketSymbols)
49+
{
50+
if (marketSymbols == null || marketSymbols.Length == 0)
51+
{
52+
marketSymbols = (await GetMarketSymbolsAsync()).ToArray();
53+
}
54+
return await ConnectPublicWebSocketAsync("", async (_socket, msg) =>
55+
{
56+
/*{"mk":"KRW-BTC","tms":1523531768829,"td":"2018-04-12","ttm":"11:16:03","ttms":1523531763000,"tp":7691000.0,"tv":0.00996719,"ab":"BID","pcp":7429000.00000000,"c":"RISE","cp":262000.00000000,"sid":1523531768829000,"st":"SNAPSHOT"}
57+
{"mk":"BTC-BCH","tms":1523531745481,"td":"2018-04-12","ttm":"11:15:48","ttms":1523531748370,"tp":0.09601999,"tv":0.18711789,"ab":"BID","pcp":0.09618000,"c":"FALL","cp":0.00016001,"sid":15235317454810000,"st":"SNAPSHOT"}
58+
{"mk":"KRW-BTC","tms":1523531769250,"td":"2018-04-12","ttm":"11:16:04","ttms":1523531764000,"tp":7691000.0,"tv":0.07580113,"ab":"BID","pcp":7429000.00000000,"c":"RISE","cp":262000.00000000,"sid":1523531769250000,"st":"REALTIME"}*/
59+
JToken token = JToken.Parse(msg.ToStringFromUTF8());
60+
// UPbit does not provide an error element
61+
if (token["ty"].ToStringInvariant() == "trade")
62+
{
63+
var trade = token.ParseTrade("tv", "tp", "ab", "trade_timestamp", TimestampType.UnixMilliseconds, "sid", "BID");
64+
string marketSymbol = token["cd"].ToStringInvariant();
65+
if (token["st"].ToStringInvariant() == "SNAPSHOT")
66+
{
67+
trade.Flags |= ExchangeTradeFlags.IsFromSnapshot;
68+
}
69+
else if (token["st"].ToStringInvariant() == "REALTIME")
70+
{ }
71+
else Logger.Warn($"Unknown stream type {token["st"].ToStringInvariant()}");
72+
await callback(new KeyValuePair<string, ExchangeTrade>(marketSymbol, trade));
73+
}
74+
else Logger.Warn($"Unknown response type {token["ty"].ToStringInvariant()}");
75+
}, async (_socket) =>
76+
{ // [{"ticket":"test"},{"type":"trade","codes":["KRW-BTC","BTC-BCH"]},{"format":"SIMPLE"}]
77+
//var subscribeRequest = new[] { new
78+
//{
79+
// ticket = "exchangeTrades",
80+
// type = "trade",
81+
// codes = marketSymbols,
82+
// format = "SIMPLE",
83+
//} };
84+
var subscribeRequest = @"[{""ticket"":""test""},{""type"":""trade"",""codes"":["
85+
+ String.Join(",", marketSymbols.Select(s => $@"""{s}""")) + @"]},{""format"":""SIMPLE""}]";
86+
await _socket.SendMessageAsync(subscribeRequest);
87+
});
88+
}
89+
}
90+
public partial class ExchangeName { public const string UPbit = "UPbit"; }
91+
}

0 commit comments

Comments
 (0)