Example #1
0
        // внутренние функции управления позицией
        // internal position management functions

        private void CloseDeal(Position position, OrderPriceType priceType, decimal price, TimeSpan lifeTime,
                               bool isStopOrProfit)
        {
            try
            {
                if (position == null)
                {
                    return;
                }

                position.ProfitOrderIsActiv = false;
                position.StopOrderIsActiv   = false;

                for (int i = 0; position.CloseOrders != null && i < position.CloseOrders.Count; i++)
                {
                    if (position.CloseOrders[i].State == OrderStateType.Activ &&
                        position.CloseOrders[i].TypeOrder != OrderPriceType.LimitStop &&
                        position.CloseOrders[i].TypeOrder != OrderPriceType.MarketStop
                        )
                    {
                        _connector.OrderCancel(position.CloseOrders[i]);
                    }
                }

                for (int i = 0; position.OpenOrders != null && i < position.OpenOrders.Count; i++)
                {
                    if (position.OpenOrders[i].State == OrderStateType.Activ &&
                        position.OpenOrders[i].TypeOrder != OrderPriceType.LimitStop &&
                        position.OpenOrders[i].TypeOrder != OrderPriceType.MarketStop
                        )
                    {
                        _connector.OrderCancel(position.OpenOrders[i]);
                    }
                }

                if (Securiti == null)
                {
                    return;
                }

                Side sideCloseOrder = Side.Buy;
                if (position.Direction == Side.Buy)
                {
                    sideCloseOrder = Side.Sell;
                }
                price = RoundPrice(price, Securiti, sideCloseOrder);

                if (position.State == PositionStateType.Done &&
                    position.OpenVolume == 0)
                {
                    return;
                }

                position.State = PositionStateType.Closing;

                Order closeOrder = _dealCreator.CreateCloseOrderForDeal(position, price, priceType, lifeTime, StartProgram);

                if (closeOrder == null)
                {
                    if (position.OpenVolume == 0)
                    {
                        position.State = PositionStateType.OpeningFail;
                    }

                    return;
                }

                if (isStopOrProfit)
                {
                    closeOrder.IsStopOrProfit = true;
                }
                position.AddNewCloseOrder(closeOrder);
                _connector.OrderExecute(closeOrder);
            }
            catch (Exception error)
            {
                SetNewLogMessage(error.ToString(), LogMessageType.Error);
            }
        }