Esempio n. 1
0
        private void Chart_OnMoveOrder(Order order, decimal newPrice)
        {
            if (NeedToConfirm && !Confirm($"Move order to price={newPrice}?"))
            {
                var d = new ChartDrawData();
                // redraw order with old price
                d.Add(_activeOrdersElement, order);
                Chart.Draw(d);

                return;
            }

            var singleObject = UseSingleOrderObject;

            Log($"MoveOrder to {newPrice}: {order}, single order object = {singleObject}");

            if (IsInFinalState(order))
            {
                Log("invalid state for re-register");
                return;
            }

            if (singleObject)
            {
                Chart_OnMoveOrder1(order, newPrice);
            }
            else
            {
                Chart_OnMoveOrder2(order, newPrice);
            }
        }
Esempio n. 2
0
        private void ModifyAnnotation(bool isNew)
        {
            Brush RandomBrush()
            {
                var b = new SolidColorBrush(Color.FromRgb((byte)RandomGen.GetInt(0, 255), (byte)RandomGen.GetInt(0, 255), (byte)RandomGen.GetInt(0, 255)));

                b.Freeze();
                return(b);
            }

            if (_annotation == null)
            {
                return;
            }

            IComparable x1, x2, y1, y2;

            var mode = RandomGen.GetDouble() > 0.5 ? AnnotationCoordinateMode.Absolute : AnnotationCoordinateMode.Relative;

            if (_annotationData == null)
            {
                if (mode == AnnotationCoordinateMode.Absolute)
                {
                    GetMiddle(out var x0, out var y0);
                    x1 = x0 - TimeSpan.FromMinutes(RandomGen.GetInt(10, 60));
                    x2 = x0 + TimeSpan.FromMinutes(RandomGen.GetInt(10, 60));
                    y1 = y0 - RandomGen.GetInt(5, 10) * _security.PriceStep ?? 0.01m;
                    y2 = y0 + RandomGen.GetInt(5, 10) * _security.PriceStep ?? 0.01m;
                }
                else
                {
                    x1 = 0.5 - RandomGen.GetDouble() / 10;
                    x2 = 0.5 + RandomGen.GetDouble() / 10;
                    y1 = 0.5 - RandomGen.GetDouble() / 10;
                    y2 = 0.5 - RandomGen.GetDouble() / 10;
                }
            }
            else
            {
                mode = _annotationData.CoordinateMode.Value;

                if (mode == AnnotationCoordinateMode.Absolute)
                {
                    x1 = (DateTimeOffset)_annotationData.X1 - TimeSpan.FromMinutes(1);
                    x2 = (DateTimeOffset)_annotationData.X2 + TimeSpan.FromMinutes(1);
                    y1 = (decimal)_annotationData.Y1 + _security.PriceStep ?? 0.01m;
                    y2 = (decimal)_annotationData.Y2 - _security.PriceStep ?? 0.01m;
                }
                else
                {
                    x1 = ((double)_annotationData.X1) - 0.05;
                    x2 = ((double)_annotationData.X2) + 0.05;
                    y1 = ((double)_annotationData.Y1) - 0.05;
                    y2 = ((double)_annotationData.Y2) + 0.05;
                }
            }

            _dataThreadActions.Add(() =>
            {
                var data = new ChartDrawData.AnnotationData
                {
                    X1         = x1,
                    X2         = x2,
                    Y1         = y1,
                    Y2         = y2,
                    IsVisible  = true,
                    Fill       = RandomBrush(),
                    Stroke     = RandomBrush(),
                    Foreground = RandomBrush(),
                    Thickness  = new Thickness(RandomGen.GetInt(1, 5)),
                };

                if (isNew)
                {
                    data.Text = "random annotation #" + (++_annotationId);
                    data.HorizontalAlignment = HorizontalAlignment.Stretch;
                    data.VerticalAlignment   = VerticalAlignment.Stretch;
                    data.LabelPlacement      = LabelPlacement.Axis;
                    data.ShowLabel           = true;
                    data.CoordinateMode      = mode;
                }

                var dd = new ChartDrawData();
                dd.Add(_annotation, data);

                Chart.Draw(dd);
            });
        }
Esempio n. 3
0
        private void Chart_OnMoveOrder(Order oldOrder, decimal newPrice)
        {
            if (NeedToConfirm && !Confirm($"Move order to price={newPrice}?"))
            {
                var d = new ChartDrawData();
                d.Add(_activeOrdersElement, oldOrder);
                Chart.Draw(d);

                return;
            }

            Log($"MoveOrder to {newPrice}: {oldOrder}");

            if (IsInFinalState(oldOrder))
            {
                Log("invalid state for re-register");
                return;
            }

            var newOrder = new OrderEx
            {
                TransactionId = _idGenerator.GetNextId(),
                Type          = OrderTypes.Limit,
                State         = OrderStates.Pending,
                Price         = newPrice,
                Volume        = oldOrder.Balance,
                Direction     = oldOrder.Direction,
                Balance       = oldOrder.Balance,
                Security      = oldOrder.Security,
                Portfolio     = oldOrder.Portfolio,
            };

            Chart.Draw(new ChartDrawData()
                       .Add(_activeOrdersElement, oldOrder, true, price: newOrder.Price));

            void MoveAction()
            {
                if (NeedToFail)
                {
                    Log("Move failed");

                    newOrder.State = OrderStates.Failed;

                    Chart.Draw(new ChartDrawData()
                               .Add(_activeOrdersElement, oldOrder, isError: true, price: oldOrder.Price));
                }
                else
                {
                    oldOrder.State = OrderStates.Done;
                    newOrder.State = OrderStates.Active;

                    Log($"Order moved to new: {newOrder}");

                    Chart.Draw(new ChartDrawData()
                               .Add(_activeOrdersElement, oldOrder)
                               .Add(_activeOrdersElement, newOrder));

                    _orders.Remove(oldOrder);
                    _orders.Add(newOrder);
                }
            }

            if (NeedToDelay)
            {
                DelayedAction(MoveAction, "move");
            }
            else
            {
                MoveAction();
            }
        }