Exemple #1
0
        internal void ForwardChildOrderEvents(BfChildOrderEvent coe)
        {
            OrderCache?.RegisterChildOrderEvent(coe);

            var tx = _childOrderTransactions.GetOrAdd(coe.ChildOrderAcceptanceId, key => new BfxChildTransactionPlaceHolder());

            if (tx is BfxChildTransactionPlaceHolder placeHolder)
            {
                Log.Info($"Child transaction place holder found or placed. {coe.ChildOrderAcceptanceId} {coe.EventType}");
                placeHolder.ChildOrderEvents.Add(coe);
                return;
            }

            if (!(tx is BfxChildTransaction txChild))
            {
                throw new ApplicationException();
            }

            if (txChild.Parent != null)
            {
                txChild.Parent.OnChildOrderEvent(coe);
            }
            else
            {
                txChild.OnChildOrderEvent(coe);
            }
        }
Exemple #2
0
        public int Update(BfChildOrderEvent coe)
        {
            var childOrderIndex = Array.FindIndex(_childOrders, e => e.AcceptanceId == coe.ChildOrderAcceptanceId);

            _childOrders[childOrderIndex].Update(coe);
            return(childOrderIndex);
        }
Exemple #3
0
        public void Update(BfChildOrderEvent coe)
        {
            OrderId      = coe.ChildOrderId;
            AcceptanceId = coe.ChildOrderAcceptanceId; // When child of parent

            switch (coe.EventType)
            {
            case BfOrderEventType.Order:
                State      = BfOrderState.Active;
                OrderPrice = coe.Price;
                OrderDate  = coe.EventDate;
                ExpireDate = coe.ExpireDate;
                break;

            case BfOrderEventType.OrderFailed:
                State        = BfOrderState.Rejected;
                FailedReason = coe.OrderFailedReason;
                CloseDate    = coe.EventDate;
                break;

            case BfOrderEventType.Cancel:
                State     = BfOrderState.Canceled;
                CloseDate = coe.EventDate;
                break;

            case BfOrderEventType.CancelFailed:
                State        = BfOrderState.Rejected;
                CloseDate    = coe.EventDate;
                FailedReason = "Cancel Failed";
                break;

            case BfOrderEventType.Execution:
                if (!ExecutedSize.HasValue)
                {
                    ExecutedSize = coe.Size;
                }
                else
                {
                    ExecutedSize += coe.Size;
                }
                if (ExecutedSize >= OrderSize)
                {
                    State     = BfOrderState.Completed;
                    CloseDate = coe.EventDate;
                }
                else
                {
                    State = BfOrderState.Active;
                }
                break;

            case BfOrderEventType.Expire:
                State     = BfOrderState.Expired;
                CloseDate = coe.EventDate;
                break;

            default:
                throw new ArgumentException($"{coe.EventType} is not expected.");
            }
        }
 public BfxExecution(BfChildOrderEvent coe)
 {
     Id                 = coe.ExecutionId;
     Time               = coe.EventDate;
     Price              = coe.Price;
     Size               = coe.Size;
     Commission         = coe.Commission;
     SfdCollectedAmount = coe.SwapForDifference;
     OrderId            = coe.ChildOrderId;
 }
Exemple #5
0
 public BfxPositionsElement(BfChildOrderEvent ev, decimal size)
 {
     ChildOrderAcceptanceId = ev.ChildOrderAcceptanceId;
     ExecutionIndex         = ev.ExecutionId;
     Open        = ev.EventDate;
     Price       = ev.Price;
     CurrentSize = OpenSize = ev.Side == BfTradeSide.Buy ? size : -size;
     _commission = ev.Commission;
     _sfd        = ev.SwapForDifference;
 }
