Пример #1
0
        // Update by parent order event
        public void Update(BfParentOrderEvent poe)
        {
            if (poe.EventType != BfOrderEventType.Trigger)
            {
                return;
            }

            AcceptanceId = poe.ChildOrderAcceptanceId;
        }
Пример #2
0
        public void OnParentOrderEvent(BfParentOrderEvent poe)
        {
            if (poe.ParentOrderAcceptanceId != _order.AcceptanceId)
            {
                throw new ApplicationException();
            }

            _order.Update(poe);

            switch (poe.EventType)
            {
            case BfOrderEventType.Order:     // Order accepted
                ChangeState(BfxTransactionState.Idle);
                NotifyEvent(BfxTransactionEventType.Ordered, poe);
                break;

            case BfOrderEventType.OrderFailed:
                ChangeState(BfxTransactionState.Idle);
                NotifyEvent(BfxTransactionEventType.OrderFailed, poe);
                break;

            case BfOrderEventType.Cancel:
                ChangeState(BfxTransactionState.Closed);
                NotifyEvent(BfxTransactionEventType.Canceled, poe);
                break;

            case BfOrderEventType.CancelFailed:
                ChangeState(BfxTransactionState.Idle);
                NotifyEvent(BfxTransactionEventType.CancelFailed, poe);
                break;

            case BfOrderEventType.Trigger:
                Log.Trace($"Trigger {poe.Side} P:{poe.Price} S:{poe.Size}");
                break;

            case BfOrderEventType.Expire:
                ChangeState(BfxTransactionState.Closed);
                NotifyEvent(BfxTransactionEventType.Expired, poe);
                break;

            case BfOrderEventType.Complete:
                if (Order.State == BfxOrderState.Completed)
                {
                    ChangeState(BfxTransactionState.Closed);
                    NotifyEvent(BfxTransactionEventType.Completed, poe);
                }
                break;

            case BfOrderEventType.Unknown:
            case BfOrderEventType.Execution:
                throw new NotSupportedException();
            }
        }
Пример #3
0
        public void Update(BfParentOrderEvent poe)
        {
            _orderMethod    = poe.ParentOrderType;
            LastUpdatedTime = poe.EventDate;
            switch (poe.EventType)
            {
            case BfOrderEventType.Order:
                OrderDate  = poe.EventDate;    // Is it same value to real ordered date ?
                ExpireDate = poe.ExpireDate;
                ChangeState(BfxOrderState.Ordered);
                break;

            case BfOrderEventType.OrderFailed:
                ChangeState(BfxOrderState.OrderFailed);
                break;

            case BfOrderEventType.Cancel:
                ChangeState(BfxOrderState.Canceled);
                break;

            case BfOrderEventType.CancelFailed:
                ChangeState(BfxOrderState.CancelFailed);
                break;

            case BfOrderEventType.Trigger:
                _childOrders[poe.ChildOrderIndex - 1].Update(poe);
                break;

            case BfOrderEventType.Expire:
                ChangeState(BfxOrderState.Expired);
                break;

            case BfOrderEventType.Complete:
                CompletedCount++;
                Log.Trace($"BfOrderEventType.Complete received. count = {CompletedCount}");
                switch (OrderType)
                {
                case BfOrderType.IFD:
                case BfOrderType.IFDOCO:
                    if (CompletedCount == 2)
                    {
                        ChangeState(BfxOrderState.Completed);
                    }
                    break;
                }
                break;

            case BfOrderEventType.Unknown:
            case BfOrderEventType.Execution:
                throw new NotSupportedException();
            }
        }
Пример #4
0
        public void Update(BfParentOrderEvent poe)
        {
            ParentOrderAcceptanceId = poe.ParentOrderAcceptanceId;
            ParentOrderId           = poe.ParentOrderId;
            AcceptanceId            = poe.ChildOrderAcceptanceId;
            ChildOrderIndex         = poe.ChildOrderIndex - 1;

            switch (poe.EventType)
            {
            case BfOrderEventType.Trigger:
                ExpireDate = poe.ExpireDate;
                break;

            case BfOrderEventType.Complete:
                break;
            }
        }
Пример #5
0
        internal void ForwardParentOrderEvents(BfParentOrderEvent poe)
        {
            OrderCache?.RegisterParentOrderEvent(poe);

            // Sometimes parent order event arraives faster than send order process completes.
            var tx = _parentOrderTransactions.GetOrAdd(poe.ParentOrderAcceptanceId, key => new BfxParentTransactionPlaceHolder());

            if (tx is BfxParentTransactionPlaceHolder placeHolder)
            {
                Log.Info($"Parent transaction place holder found or placed. {poe.ParentOrderAcceptanceId} {poe.EventType}");
                placeHolder.ParentOrderEvents.Add(poe);
                return;
            }

            if (!(tx is BfxParentTransaction txParent))
            {
                throw new ApplicationException();
            }

            txParent.OnParentOrderEvent(poe);

            if (poe.EventType == BfOrderEventType.Trigger)
            {
                if (!(txParent.Order.Children[poe.ChildOrderIndex - 1] is BfxChildOrder childOrder))
                {
                    throw new ApplicationException();
                }

                if (!string.IsNullOrEmpty(childOrder.AcceptanceId))
                {
                    var txChild = new BfxChildTransaction(this, childOrder, txParent);
                    _childOrderTransactions.AddOrUpdate(childOrder.AcceptanceId, txChild, (key, value) =>
                    {
                        Log.Info($"Child transaction place holder found and merged to parent. {childOrder.AcceptanceId} Parent.{poe.EventType}");
                        if (!(value is BfxChildTransactionPlaceHolder placeHolder))
                        {
                            throw new ApplicationException();
                        }

                        // ToList() prevents "Collection was modified; enumeration operation may not execute."
                        placeHolder.ChildOrderEvents.ToList().ForEach(coe => txParent.OnChildOrderEvent(coe));
                        return(txChild);
                    });
Пример #6
0
     public void Update(BfParentOrderEvent poe)
     {
         AcceptanceId = poe.ParentOrderAcceptanceId;
         OrderId      = poe.ParentOrderId;
         State        = poe.EventType switch
         {
             BfOrderEventType.Complete => BfOrderState.Completed,
             BfOrderEventType.Cancel => BfOrderState.Canceled,
             BfOrderEventType.Expire => BfOrderState.Expired,
             BfOrderEventType.OrderFailed => BfOrderState.Rejected,
             _ => BfOrderState.Active
         };
         if (poe.EventType == BfOrderEventType.Order)
         {
             OrderDate  = poe.EventDate;
             ExpireDate = poe.ExpireDate;
         }
         if (poe.EventType == BfOrderEventType.OrderFailed)
         {
             OrderFailedReason = poe.OrderFailedReason;
         }
     }
 }
Пример #7
0
 static void OnParentOrderEvent(BfParentOrderEvent poe)
 {
     switch (poe.EventType)
     {
     }
 }
Пример #8
0
 public DbParentOrder(BfProductCode productCode, BfParentOrderEvent poe)
 {
     ProductCode = productCode;
     OrderType   = poe.ParentOrderType;
     Update(poe);
 }
Пример #9
0
 protected void NotifyEvent(BfxTransactionEventType oet, BfParentOrderEvent poe) => NotifyEvent(oet, poe.EventDate, poe);
Пример #10
0
 void IBfOrderSource.RegisterParentOrderEvent(BfParentOrderEvent poe)
 {
 }