public void make_request_for_unfilled_limit_to_sell_order_when_current_price_near_take_profit()
        {
            Signal s1 = new Signal(this.strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Sell, OrderType.Limit, 150000, 0, 150000);

            this.tradingData.Get <ICollection <Signal> >().Add(s1);

            Order o1 = new Order(s1);

            this.tradingData.Get <ICollection <Order> >().Add(o1);

            Assert.IsFalse(o1.IsFilled);
            Assert.IsFalse(o1.IsFilledPartially);

            double   currentPrice = 149930;
            DateTime date         = BrokerDateTime.Make(DateTime.Now);
            string   description  = String.Format("Текущая цена {0} на расстоянии одного шага от take profit цены {1} стратегии.", currentPrice, s1.Limit - this.tpSettings.Points);

            IGenericFactory <OrderCancellationRequest> factory = new UnfilledOrderCancellationRequestFactory(currentPrice, o1, tradingData);

            OrderCancellationRequest request = factory.Make();

            Assert.IsTrue(request.Id > 0);
            Assert.AreEqual(o1, request.Order);
            Assert.AreEqual(o1.Id, request.OrderId);
            Assert.IsTrue(request.DateTime >= date);
            Assert.AreEqual(description, request.Description);
        }
        public void cancel_partially_filled_for_limit_to_buy_order_when_current_price_near_stop_loss()
        {
            Signal s1 = new Signal(this.strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 150000, 0, 150000);

            this.tradingData.Get <ICollection <Signal> >().Add(s1);

            Order o1 = new Order(s1);

            this.tradingData.Get <ICollection <Order> >().Add(o1);

            Trade t1 = new Trade(o1, this.strategyHeader.Portfolio, this.strategyHeader.Symbol, 150000, 3, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ICollection <Trade> >().Add(t1);
            o1.FilledAmount = t1.Amount;
            Assert.IsFalse(o1.IsFilled);
            Assert.IsTrue(o1.IsFilledPartially);

            double   currentPrice = 149960;
            DateTime date         = BrokerDateTime.Make(DateTime.Now);
            string   description  = String.Format("Текущая цена {0} на расстоянии одного шага от stop loss цены {1} стратегии.", currentPrice, s1.Limit - this.slSettings.Points);

            IGenericFactory <OrderCancellationRequest> factory = new UnfilledOrderCancellationRequestFactory(currentPrice, o1, tradingData);

            OrderCancellationRequest request = factory.Make();

            Assert.IsTrue(request.Id > 0);
            Assert.AreEqual(o1, request.Order);
            Assert.AreEqual(o1.Id, request.OrderId);
            Assert.IsTrue(request.DateTime >= date);
            Assert.AreEqual(description, request.Description);
        }
        public void repeat_cancellation_request_if_previous_is_older_than_sixty_seconds_for_sell_test()
        {
            MockOrderManager mom = (MockOrderManager)this.orderManager;

            Assert.AreEqual(0, mom.CancelCounter);
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Order> >().Count());
            Assert.AreEqual(0, this.tradingData.CancellationRequests.Count());

            Signal signal = new Signal(this.strategyHeader,
                                       BrokerDateTime.Make(DateTime.Now),
                                       TradeAction.Sell,
                                       OrderType.Limit,
                                       145000,
                                       0,
                                       145100);

            this.signalQueue.Enqueue(signal);

            Order order = this.tradingData.Get <IEnumerable <Order> >().Last();

            OrderCancellationRequest firstRequest = new OrderCancellationRequest(order, "First request");

            firstRequest.DateTime = BrokerDateTime.Make(DateTime.Now.AddSeconds(-61));
            this.tradingData.Get <ICollection <OrderCancellationRequest> >().Add(firstRequest);

            OrderDeliveryConfirmation odc = new OrderDeliveryConfirmation(order, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ObservableHashSet <OrderDeliveryConfirmation> >().Add(odc);

            this.quotesProvider.Update(0, this.strategyHeader.Symbol, 144800, 150, 144810, 150);

            Assert.AreEqual(2, this.tradingData.CancellationRequests.Count());
            Assert.AreEqual(1, mom.CancelCounter);
        }
Ejemplo n.º 4
0
        public void Handlers_cancel_stop_order_when_short_position_closed_by_limit()
        {
            Signal sl = new Signal(this.str2, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Stop, 33000, 33100, 0);

            this.tradingData.Get <ICollection <Signal> >().Add(sl);

            Order slo = new Order(sl);

            this.tradingData.Get <ICollection <Order> >().Add(slo);

            Signal tp = new Signal(this.str2, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 33000, 0, 32900);

            this.tradingData.Get <ICollection <Signal> >().Add(tp);

            Order tpo = new Order(tp);

            this.tradingData.Get <ICollection <Order> >().Add(tpo);

            Assert.AreEqual(-10, this.tradingData.GetAmount(this.str2));
            Assert.AreEqual(2, this.tradingData.Get <ICollection <Order> >().GetUnfilled(this.str2).Count());
            Assert.AreEqual(20, this.tradingData.Get <ICollection <Order> >().GetUnfilledSignedAmount(this.str2));
            Assert.AreEqual(0, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);

            Trade t = new Trade(slo, this.str2.Portfolio, this.str2.Symbol, 33100, this.str1.Amount, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ObservableHashSet <Trade> >().Add(t);
            Assert.AreEqual(1, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);

            OrderCancellationRequest request = this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Last();

            Assert.AreEqual(tpo, request.Order);
            Assert.AreEqual(tpo.Id, request.OrderId);
            Assert.AreEqual(String.Format("Отменить заявку {0}, потому что позиция была закрыта заявкой {1}", tpo.ToString(), slo.ToString()), request.Description);
        }
Ejemplo n.º 5
0
        public void Handlers_cancel_partially_filled_outdated_strategy_order_to_open_short()
        {
            Signal signal = new Signal(this.strategyHeader, new DateTime(2013, 1, 1, 10, 0, 0), TradeAction.Sell, OrderType.Limit, 150000, 0, 150000);

            this.tradingData.Get <ICollection <Signal> >().Add(signal);

            Order order = new Order(1, new DateTime(2013, 1, 1, 10, 0, 0), this.strategyHeader.Portfolio, this.strategyHeader.Symbol, signal.TradeAction, signal.OrderType, signal.Amount, signal.Price, signal.Stop);

            order.Signal   = signal;
            order.SignalId = signal.Id;
            this.tradingData.Get <ICollection <Order> >().Add(order);

            Trade t1 = new Trade(order, order.Portfolio, order.Symbol, order.Price, -2, new DateTime(2013, 1, 1, 10, 0, 1));

            this.tradingData.Get <ObservableHashSet <Trade> >().Add(t1);

            Assert.AreEqual(2, order.FilledAmount);

            Assert.AreEqual(0, this.tradingData.Get <ICollection <OrderCancellationRequest> >().Count);

            Tick tick = new Tick("RTS-9.13_FT", new DateTime(2013, 1, 1, 10, 0, 11), 150000, 10);

            this.tradingData.Get <ObservableCollection <Tick> >().Add(tick);

            Assert.AreEqual(1, this.tradingData.Get <ICollection <OrderCancellationRequest> >().Count);
            OrderCancellationRequest request = this.tradingData.Get <ICollection <OrderCancellationRequest> >().Last();

            Assert.AreEqual(order.Id, request.OrderId);
        }
        /// <summary>
        /// Remove an outstanding order on the constellation exchange.
        /// </summary>
        /// <param name="orderId">Id of the order to cancel</param>
        /// <returns></returns>
        public async Task <QuantumResult> CancelOrder(ulong orderId)
        {
            var cancelOrderRequest = new OrderCancellationRequest {
                OrderId = orderId
            };

            return(await Send(cancelOrderRequest));
        }
Ejemplo n.º 7
0
        public async Task <MessageEnvelope> CancelOrder(ulong orderId, bool waitForFinalize = true)
        {
            var order = new OrderCancellationRequest {
                OrderId = orderId
            };
            var response = (CentaurusResponse)await connection.SendMessage(order.CreateEnvelope());

            var result = await(waitForFinalize ? response.ResponseTask : response.AcknowledgmentTask);

            return(result);
        }
Ejemplo n.º 8
0
        public void OrderCancellationRequest_constructor_test()
        {
            Order order = new Order {
                Portfolio = "BP12345-RF-01", Symbol = "RTS-9.13_FT", TradeAction = TradeAction.Buy, OrderType = OrderType.Limit, Amount = 10
            };

            OrderCancellationRequest request = new OrderCancellationRequest(order, "Cигнал номер 3923");

            Assert.IsTrue(request.Id > 0);
            Assert.AreEqual(order.Id, request.OrderId);
            Assert.AreEqual("Cигнал номер 3923", request.Description);
            Assert.AreEqual(order, request.Order);
            Assert.IsTrue(request.DateTime >= order.DateTime);
        }
        public void Handlers_Ignore_cancellation_confirmation_if_order_is_not_exists()
        {
            Order order = new Order(this.s1);

            OrderCancellationRequest request = new OrderCancellationRequest(order, "Cancel order request");

            this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Add(request);
            Assert.IsFalse(order.IsCanceled);

            OrderCancellationConfirmation confirmation = new OrderCancellationConfirmation(order, BrokerDateTime.Make(DateTime.Now), "Order canceled");

            this.tradingData.Get <ObservableHashSet <OrderCancellationConfirmation> >().Add(confirmation);

            Assert.IsFalse(order.IsCanceled);
        }
Ejemplo n.º 10
0
        public void OrderCancellationRequest_duplicates()
        {
            Order order = new Order {
                Portfolio = "BP12345-RF-01", Symbol = "RTS-9.13_FT", TradeAction = TradeAction.Buy, OrderType = OrderType.Limit, Amount = 10
            };

            OrderCancellationRequest request = new OrderCancellationRequest(order, "Cигнал номер 3923");

            HashSet <OrderCancellationRequest> collection = new HashSet <OrderCancellationRequest>(new IdentifiedComparer());

            collection.Add(request);
            Assert.AreEqual(1, collection.Count);

            collection.Add(request);
            Assert.AreEqual(1, collection.Count);
        }
Ejemplo n.º 11
0
        public MakeOrderCancellationRequestOnQuote(StrategyHeader strategyHeader,
                                                   double priceShiftPoints,
                                                   IQuoteProvider quotesProvider,
                                                   IDataContext tradingData,
                                                   ILogger logger)
            : base(quotesProvider)
        {
            this.strategyHeader = strategyHeader;
            this.priceShift     = priceShiftPoints;
            this.quotesProvider = quotesProvider;
            this.tradingData    = tradingData;
            this.logger         = logger;

            this.bestPrice = 0;
            this.request   = null;
        }
Ejemplo n.º 12
0
        public void OrderCancellationRequest_ToString_test()
        {
            Order order = new Order(1,
                                    BrokerDateTime.Make(DateTime.Now),
                                    "BP12345-RF-01",
                                    "RTS-12.13_FT",
                                    TradeAction.Buy,
                                    OrderType.Limit,
                                    1,
                                    150000,
                                    0);

            OrderCancellationRequest request = new OrderCancellationRequest(order, "Лучшая цена предложения ушла от цены заявки на 100 пунктов.");
            string result = String.Format("Запрос на отмену заявки Id: {0}, DateTime: {1}, Description: {2}, OrderId: {3}", request.Id, request.DateTime, request.Description, request.OrderId);

            Assert.AreEqual(result, request.ToString());
        }
Ejemplo n.º 13
0
        public void Handlers_CancelOrder_on_cancellation_request_arrival()
        {
            Signal signal = new Signal(this.st1, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 150000, 0, 120000);

            this.tradingData.Get <ICollection <Signal> >().Add(signal);

            Order order = new Order(signal);

            this.tradingData.Get <ICollection <Order> >().Add(order);

            Assert.AreEqual(0, this.manager.CancelCounter);
            OrderCancellationRequest request = new OrderCancellationRequest(order, "Internally expired");

            this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Add(request);

            Assert.AreEqual(1, this.manager.CancelCounter);
        }
        public void Handlers_Cancel_order_on_cancellation_confirmation()
        {
            Order order = new Order(this.s3);

            this.tradingData.Get <ICollection <Order> >().Add(order);

            OrderCancellationRequest request = new OrderCancellationRequest(order, "Cancel order request");

            this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Add(request);
            Assert.IsFalse(order.IsCanceled);

            OrderCancellationConfirmation confirmation = new OrderCancellationConfirmation(order, BrokerDateTime.Make(DateTime.Now), "Order canceled");

            this.tradingData.Get <ObservableHashSet <OrderCancellationConfirmation> >().Add(confirmation);

            Assert.IsTrue(order.IsCanceled);
            Assert.AreEqual(confirmation.DateTime, order.CancellationDate);
            Assert.AreEqual(confirmation.Description, order.CancellationReason);
        }
Ejemplo n.º 15
0
        public override void OnQuotesUpdate(string symbol)
        {
            if (!this.strategyHeader.Symbol.Equals(symbol))
            {
                return;
            }

            if (this.tradingData.GetAmount(this.strategyHeader) != 0)
            {
                return;
            }

            Order lastUnfilledOrder = GetLastUnfilledOrder();

            if (lastUnfilledOrder == null)
            {
                return;
            }

            if (!lastUnfilledOrder.IsDelivered)
            {
                return;
            }

            if (!BestQuotePriceGoneOverTheLimit(lastUnfilledOrder))
            {
                return;
            }

            if (OrderCancellationRequstExists(lastUnfilledOrder))
            {
                return;
            }

            this.request = null;
            this.request = MakeOrderCancellationRequest(lastUnfilledOrder);

            this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fff}, {1}, запрос на снятие заявки {2}", DateTime.Now, this.GetType().Name, request.ToString()));

            this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Add(request);
        }
Ejemplo n.º 16
0
        public void open_long_position_with_market_order_protect_it_with_stop_and_limit_and_close_with_limit()
        {
            // Сигнал на открытие позиции
            Signal inputSignal = new Signal(this.strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Market, 150000, 0, 0);

            EmulateTradeFor(inputSignal, 150050);

            // Заявка исполнена, позиция открыта ровно на запрошенный в заявке объем
            Assert.AreEqual(10, this.tradingData.GetAmount(this.strategyHeader));

            // Для позиции созданы и отправлены брокеру защитные стоп и тейк профит приказы
            Assert.AreEqual(3, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(3, this.tradingData.Get <IEnumerable <Order> >().Count());
            Signal slSignal = this.tradingData.Get <IEnumerable <Signal> >().Single(s => s.OrderType == OrderType.Stop && s.StrategyId == this.strategyHeader.Id);
            Signal tpSignal = this.tradingData.Get <IEnumerable <Signal> >().Single(s => s.OrderType == OrderType.Limit && s.StrategyId == this.strategyHeader.Id);

            // Цена защитных приказов установлена соответственно настройкам
            Assert.AreEqual(149750, slSignal.Stop);
            Assert.AreEqual(150550, tpSignal.Limit);

            // Через некоторое время цена на рынке вырастает, срабатывает take profit приказ и исполняется одной сделкой
            EmulateTradeFor(tpSignal, 145500);

            Order slOrder =
                this.tradingData.Get <IEnumerable <Order> >().Single(o => o.SignalId == slSignal.Id);
            Order tpOrder =
                this.tradingData.Get <IEnumerable <Order> >().Single(o => o.SignalId == tpSignal.Id);

            Assert.IsTrue(tpOrder.IsFilled);
            Assert.IsFalse(slOrder.IsFilled);
            Assert.IsFalse(slOrder.IsCanceled);

            // Позиция закрыта
            Assert.AreEqual(0, this.tradingData.GetAmount(this.strategyHeader));

            // Брокеру отправлен запрос на отмену stop loss приказа
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <OrderCancellationRequest> >().Count());
            OrderCancellationRequest slRequest = this.tradingData.Get <IEnumerable <OrderCancellationRequest> >().Single(r => r.OrderId == slOrder.Id);

            Assert.IsNotNull(slRequest);
        }
Ejemplo n.º 17
0
        public override void OnItemAdded(Tick item)
        {
            //TODO здесь что-то очень медленно:
            IEnumerable <Order> unfilled = this.tradingData.Get <ICollection <Order> >().GetUnfilled(item.Symbol);

            if (unfilled == null)
            {
                return;
            }

            if (unfilled.Count() == 0)
            {
                return;
            }
            try
            {
                foreach (Order o in unfilled)
                {
                    if (!this.tradingData.Get <ICollection <Position> >().Exists(o.Portfolio, o.Symbol))
                    {
                        IGenericFactory <OrderCancellationRequest> cancellationFactory = new UnfilledOrderCancellationRequestFactory(item.Price, o, (TradingDataContext)this.tradingData);
                        //cancellationFactory.currentPrice = item.Price;
                        //cancellationFactory.order = o;
                        //cancellationFactory.tradingData = (TradingDataContext)this.tradingData;

                        OrderCancellationRequest request = cancellationFactory.Make();

                        if (request != null)
                        {
                            this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fff}, {1}, сформирован новый запрос {2} на отмену заявки {3}.", DateTime.Now, this.GetType().Name, o.ToString(), request.Description));
                            this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Add(request);
                        }
                    }
                }
            }
            catch
            {
                this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fff}, {1}, Ошибка в {2}.", DateTime.Now, this.GetType().Name, "OnItemAdded"));
            }
        }
        public async Task OrderCancellationQuantumTest(int asset, int amount, OrderSide side, int apexMod, bool useFakeSigner, Type excpectedException)
        {
            var acc = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair);

            var order = new OrderRequest
            {
                Account        = acc.Account.Id,
                RequestId      = 1,
                Amount         = amount,
                Asset          = asset,
                Price          = 100,
                Side           = side,
                AccountWrapper = acc
            };

            var envelope = order.CreateEnvelope().Sign(useFakeSigner ? TestEnvironment.Client2KeyPair : TestEnvironment.Client1KeyPair);

            if (!context.IsAlpha)
            {
                var quantum = new RequestQuantum {
                    Apex = context.QuantumStorage.CurrentApex + 1, RequestEnvelope = envelope, Timestamp = DateTime.UtcNow.Ticks
                };
                envelope = quantum.CreateEnvelope().Sign(TestEnvironment.AlphaKeyPair);
            }

            var submitResult = await AssertQuantumHandling(envelope, excpectedException);

            if (excpectedException != null)
            {
                return;
            }

            var apex = ((Quantum)submitResult.OriginalMessage.Message).Apex + apexMod;

            var orderCancellation = new OrderCancellationRequest
            {
                Account        = acc.Account.Id,
                RequestId      = 2,
                OrderId        = OrderIdConverter.Encode((ulong)apex, asset, side),
                AccountWrapper = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair)
            };

            envelope = orderCancellation.CreateEnvelope().Sign(TestEnvironment.Client1KeyPair);

            if (!context.IsAlpha)
            {
                var quantum = new RequestQuantum {
                    Apex = context.QuantumStorage.CurrentApex + 1, RequestEnvelope = envelope, Timestamp = DateTime.UtcNow.Ticks
                };
                envelope = quantum.CreateEnvelope().Sign(TestEnvironment.AlphaKeyPair);
            }

            var cancelResult = await AssertQuantumHandling(envelope, excpectedException);

            if (excpectedException != null)
            {
                return;
            }
            var currentMarket = context.Exchange.GetMarket(asset);

            Assert.IsTrue(currentMarket != null);

            var requests = side == OrderSide.Buy ? currentMarket.Bids : currentMarket.Asks;

            Assert.AreEqual(requests.Count, 0);
        }
        public void open_short_position_with_market_order_protect_it_with_stop_limit_rejected_close_with_emergency_market()
        {
            // Настройки для торгуемой стратегии
            Symbol symbol = new Symbol("RTS-9.13_FT", 1, 8, 10, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ICollection <Symbol> >().Add(symbol);

            StrategyHeader strategyHeader = new StrategyHeader(1, "strategyHeader", "BP12345-RF-01", "RTS-9.13_FT", 10);

            this.tradingData.Get <ICollection <StrategyHeader> >().Add(strategyHeader);

            StopPointsSettings slSettings = new StopPointsSettings(strategyHeader, 300, false);

            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(slSettings);

            ProfitPointsSettings tpSettings = new ProfitPointsSettings(strategyHeader, 500, false);

            this.tradingData.Get <ICollection <ProfitPointsSettings> >().Add(tpSettings);

            StopLossOrderSettings slOrderSettings = new StopLossOrderSettings(strategyHeader, 3600);

            this.tradingData.Get <ICollection <StopLossOrderSettings> >().Add(slOrderSettings);

            TakeProfitOrderSettings tpOrderSettings = new TakeProfitOrderSettings(strategyHeader, 3600);

            this.tradingData.Get <ICollection <TakeProfitOrderSettings> >().Add(tpOrderSettings);

            StrategyStopLossByPointsOnTick stopLossHandler =
                new StrategyStopLossByPointsOnTick(strategyHeader, this.tradingData, this.signalQueue, new NullLogger());
            StrategyTakeProfitByPointsOnTick takeProfitHandler =
                new StrategyTakeProfitByPointsOnTick(strategyHeader, this.tradingData, this.signalQueue, new NullLogger());

            PlaceStrategyStopLossByPointsOnTrade placeStopOnTradeHandler =
                new PlaceStrategyStopLossByPointsOnTrade(strategyHeader, this.tradingData, this.signalQueue, new NullLogger());
            PlaceStrategyTakeProfitByPointsOnTrade placeTakeProfitOnTradeHandler =
                new PlaceStrategyTakeProfitByPointsOnTrade(strategyHeader, this.tradingData, this.signalQueue, new NullLogger());


            // Сигнал на открытие позиции
            Signal inputSignal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Sell, OrderType.Market, 150000, 0, 0);
            // Брокер исполнил заявку одной сделкой
            Trade inputTrade = this.tradingData.AddSignalAndItsOrderAndTrade(inputSignal);

            // Заявка исполнена, позиция открыта ровно на запрошенный в заявке объем
            Assert.IsTrue(inputTrade.Order.IsFilled);
            Assert.AreEqual(-10, this.tradingData.GetAmount(strategyHeader));

            // Для позиции созданы и отправлены брокеру защитные стоп и тейк профит приказы
            Assert.AreEqual(3, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(3, this.tradingData.Get <IEnumerable <Order> >().Count());
            Order slOrder = this.tradingData.Get <IEnumerable <Order> >().Single(o => o.OrderType == OrderType.Stop);
            Order tpOrder = this.tradingData.Get <IEnumerable <Order> >().Single(o => o.OrderType == OrderType.Limit);

            // Цена защитных приказов установлена соответственно настройкам
            Assert.AreEqual(150300, slOrder.Stop);
            Assert.AreEqual(149500, tpOrder.Price);

            // Брокер подтверждает только получение стоп приказа и отклоняет тейк профит приказ
            this.tradingData.Get <ObservableHashSet <OrderDeliveryConfirmation> >().Add(new OrderDeliveryConfirmation(slOrder, BrokerDateTime.Make(DateTime.Now)));
            this.tradingData.Get <ObservableHashSet <OrderDeliveryConfirmation> >().Add(new OrderDeliveryConfirmation(tpOrder, BrokerDateTime.Make(DateTime.Now)));
            this.tradingData.Get <ObservableHashSet <OrderRejection> >().Add(new OrderRejection(tpOrder, BrokerDateTime.Make(DateTime.Now), "заявка отклонена"));
            Assert.IsTrue(slOrder.IsDelivered);
            Assert.IsTrue(tpOrder.IsDelivered);
            Assert.IsTrue(tpOrder.IsRejected);

            // Тик не дошел до цены закрытия, поэтому сигнал экстренного закрытия по тейк профиту не срабатывает
            this.tradingData.Get <ObservableCollection <Tick> >().Add(new Tick("RTS-9.13_FT", BrokerDateTime.Make(DateTime.Now), 149510, 100));
            Assert.AreEqual(3, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Тик дошел до цены закрытия, поэтому срабатывает сигнал экстренного закрытия по тейк профиту
            this.tradingData.Get <ObservableCollection <Tick> >().Add(new Tick("RTS-9.13_FT", BrokerDateTime.Make(DateTime.Now), 149500, 150));
            Assert.AreEqual(4, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Извлекаем копию отправленной брокеру заявки чтобы убедиться в том, что отправлена нужная нам заявка
            Order etpOrder = this.tradingData.Get <IEnumerable <Order> >().Last();

            Assert.AreEqual(TradeAction.Buy, etpOrder.TradeAction);
            Assert.AreEqual(OrderType.Market, etpOrder.OrderType);
            Assert.AreEqual(Math.Abs(this.tradingData.GetAmount(strategyHeader)), etpOrder.Amount);

            // Заявка экстренного закрытия исполняется одной сделкой
            Trade outputTrade = this.tradingData.AddSignalAndItsOrderAndTrade(etpOrder.Signal);

            // Приказ экстренного закрытия по тейк профиту исполнен
            Assert.IsTrue(etpOrder.IsFilled);

            // Стоп лосс приказ не исполнен
            Assert.IsFalse(slOrder.IsFilled);

            // Система автоматически сгенерировала и отправила заявку на отмену стоп лосс приказа
            Assert.AreEqual(1, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);
            OrderCancellationRequest slOrderCancel = this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Last();

            Assert.AreEqual(slOrder.Id, slOrderCancel.OrderId);

            // Брокер присылает подтверждение отмены стоп лосс приказа
            this.tradingData.Get <ObservableHashSet <OrderCancellationConfirmation> >().Add(new OrderCancellationConfirmation(slOrder, BrokerDateTime.Make(DateTime.Now), "Отмена приказа подтверждена"));
            Assert.IsTrue(slOrder.IsCanceled);

            // Позиция закрыта
            Assert.AreEqual(0, this.tradingData.GetAmount(strategyHeader));
        }
Ejemplo n.º 20
0
        public void Handlers_cancel_short_position_stop_order_when_take_profit_order_begin_filling()
        {
            // Добавляем новую стратегию
            StrategyHeader strategyHeader = new StrategyHeader(1, "Strategy 1", "BP12345-RF-01", "RTS-9.13_FT", 15);

            this.tradingData.Get <ICollection <StrategyHeader> >().Add(strategyHeader);

            // Добавляем настройки stop loss для стратегии
            StopPointsSettings slSettings = new StopPointsSettings(strategyHeader, 900, false);

            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(slSettings);

            // Добавляем настройки take profit для стратегии
            ProfitPointsSettings tpSettings = new ProfitPointsSettings(strategyHeader, 1000, false);

            this.tradingData.Get <ICollection <ProfitPointsSettings> >().Add(tpSettings);

            // Имитируем генерацию сигнала на открытие позиции
            Signal signal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Sell, OrderType.Limit, 150000, 0, 150000);

            this.tradingData.Get <ICollection <Signal> >().Add(signal);

            Order order = new Order(signal);

            this.tradingData.Get <ICollection <Order> >().Add(order);

            // Брокер исполнил заявку на открытие позиции одной сделкой
            Trade trade = new Trade(order, order.Portfolio, order.Symbol, 150000, -order.Amount, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ObservableHashSet <Trade> >().Add(trade);

            // Позиция существует и ее объем равен объему в исполненной сделке
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Position> >().Count());
            Assert.AreEqual(-15, this.tradingData.GetAmount(strategyHeader));

            // Имитируем автоматическую генерацию сигнала на установку stop loss заявки
            Signal slSignal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Stop, 150000, 150900, 0);

            this.tradingData.Get <ICollection <Signal> >().Add(slSignal);

            Order slOrder = new Order(slSignal);

            this.tradingData.Get <ICollection <Order> >().Add(slOrder);

            // Имитируем автоматическую генерацию сигнала на установку takep profit заявки
            Signal tpSignal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 150000, 0, 149000);

            this.tradingData.Get <ICollection <Signal> >().Add(tpSignal);

            Order tpOrder = new Order(tpSignal);

            this.tradingData.Get <ICollection <Order> >().Add(tpOrder);

            // Рынок дошел до take profit но заявка исполнилась лишь частично
            Trade tpTrade = new Trade(tpOrder, tpOrder.Portfolio, tpOrder.Symbol, 149000, 8, BrokerDateTime.Make(DateTime.Now));

            this.tradingData.Get <ObservableHashSet <Trade> >().Add(tpTrade);

            // Объем позиции обновился
            Assert.AreEqual(-7, this.tradingData.GetAmount(strategyHeader));

            // Обработчик автоматически отправил запрос на отмену stop loss заявки как только начала исполняться лимитная заявка
            Assert.AreEqual(1, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);
            OrderCancellationRequest request = this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Last();

            Assert.AreEqual(slOrder, request.Order);
        }