@@ -394,72 +394,86 @@ public override bool PlaceOrder(Order order)
394
394
395
395
private void HandleTradeUpdate ( ITradeUpdate obj )
396
396
{
397
- if ( Log . DebuggingEnabled )
398
- {
399
- Log . Debug ( $ "{ nameof ( AlpacaBrokerage ) } .{ nameof ( HandleTradeUpdate ) } : { obj } ") ;
400
- }
401
-
402
- var brokerageOrderId = obj . Order . OrderId . ToString ( ) ;
403
- var newLeanOrderStatus = GetOrderStatus ( obj . Event ) ;
404
- if ( ! TryGetOrRemoveCrossZeroOrder ( brokerageOrderId , newLeanOrderStatus , out var leanOrder ) )
405
- {
406
- leanOrder = _orderProvider . GetOrdersByBrokerageId ( brokerageOrderId ) ? . SingleOrDefault ( ) ;
407
- }
408
- if ( leanOrder == null )
397
+ try
409
398
{
410
- Log . Error ( $ "{ nameof ( AlpacaBrokerage ) } .{ nameof ( HandleTradeUpdate ) } : order id not found: { obj . Order . OrderId } ") ;
411
- return ;
412
- }
399
+ if ( Log . DebuggingEnabled )
400
+ {
401
+ Log . Debug ( $ "{ nameof ( AlpacaBrokerage ) } .{ nameof ( HandleTradeUpdate ) } : { obj } ") ;
402
+ }
413
403
414
- switch ( obj . Event )
415
- {
416
- case TradeEvent . New :
417
- case TradeEvent . PendingNew :
418
- // we don't send anything for this event
419
- return ;
420
- case TradeEvent . Rejected :
421
- case TradeEvent . Canceled :
422
- case TradeEvent . Replaced :
423
- OnOrderEvent ( new OrderEvent ( leanOrder , DateTime . UtcNow , OrderFee . Zero , $ "{ nameof ( AlpacaBrokerage ) } Order Event") { Status = newLeanOrderStatus } ) ;
424
- return ;
425
- case TradeEvent . Fill :
426
- case TradeEvent . PartialFill :
427
- break ;
428
- default :
404
+ var brokerageOrderId = obj . Order . OrderId . ToString ( ) ;
405
+ var newLeanOrderStatus = GetOrderStatus ( obj . Event ) ;
406
+ if ( ! TryGetOrRemoveCrossZeroOrder ( brokerageOrderId , newLeanOrderStatus , out var leanOrder ) )
407
+ {
408
+ leanOrder = _orderProvider . GetOrdersByBrokerageId ( brokerageOrderId ) ? . SingleOrDefault ( ) ;
409
+ }
410
+ if ( leanOrder == null )
411
+ {
412
+ Log . Error ( $ "{ nameof ( AlpacaBrokerage ) } .{ nameof ( HandleTradeUpdate ) } : order id not found: { obj . Order . OrderId } ") ;
429
413
return ;
430
- }
414
+ }
431
415
432
- var leanSymbol = _symbolMapper . GetLeanSymbol ( obj . Order . AssetClass , obj . Order . Symbol ) ;
416
+ switch ( obj . Event )
417
+ {
418
+ case TradeEvent . New :
419
+ case TradeEvent . PendingNew :
420
+ // we don't send anything for this event
421
+ return ;
422
+ case TradeEvent . Rejected :
423
+ case TradeEvent . Canceled :
424
+ case TradeEvent . Replaced :
425
+ OnOrderEvent ( new OrderEvent ( leanOrder , DateTime . UtcNow , OrderFee . Zero , $ "{ nameof ( AlpacaBrokerage ) } Order Event") { Status = newLeanOrderStatus } ) ;
426
+ return ;
427
+ case TradeEvent . Fill :
428
+ case TradeEvent . PartialFill :
429
+ break ;
430
+ case TradeEvent . Accepted :
431
+ case TradeEvent . PendingReplace :
432
+ case TradeEvent . PendingCancel :
433
+ // Skip this event to avoid flooding logs
434
+ return ;
435
+ default :
436
+ Log . Trace ( $ "{ nameof ( AlpacaBrokerage ) } .{ nameof ( HandleTradeUpdate ) } .Event: { obj . Event } . TradeUpdate: { obj } ") ;
437
+ return ;
438
+ }
433
439
434
- // alpaca sends the accumulative filled quantity but we need the partial amount for our event
435
- _orderIdToFillQuantity . TryGetValue ( leanOrder . Id , out var previouslyFilledAmount ) ;
436
- var accumulativeFilledQuantity = _orderIdToFillQuantity [ leanOrder . Id ] =
437
- obj . Order . OrderSide == OrderSide . Buy ? obj . Order . FilledQuantity : decimal . Negate ( obj . Order . FilledQuantity ) ;
440
+ var leanSymbol = _symbolMapper . GetLeanSymbol ( obj . Order . AssetClass , obj . Order . Symbol ) ;
438
441
439
- if ( newLeanOrderStatus . IsClosed ( ) )
440
- {
441
- // cleanup
442
- _orderIdToFillQuantity . TryRemove ( leanOrder . Id , out _ ) ;
443
- }
442
+ // alpaca sends the accumulative filled quantity but we need the partial amount for our event
443
+ _orderIdToFillQuantity . TryGetValue ( leanOrder . Id , out var previouslyFilledAmount ) ;
444
+ var accumulativeFilledQuantity = _orderIdToFillQuantity [ leanOrder . Id ] =
445
+ obj . Order . OrderSide == OrderSide . Buy ? obj . Order . FilledQuantity : decimal . Negate ( obj . Order . FilledQuantity ) ;
444
446
445
- var fee = new OrderFee ( new CashAmount ( 0 , Currencies . USD ) ) ;
446
- if ( newLeanOrderStatus == Orders . OrderStatus . Filled )
447
- {
448
- var security = _securityProvider . GetSecurity ( leanOrder . Symbol ) ;
449
- fee = security . FeeModel . GetOrderFee ( new OrderFeeParameters ( security , leanOrder ) ) ;
450
- }
447
+ if ( newLeanOrderStatus . IsClosed ( ) )
448
+ {
449
+ // cleanup
450
+ _orderIdToFillQuantity . TryRemove ( leanOrder . Id , out _ ) ;
451
+ }
451
452
452
- var orderEvent = new OrderEvent ( leanOrder , obj . TimestampUtc . HasValue ? obj . TimestampUtc . Value : DateTime . UtcNow , fee )
453
- {
454
- Status = newLeanOrderStatus ,
455
- FillPrice = obj . Price ?? 0m ,
456
- FillQuantity = accumulativeFilledQuantity - previouslyFilledAmount ,
457
- } ;
453
+ var fee = new OrderFee ( new CashAmount ( 0 , Currencies . USD ) ) ;
454
+ if ( newLeanOrderStatus == Orders . OrderStatus . Filled )
455
+ {
456
+ var security = _securityProvider . GetSecurity ( leanOrder . Symbol ) ;
457
+ fee = security . FeeModel . GetOrderFee ( new OrderFeeParameters ( security , leanOrder ) ) ;
458
+ }
459
+
460
+ var orderEvent = new OrderEvent ( leanOrder , obj . TimestampUtc . HasValue ? obj . TimestampUtc . Value : DateTime . UtcNow , fee )
461
+ {
462
+ Status = newLeanOrderStatus ,
463
+ FillPrice = obj . Price ?? 0m ,
464
+ FillQuantity = accumulativeFilledQuantity - previouslyFilledAmount ,
465
+ } ;
458
466
459
- // if we filled the order and have another contingent order waiting, submit it
460
- if ( ! TryHandleRemainingCrossZeroOrder ( leanOrder , orderEvent ) )
467
+ // if we filled the order and have another contingent order waiting, submit it
468
+ if ( ! TryHandleRemainingCrossZeroOrder ( leanOrder , orderEvent ) )
469
+ {
470
+ OnOrderEvent ( orderEvent ) ;
471
+ }
472
+ }
473
+ catch ( Exception ex )
461
474
{
462
- OnOrderEvent ( orderEvent ) ;
475
+ Log . Error ( ex , $ "TradeUpdate: { obj } ") ;
476
+ throw ;
463
477
}
464
478
}
465
479
0 commit comments