@@ -62,14 +62,13 @@ public ExchangeBL3PAPI(ref string publicApiKey, ref string privateApiKey)
62
62
63
63
protected override async Task < IEnumerable < string > > OnGetMarketSymbolsAsync ( )
64
64
{
65
- return ( await OnGetMarketSymbolsMetadataAsync ( ) . ConfigureAwait ( false ) )
65
+ return ( await OnGetMarketSymbolsMetadataAsync ( ) )
66
66
. Select ( em => em . MarketSymbol ) ;
67
67
}
68
68
69
69
protected override async Task < ExchangeTicker > OnGetTickerAsync ( string marketSymbol )
70
70
{
71
- var result = await MakeJsonRequestAsync < JObject > ( $ "/{ marketSymbol } /ticker")
72
- . ConfigureAwait ( false ) ;
71
+ var result = await MakeJsonRequestAsync < JObject > ( $ "/{ marketSymbol } /ticker") ;
73
72
74
73
return await this . ParseTickerAsync (
75
74
result ,
@@ -80,7 +79,7 @@ protected override async Task<ExchangeTicker> OnGetTickerAsync(string marketSymb
80
79
baseVolumeKey : "volume.24h" ,
81
80
timestampKey : "timestamp" ,
82
81
timestampType : TimestampType . UnixSeconds
83
- ) . ConfigureAwait ( false ) ;
82
+ ) ;
84
83
}
85
84
86
85
protected internal override Task < IEnumerable < ExchangeMarket > > OnGetMarketSymbolsMetadataAsync ( )
@@ -131,27 +130,7 @@ Task MessageCallback(IWebSocket _, byte[] msg)
131
130
{
132
131
var bl3POrderBook = JsonConvert . DeserializeObject < BL3POrderBook > ( msg . ToStringFromUTF8 ( ) ) ;
133
132
134
- var exchangeOrderBook = new ExchangeOrderBook
135
- {
136
- MarketSymbol = bl3POrderBook . MarketSymbol ,
137
- LastUpdatedUtc = CryptoUtility . UtcNow
138
- } ;
139
-
140
- var asks = bl3POrderBook . Asks
141
- . OrderBy ( b => b . Price , exchangeOrderBook . Asks . Comparer )
142
- . Take ( maxCount ) ;
143
- foreach ( var ask in asks )
144
- {
145
- exchangeOrderBook . Asks . Add ( ask . Price , ask . ToExchangeOrder ( ) ) ;
146
- }
147
-
148
- var bids = bl3POrderBook . Bids
149
- . OrderBy ( b => b . Price , exchangeOrderBook . Bids . Comparer )
150
- . Take ( maxCount ) ;
151
- foreach ( var bid in bids )
152
- {
153
- exchangeOrderBook . Bids . Add ( bid . Price , bid . ToExchangeOrder ( ) ) ;
154
- }
133
+ var exchangeOrderBook = ConvertToExchangeOrderBook ( maxCount , bl3POrderBook ) ;
155
134
156
135
callback ( exchangeOrderBook ) ;
157
136
@@ -161,7 +140,7 @@ Task MessageCallback(IWebSocket _, byte[] msg)
161
140
return new MultiWebsocketWrapper (
162
141
await Task . WhenAll (
163
142
marketSymbols . Select ( ms => ConnectWebSocketAsync ( $ "{ ms } /orderbook", MessageCallback ) )
164
- ) . ConfigureAwait ( false )
143
+ )
165
144
) ;
166
145
}
167
146
@@ -173,9 +152,9 @@ protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(Func<KeyValu
173
152
}
174
153
Task MessageCallback ( IWebSocket _ , byte [ ] msg )
175
154
{ // {{ "date": 1573255932, "marketplace": "BTCEUR", "price_int": 802466000, "type": "buy", "amount_int": 6193344 } }
176
- JToken token = JToken . Parse ( msg . ToStringFromUTF8 ( ) ) ;
155
+ var token = JToken . Parse ( msg . ToStringFromUTF8 ( ) ) ;
177
156
var symbol = token [ "marketplace" ] . ToStringInvariant ( ) ;
178
- ExchangeTrade trade = token . ParseTrade ( amountKey : "amount_int" , priceKey : "price_int" , typeKey : "type" , timestampKey : "date" ,
157
+ var trade = token . ParseTrade ( amountKey : "amount_int" , priceKey : "price_int" , typeKey : "type" , timestampKey : "date" ,
179
158
timestampType : TimestampType . UnixSeconds ,
180
159
idKey : null , // + TODO: add Id Key when BL3P starts providing this info
181
160
typeKeyIsBuyValue : "buy" ) ;
@@ -186,10 +165,37 @@ Task MessageCallback(IWebSocket _, byte[] msg)
186
165
return new MultiWebsocketWrapper (
187
166
await Task . WhenAll (
188
167
marketSymbols . Select ( ms => ConnectWebSocketAsync ( $ "{ ms } /trades", MessageCallback ) )
189
- ) . ConfigureAwait ( false )
168
+ )
190
169
) ;
191
170
}
192
171
172
+ private static ExchangeOrderBook ConvertToExchangeOrderBook ( int maxCount , BL3POrderBook bl3POrderBook )
173
+ {
174
+ var exchangeOrderBook = new ExchangeOrderBook
175
+ {
176
+ MarketSymbol = bl3POrderBook . MarketSymbol ,
177
+ LastUpdatedUtc = CryptoUtility . UtcNow
178
+ } ;
179
+
180
+ var asks = bl3POrderBook . Asks
181
+ . OrderBy ( b => b . Price , exchangeOrderBook . Asks . Comparer )
182
+ . Take ( maxCount ) ;
183
+ foreach ( var ask in asks )
184
+ {
185
+ exchangeOrderBook . Asks . Add ( ask . Price , ask . ToExchangeOrder ( ) ) ;
186
+ }
187
+
188
+ var bids = bl3POrderBook . Bids
189
+ . OrderBy ( b => b . Price , exchangeOrderBook . Bids . Comparer )
190
+ . Take ( maxCount ) ;
191
+ foreach ( var bid in bids )
192
+ {
193
+ exchangeOrderBook . Bids . Add ( bid . Price , bid . ToExchangeOrder ( ) ) ;
194
+ }
195
+
196
+ return exchangeOrderBook ;
197
+ }
198
+
193
199
protected override bool CanMakeAuthenticatedRequest ( IReadOnlyDictionary < string , object > payload )
194
200
{
195
201
return ! ( PublicApiKey is null ) && ! ( PrivateApiKey is null ) ;
@@ -258,18 +264,31 @@ protected override async Task<ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrd
258
264
var resultBody = await MakeRequestAsync (
259
265
$ "/{ order . MarketSymbol } /money/order/add",
260
266
payload : data
261
- )
262
- . ConfigureAwait ( false ) ;
267
+ ) ;
263
268
264
269
var result = JsonConvert . DeserializeObject < BL3POrderAddResponse > ( resultBody )
265
270
. Except ( ) ;
266
271
267
- var orderDetails = await GetOrderDetailsAsync ( result . OrderId , order . MarketSymbol )
268
- . ConfigureAwait ( false ) ;
272
+ var orderDetails = await GetOrderDetailsAsync ( result . OrderId , order . MarketSymbol ) ;
269
273
270
274
return orderDetails ;
271
275
}
272
276
277
+ protected override async Task < ExchangeOrderBook > OnGetOrderBookAsync ( string marketSymbol , int maxCount = 100 )
278
+ {
279
+ if ( string . IsNullOrWhiteSpace ( marketSymbol ) )
280
+ throw new ArgumentException ( "Value cannot be null or whitespace." , nameof ( marketSymbol ) ) ;
281
+
282
+ var resultBody = await MakeRequestAsync ( $ "/{ marketSymbol } /money/depth/full") ;
283
+
284
+ var bl3pOrderBook = JsonConvert . DeserializeObject < BL3PReponseFullOrderBook > ( resultBody )
285
+ . Except ( ) ;
286
+
287
+ bl3pOrderBook . MarketSymbol ??= marketSymbol ;
288
+
289
+ return ConvertToExchangeOrderBook ( maxCount , bl3pOrderBook ) ;
290
+ }
291
+
273
292
protected override async Task OnCancelOrderAsync ( string orderId , string marketSymbol = null )
274
293
{
275
294
if ( string . IsNullOrWhiteSpace ( marketSymbol ) )
@@ -281,14 +300,13 @@ protected override async Task OnCancelOrderAsync(string orderId, string marketSy
281
300
{
282
301
{ "order_id" , orderId }
283
302
}
284
- )
285
- . ConfigureAwait ( false ) ;
303
+ ) ;
286
304
287
305
JsonConvert . DeserializeObject < BL3PEmptyResponse > ( resultBody )
288
306
. Except ( ) ;
289
307
}
290
308
291
- public override async Task < ExchangeOrderResult > GetOrderDetailsAsync ( string orderId , string marketSymbol = null )
309
+ protected override async Task < ExchangeOrderResult > OnGetOrderDetailsAsync ( string orderId , string marketSymbol = null )
292
310
{
293
311
if ( string . IsNullOrWhiteSpace ( marketSymbol ) )
294
312
throw new ArgumentException ( "Value cannot be null or whitespace." , nameof ( marketSymbol ) ) ;
@@ -301,8 +319,7 @@ public override async Task<ExchangeOrderResult> GetOrderDetailsAsync(string orde
301
319
var resultBody = await MakeRequestAsync (
302
320
$ "/{ marketSymbol } /money/order/result",
303
321
payload : data
304
- )
305
- . ConfigureAwait ( false ) ;
322
+ ) ;
306
323
307
324
308
325
var result = JsonConvert . DeserializeObject < BL3POrderResultResponse > ( resultBody )
0 commit comments