Exemple #6
0
        public void Update(BfChildOrderEvent coe)
        {
            if (!string.IsNullOrEmpty(coe.ChildOrderAcceptanceId))
            {
                AcceptanceId = coe.ChildOrderAcceptanceId;
            }
            if (!string.IsNullOrEmpty(coe.ChildOrderId))
            {
                OrderId = coe.ChildOrderId;
            }
            LastUpdatedTime = coe.EventDate;

            switch (coe.EventType)
            {
            case BfOrderEventType.Order:
                OrderDate  = coe.EventDate;    // Is it same value to real ordered date ?
                ExpireDate = coe.ExpireDate;
                ChangeState(BfxOrderState.Ordered);
                break;

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

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

            case BfOrderEventType.CancelFailed:
                if (State != BfxOrderState.Outstanding)     // Sometimes recived before ordered which under canceled OCO
                {
                    ChangeState(BfxOrderState.CancelFailed);
                }
                break;

            case BfOrderEventType.Execution:
                _executions.Add(new BfxExecution(coe));
                ExecutedSize  = _executions.Sum(e => e.Size);
                ExecutedPrice = Math.Round(_executions.Sum(e => e.Price * e.Size) / ExecutedSize.Value, ProductCode.GetPriceDecimals(), MidpointRounding.ToEven);
                ChangeState(OrderSize > ExecutedSize ? BfxOrderState.PartiallyExecuted : BfxOrderState.Executed);
                break;

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

            case BfOrderEventType.Unknown:
            case BfOrderEventType.Trigger:     // Parent order only
            case BfOrderEventType.Complete:    // Parent order only
                throw new NotSupportedException();
            }
        }
        // Call from BfxMarket
        public override void OnChildOrderEvent(BfChildOrderEvent coe)
        {
            if (coe.ChildOrderAcceptanceId != _order.AcceptanceId)
            {
                throw new ArgumentException();
            }

            _order.Update(coe);

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

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

            case BfOrderEventType.Cancel:
                ChangeState(BfxTransactionState.Idle);
                NotifyEvent(BfxTransactionEventType.Canceled, coe);
                break;

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

            case BfOrderEventType.Execution:
                NotifyEvent(Order.State == BfxOrderState.PartiallyExecuted ? BfxTransactionEventType.PartiallyExecuted : BfxTransactionEventType.Executed, coe);
                break;

            case BfOrderEventType.Expire:
                NotifyEvent(BfxTransactionEventType.Expired, coe);
                break;

            case BfOrderEventType.Unknown:
            case BfOrderEventType.Complete:
            case BfOrderEventType.Trigger:     // Not happened when Simple Order ?
                throw new NotSupportedException();
            }
        }
Exemple #8
0
        public BfxPosition[] Update(BfChildOrderEvent ev)
        {
            var executedSize = ev.Side == BfTradeSide.Buy ? ev.Size : -ev.Size;

            if (_q.Count == 0 || Math.Sign(_q.Peek().OpenSize) == Math.Sign(executedSize))
            {
                var pos = new BfxPositionsElement(ev);
                _q.Enqueue(pos);
                return(new BfxPosition[] { new BfxPosition(this, pos) });
            }

            // Process to another side
            var closeSize = executedSize;
            var closedPos = new List <BfxPositionsElement>();

            while (Math.Abs(closeSize) > 0m && _q.Count > 0)
            {
                var pos = _q.Peek();
                if (Math.Abs(closeSize) >= Math.Abs(pos.CurrentSize))
                {
                    closeSize += pos.CurrentSize;
                    closedPos.Add(_q.Dequeue());
                    continue;
                }
                if (Math.Abs(closeSize) < Math.Abs(pos.CurrentSize))
                {
                    closedPos.Add(pos.Split(closeSize));
                    closeSize = 0;
                    break;
                }
            }
            var result = new List <BfxPosition>();

            closedPos.ForEach(e => result.Add(new BfxPosition(this, e, ev)));

            if (closeSize > 0m)
            {
                var pos = new BfxPositionsElement(ev, Math.Abs(closeSize));
                _q.Enqueue(pos);
                result.Add(new BfxPosition(this, pos));
            }

            return(result.ToArray());
        }
