@@ -47,7 +47,7 @@ protected override async Task<IEnumerable<string>> OnGetMarketSymbolsAsync()
47
47
48
48
protected override async Task < IReadOnlyDictionary < string , ExchangeCurrency > > OnGetCurrenciesAsync ( )
49
49
{
50
- var result = await MakeJsonRequestAsync < IEnumerable < NDaxProduct > > ( "GetProducts" , null ,
50
+ var result = await MakeJsonRequestAsync < IEnumerable < NDAXProduct > > ( "GetProducts" , null ,
51
51
new Dictionary < string , object > ( )
52
52
{ { "OMSId" , 1 } } , "POST" ) ;
53
53
_symbolToProductId = result . ToDictionary ( product => product . Product , product => product . ProductId ) ;
@@ -79,7 +79,7 @@ protected override async Task<IEnumerable<ExchangeOrderResult>> OnGetCompletedOr
79
79
{
80
80
payload . Add ( "InstrumentId" , await GetInstrumentIdFromMarketSymbol ( symbol ) ) ;
81
81
}
82
- var result = await MakeJsonRequestAsync < IEnumerable < Order > > ( "GetOrdersHistory " , null ,
82
+ var result = await MakeJsonRequestAsync < IEnumerable < Order > > ( "GetOrderHistory " , null ,
83
83
payload , "POST" ) ;
84
84
85
85
return result . Select ( order => order . ToExchangeOrderResult ( _marketSymbolToInstrumentIdMapping ) ) ;
@@ -351,62 +351,58 @@ private async Task EnsureInstrumentIdsAvailable()
351
351
352
352
return null ;
353
353
}
354
-
355
- protected override Task < IWebSocket > OnGetTickersWebSocketAsync ( Action < IReadOnlyCollection < KeyValuePair < string , ExchangeTicker > > > tickers , params string [ ] marketSymbols )
354
+
355
+ private async Task < long ? [ ] > GetInstrumentIdFromMarketSymbol ( string [ ] marketSymbols )
356
356
{
357
- return base . OnGetTickersWebSocketAsync ( tickers , marketSymbols ) ;
357
+ return await Task . WhenAll ( marketSymbols . Select ( GetInstrumentIdFromMarketSymbol ) ) ;
358
358
}
359
359
360
- internal Task < IWebSocket > SubscribeWebsocketAsync < T > ( Action < T > callback , string functionName , object messageFramepayload = null )
360
+ private async Task < string > GetMarketSymbolFromInstrumentId ( long instrumentId )
361
361
{
362
- if ( string . IsNullOrWhiteSpace ( functionName ) )
363
- throw new ArgumentNullException ( nameof ( functionName ) ) ;
364
-
365
- // Wrap all calls in a frame object.
366
- var frame = new MessageFrame
367
- {
368
- FunctionName = functionName ,
369
- MessageType = MessageType . SubscribeToEvent ,
370
- SequenceNumber = GetNextSequenceNumber ( ) ,
371
- Payload = JsonConvert . SerializeObject ( messageFramepayload )
372
- } ;
373
-
374
- return ConnectWebSocketAsync ( "" , ( socket , bytes ) =>
375
- {
376
- var messageFrame = JsonConvert . DeserializeObject < MessageFrame > ( bytes . ToStringFromUTF8 ( ) . TrimEnd ( '\0 ' ) ) ;
377
- callback . Invoke ( messageFrame . PayloadAs < T > ( ) ) ;
378
- return Task . CompletedTask ;
379
- } , async socket => { await socket . SendMessageAsync ( frame ) ; } ) ;
362
+ await EnsureInstrumentIdsAvailable ( ) ;
363
+ var match = _marketSymbolToInstrumentIdMapping . Where ( pair => pair . Value == instrumentId ) ;
364
+ return match . Any ( ) ? match . First ( ) . Key : null ;
380
365
}
381
366
382
- internal async Task < T > QueryWebsocketOneCallAsync < T > ( string functionName , object payload = null )
367
+ protected override async Task < IWebSocket > OnGetTickersWebSocketAsync ( Action < IReadOnlyCollection < KeyValuePair < string , ExchangeTicker > > > tickers , params string [ ] marketSymbols )
383
368
{
384
- if ( string . IsNullOrWhiteSpace ( functionName ) )
385
- throw new ArgumentNullException ( nameof ( functionName ) ) ;
369
+ var instrumentIds = await GetInstrumentIdFromMarketSymbol ( marketSymbols ) ;
386
370
387
- // Wrap all calls in a frame object.
388
- var frame = new MessageFrame
389
- {
390
- FunctionName = functionName ,
391
- MessageType = MessageType . Request ,
392
- SequenceNumber = GetNextSequenceNumber ( ) ,
393
- Payload = JsonConvert . SerializeObject ( payload )
394
- } ;
395
-
396
- var tcs = new TaskCompletionSource < T > ( ) ;
397
- var handlerFinished = tcs . Task ;
398
- using ( ConnectWebSocketAsync ( "" , ( socket , bytes ) =>
399
- {
400
- var messageFrame = JsonConvert . DeserializeObject < MessageFrame > ( bytes . ToStringFromUTF8 ( ) . TrimEnd ( '\0 ' ) ) ;
401
- tcs . SetResult ( messageFrame . PayloadAs < T > ( ) ) ;
402
- return Task . CompletedTask ;
403
- } , async socket =>
404
- {
405
- await socket . SendMessageAsync ( frame ) ;
406
- } ) )
407
- {
408
- return await handlerFinished ;
409
- }
371
+ return await ConnectWebSocketAsync ( "" , async ( socket , bytes ) =>
372
+ {
373
+ var messageFrame =
374
+ JsonConvert . DeserializeObject < MessageFrame > ( bytes . ToStringFromUTF8 ( ) . TrimEnd ( '\0 ' ) ) ;
375
+
376
+ if ( messageFrame . FunctionName . Equals ( "SubscribeLevel1" , StringComparison . InvariantCultureIgnoreCase )
377
+ || messageFrame . FunctionName . Equals ( "Level1UpdateEvent" ,
378
+ StringComparison . InvariantCultureIgnoreCase ) )
379
+ {
380
+ var rawPayload = messageFrame . PayloadAs < Level1Data > ( ) ;
381
+ var symbol = await GetMarketSymbolFromInstrumentId ( rawPayload . InstrumentId ) ;
382
+ tickers . Invoke ( new [ ]
383
+ {
384
+ new KeyValuePair < string , ExchangeTicker > ( symbol , rawPayload . ToExchangeTicker ( symbol ) ) ,
385
+ } ) ;
386
+ }
387
+ } ,
388
+ async socket =>
389
+ {
390
+ foreach ( var instrumentId in instrumentIds )
391
+ {
392
+ await socket . SendMessageAsync ( new MessageFrame
393
+ {
394
+ FunctionName = "SubscribeLevel1" ,
395
+ MessageType = MessageType . Request ,
396
+ SequenceNumber = GetNextSequenceNumber ( ) ,
397
+ Payload = JsonConvert . SerializeObject ( new
398
+ {
399
+ OMSId = 1 ,
400
+ InstrumentId = instrumentId ,
401
+
402
+ } )
403
+ } ) ;
404
+ }
405
+ } ) ;
410
406
}
411
407
412
408
private long GetNextSequenceNumber ( )
0 commit comments