33using Core . Extensions ;
44using Core . Grains ;
55using Core . Models ;
6+ using Google . Protobuf . Reflection ;
67using IBApi ;
78using IBApi . Messages ;
9+ using IBApi . Queries ;
810using InteractiveBrokers . Mappers ;
911using InteractiveBrokers . Models ;
1012using Orleans ;
@@ -186,7 +188,7 @@ public override async Task<StatusResponse> Subscribe(Instrument instrument)
186188
187189 var contract = Upstream . MapContract ( instrument ) ;
188190 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
189- var contracts = await connector . GetContracts ( cleaner . Token , contract ) ;
191+ var contracts = await connector . GetContracts ( contract , cleaner . Token ) ;
190192 var contractMessage = contracts . FirstOrDefault ( ) ;
191193
192194 if ( contractMessage is null )
@@ -256,14 +258,16 @@ public virtual async Task<PricesResponse> Prices(Criteria criteria)
256258 {
257259 var contract = Upstream . MapContract ( criteria . Instrument ) ;
258260 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
259- var sourceItems = await connector . GetTicks (
260- cleaner . Token ,
261- contract ,
262- criteria . MinDate . Value ,
263- criteria . MaxDate . Value ,
264- "BID_ASK" ,
265- criteria . Count ?? 1 ) ;
261+ var query = new HistoricalTicksQuery ( )
262+ {
263+ Contract = contract ,
264+ MinDate = criteria . MinDate . Value ,
265+ MaxDate = criteria . MaxDate . Value ,
266+ DataType = "BID_ASK" ,
267+ Count = criteria . Count ?? 1
268+ } ;
266269
270+ var sourceItems = await connector . GetTicks ( query , cleaner . Token ) ;
267271 var items = sourceItems . Select ( Downstream . MapPrice ) . ToArray ( ) ;
268272
269273 await Task . Delay ( state . Span ) ;
@@ -283,15 +287,16 @@ public virtual async Task<PricesResponse> PriceGroups(Criteria criteria)
283287 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
284288 var contract = Upstream . MapContract ( criteria . Instrument ) ;
285289 var maxDate = criteria . MaxDate ?? DateTime . Now ;
286- var sourceItems = await connector . GetBars (
287- cleaner . Token ,
288- contract ,
289- maxDate ,
290- criteria . Data . Get ( "Duration" ) ,
291- criteria . Data . Get ( "BarType" ) ,
292- criteria . Data . Get ( "DataType" ) ,
293- 0 ) ;
290+ var query = new HistoricalBarsQuery
291+ {
292+ Contract = contract ,
293+ MaxDate = maxDate ,
294+ Duration = criteria . Data . Get ( "Duration" ) ,
295+ BarType = criteria . Data . Get ( "BarType" ) ,
296+ DataType = criteria . Data . Get ( "DataType" ) ,
297+ } ;
294298
299+ var sourceItems = await connector . GetBars ( query , cleaner . Token ) ;
295300 var items = sourceItems . Select ( Downstream . MapPrice ) . ToArray ( ) ;
296301
297302 await Task . Delay ( state . Span ) ;
@@ -313,7 +318,7 @@ public virtual async Task<InstrumentsResponse> Options(Criteria criteria)
313318 var maxDate = ( criteria . MaxDate ?? DateTime . Now ) . ToString ( $ "yyyyMMdd-HH:mm:ss") ;
314319 var contract = Upstream . MapContract ( criteria . Instrument ) ;
315320 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
316- var sourceItems = await connector . GetContracts ( cleaner . Token , contract ) ;
321+ var sourceItems = await connector . GetContracts ( contract , cleaner . Token ) ;
317322 var items = sourceItems . Select ( o => Downstream . MapInstrumentType ( o . Contract ) ) . ToArray ( ) ;
318323
319324 await Task . Delay ( state . Span ) ;
@@ -346,10 +351,14 @@ public virtual async Task<Account> AccountSummary()
346351 /// <param name="criteria"></param>
347352 public virtual async Task < OrdersResponse > Orders ( Criteria criteria )
348353 {
354+ var descriptor = this . GetDescriptor ( ) ;
355+ var ordersGrain = GrainFactory . GetGrain < IOrdersGrain > ( descriptor ) ;
349356 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
350357 var sourceItems = await connector . GetOrders ( cleaner . Token ) ;
351358 var items = sourceItems . Select ( Downstream . MapOrder ) . ToArray ( ) ;
352359
360+ await ordersGrain . Clear ( ) ;
361+ await Task . WhenAll ( items . Select ( ordersGrain . Store ) ) ;
353362 await Task . Delay ( state . Span ) ;
354363
355364 return new ( )
@@ -364,10 +373,14 @@ public virtual async Task<OrdersResponse> Orders(Criteria criteria)
364373 /// <param name="criteria"></param>
365374 public virtual async Task < OrdersResponse > Positions ( Criteria criteria )
366375 {
376+ var descriptor = this . GetDescriptor ( ) ;
377+ var positionsGrain = GrainFactory . GetGrain < IPositionsGrain > ( descriptor ) ;
367378 var cleaner = new CancellationTokenSource ( state . Timeout ) ;
368- var sourceItems = await connector . GetPositions ( cleaner . Token , state . Account . Descriptor ) ;
379+ var sourceItems = await connector . GetPositions ( state . Account . Descriptor , cleaner . Token ) ;
369380 var items = sourceItems . Where ( o => o . Position is not 0 ) . Select ( Downstream . MapPosition ) . ToArray ( ) ;
370381
382+ await positionsGrain . Clear ( ) ;
383+ await Task . WhenAll ( items . Select ( positionsGrain . Store ) ) ;
371384 await Task . Delay ( state . Span ) ;
372385
373386 return new ( )
@@ -382,11 +395,12 @@ public virtual async Task<OrdersResponse> Positions(Criteria criteria)
382395 /// <param name="order"></param>
383396 public virtual async Task < OrderResponse > SendOrder ( Core . Models . Order order )
384397 {
385- var cleaner = new CancellationTokenSource ( state . Timeout ) ;
386398 var contract = Upstream . MapContract ( order . Operation . Instrument ) ;
387- var ( orderMessage , SL , TP ) = Upstream . MapOrder ( connector . Id , order , state . Account ) ;
399+ var ( orderMessage , SL , TP ) = Upstream . MapOrder ( order , state . Account ) ;
400+ var ( group , braces ) = connector . SendOrder ( contract , orderMessage , SL , TP ) ;
401+
402+ order = order with { Operation = order . Operation with { Id = $ "{ group . OrderId } " } } ;
388403
389- await connector . SendOrder ( cleaner . Token , contract , orderMessage , SL , TP ) ;
390404 await Task . Delay ( state . Span ) ;
391405
392406 return new ( )
0 commit comments