Exemple #9
0
        public DbPrivateExecution(BfProductCode productCode, BfChildOrderEvent coe)
        {
            ProductCode = productCode;
            ExecutionId = coe.ExecutionId;
            Side        = coe.Side;
            Price       = coe.Price;
            Size        = coe.Size;
            if (coe.Side == BfTradeSide.Sell)
            {
                Amount = (coe.Price * coe.Size).Truncate(productCode.GetPriceDecimals());
            }
            else
            {
                Amount = (coe.Price * coe.Size).Ceiling(productCode.GetPriceDecimals());
            }

            ChildOrderId           = coe.ChildOrderId;
            ChildOrderAcceptanceId = coe.ChildOrderAcceptanceId;

            Commission        = coe.Commission;
            ExecutedTime      = coe.EventDate;
            SwapForDifference = coe.SwapForDifference;
        }
Exemple #10
0
        public override void OnChildOrderEvent(BfChildOrderEvent coe)
        {
            var childOrderIndex = _order.Update(coe);
            var childOrder      = Order.Children[childOrderIndex];

            switch (coe.EventType)
            {
            case BfOrderEventType.Order:
                NotifyChildOrderEvent(BfxTransactionEventType.Ordered, childOrderIndex, coe);
                break;

            case BfOrderEventType.OrderFailed:
                NotifyChildOrderEvent(BfxTransactionEventType.OrderFailed, childOrderIndex, coe);
                break;

            case BfOrderEventType.Cancel:
                NotifyChildOrderEvent(BfxTransactionEventType.Canceled, childOrderIndex, coe);
                break;

            case BfOrderEventType.CancelFailed:
                break;

            case BfOrderEventType.Execution:
                NotifyChildOrderEvent(childOrder.State == BfxOrderState.PartiallyExecuted ? BfxTransactionEventType.PartiallyExecuted : BfxTransactionEventType.Executed, childOrderIndex, coe);
                break;

            case BfOrderEventType.Expire:
                NotifyChildOrderEvent(BfxTransactionEventType.Expired, childOrderIndex, coe);
                break;

            case BfOrderEventType.Unknown:
            case BfOrderEventType.Complete:
            case BfOrderEventType.Trigger:
                throw new NotSupportedException();
            }
        }
Exemple #11
0
 static void OnChildOrderEvent(BfChildOrderEvent coe)
 {
     switch (coe.EventType)
     {
     }
 }
Exemple #12
0
 public abstract void OnChildOrderEvent(BfChildOrderEvent coe);
Exemple #13
0
 protected void NotifyEvent(BfxTransactionEventType oet, BfChildOrderEvent coe) => NotifyEvent(oet, coe.EventDate, coe);
Exemple #14
0
 protected void NotifyChildOrderEvent(BfxTransactionEventType oet, int childOrderIndex, BfChildOrderEvent coe)
 {
     if (Order.Children.Length == 1)
     {
         Market.InvokeOrderTransactionEvent(this, new BfxOrderTransactionEventArgs(Order.Children[0])
         {
             EventType = oet,
             State     = State,
             Time      = coe.EventDate,
             Parameter = coe,
         });
     }
     else
     {
         Market.InvokeOrderTransactionEvent(this, new BfxOrderTransactionEventArgs(Order)
         {
             EventType       = BfxTransactionEventType.ChildOrderEvent,
             State           = State,
             Time            = coe.EventDate,
             Parameter       = coe,
             ChildEventType  = oet,
             ChildOrderIndex = childOrderIndex,
         });
     }
 }
Exemple #15
0
 public BfxPositionsElement(BfChildOrderEvent ev)
     : this(ev, ev.Size)
 {
 }
Exemple #16
0
 void IBfOrderSource.RegisterChildOrderEvent(BfChildOrderEvent coe)
 {
 }