@@ -394,72 +394,86 @@ public override bool PlaceOrder(Order order)
394394
395395 private void HandleTradeUpdate ( ITradeUpdate obj )
396396 {
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
409398 {
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+ }
413403
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 } ") ;
429413 return ;
430- }
414+ }
431415
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+ }
433439
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 ) ;
438441
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 ) ;
444446
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+ }
451452
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+ } ;
458466
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 )
461474 {
462- OnOrderEvent ( orderEvent ) ;
475+ Log . Error ( ex , $ "TradeUpdate: { obj } ") ;
476+ throw ;
463477 }
464478 }
465479
0 commit comments