Esempio n. 1
0
        public void Setup()
        {
            Symbol symbol = new Symbol("RTS-9.13_FT", 1, 8, 10, BrokerDateTime.Make(DateTime.Now));

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

            this.strategyHeader = new StrategyHeader(10, "strategyHeader", "BP12345-RF-01", "RTS-9.13_FT", 10);
            this.tradingData.Get <ICollection <StrategyHeader> >().Add(this.strategyHeader);

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

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

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

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

            StopLossOrderSettings slOrderSettings = new StopLossOrderSettings(this.strategyHeader, 3600);

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

            TakeProfitOrderSettings tpOrderSettings = new TakeProfitOrderSettings(this.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());
        }
        public void Setup()
        {
            this.tradingData  = new TradingDataContext();
            this.signalQueue  = new ObservableQueue <Signal>();
            this.orderQueue   = new ObservableQueue <Order>();
            this.orderManager = new MockOrderManager();
            this.tb           = new TraderBase(this.tradingData,
                                               this.signalQueue,
                                               this.orderQueue,
                                               this.orderManager,
                                               new AlwaysTimeToTradeSchedule(),
                                               new NullLogger());

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

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

            StopPointsSettings spSettings = new StopPointsSettings(strategyHeader, 50, false);

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

            StopLossOrderSettings sloSettings = new StopLossOrderSettings(strategyHeader, 100);

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

            ProfitPointsSettings ppSettings = new ProfitPointsSettings(strategyHeader, 100, false);

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

            TakeProfitOrderSettings tpoSettings = new TakeProfitOrderSettings(strategyHeader, 100);

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

            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());


            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Order> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Trade> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Position> >().Count());
            Assert.AreEqual(0, this.signalQueue.Count);
            Assert.AreEqual(0, this.orderQueue.Count);
        }
Esempio n. 3
0
        public void Setup()
        {
            this.tradingData = new TradingDataContext();
            this.signalQueue = new ObservableQueue <Signal>();

            this.strategyHeader = new StrategyHeader(1, "Description", "ST12345-RF-01", "RTS-9.14", 10);
            this.tradingData.Get <ICollection <StrategyHeader> >().Add(this.strategyHeader);

            this.ppSettings = new ProfitPointsSettings(this.strategyHeader, 100, false);
            this.tradingData.Get <ICollection <ProfitPointsSettings> >().Add(this.ppSettings);

            this.tpoSettings = new TakeProfitOrderSettings(this.strategyHeader, 180);
            this.tradingData.Get <ICollection <TakeProfitOrderSettings> >().Add(this.tpoSettings);

            this.handler =
                new PlaceStrategyTakeProfitByPointsOnTrade(this.strategyHeader, this.tradingData, this.signalQueue, new NullLogger());

            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Order> >().Count());
            Assert.AreEqual(0, this.signalQueue.Count);
        }
Esempio n. 4
0
        public void Setup()
        {
            this.strategyHeader = this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 1);

            StopPointsSettings spSettings = new StopPointsSettings(this.strategyHeader, 100, false);

            this.tradingData.Get <ObservableHashSet <StopPointsSettings> >().Add(spSettings);

            StopLossOrderSettings slSettings = new StopLossOrderSettings(this.strategyHeader, 3600);

            this.tradingData.Get <ObservableHashSet <StopLossOrderSettings> >().Add(slSettings);

            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());
        }
        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));
        }
        public void open_long_position_with_market_order_protect_it_with_stop_and_limit_and_close_with_stop()
        {
            // Настройки для торгуемой стратегии
            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(), true);
            StrategyTakeProfitByPointsOnTick takeProfitHandler =
                new StrategyTakeProfitByPointsOnTick(strategyHeader, this.tradingData, this.signalQueue, new NullLogger(), true);

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


            // Сигнал на открытие позиции
            Signal inputSignal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Market, 150000, 0, 0);

            this.signalQueue.Enqueue(inputSignal);

            // Сигнал успешно обработан и заявка отправлена брокеру
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Копия отправленной брокеру заявки на открытие позиции
            Order inputOrder = this.tradingData.Get <IEnumerable <Order> >().Last();

            // Брокер подтвердил получение заявки
            this.tradingData.Get <ObservableHashSet <OrderDeliveryConfirmation> >().Add(new OrderDeliveryConfirmation(inputOrder, BrokerDateTime.Make(DateTime.Now)));
            Assert.IsTrue(inputOrder.IsDelivered);

            // Брокер исполнил заявку одной сделкой
            Trade inputTrade = new Trade(inputOrder, inputOrder.Portfolio, inputOrder.Symbol, 150050, inputOrder.Amount, BrokerDateTime.Make(DateTime.Now));

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

            // Заявка исполнена, позиция открыта ровно на запрошенный в заявке объем
            Assert.IsTrue(inputOrder.IsFilled);
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Position> >().Count());
            Position position = this.tradingData.Get <IEnumerable <Position> >().Last();

            Assert.AreEqual(10, position.Amount);

            // Для позиции созданы и отправлены брокеру защитные стоп и тейк профит приказы
            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(149700, slOrder.Stop);
            Assert.AreEqual(150500, 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)));
            Assert.IsTrue(slOrder.IsDelivered);
            Assert.IsTrue(tpOrder.IsDelivered);

            // Через некоторое время цена на рынке падает, срабатывает защитный стоп приказ и исполняется одной сделкой
            Trade outputTrade = new Trade(slOrder, slOrder.Portfolio, slOrder.Symbol, 149680, -slOrder.Amount, BrokerDateTime.Make(DateTime.Now));

            tradingData.Get <ObservableHashSet <Trade> >().Add(outputTrade);

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

            // Позиция закрыта
            Assert.AreEqual(0, position.Amount);

            // Брокеру отправлен запрос на отмену приказа take profit
            Assert.AreEqual(1, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);

            // Брокер подтверждает получение заявки на отмену приказа
            this.tradingData.Get <ObservableHashSet <OrderCancellationConfirmation> >().Add(new OrderCancellationConfirmation(tpOrder, BrokerDateTime.Make(DateTime.Now), "Заявка снята"));
            Assert.IsTrue(tpOrder.IsCanceled);
        }
        public void open_long_position_with_market_order_protect_it_with_stop_and_limit_and_close_with_limit_multiple_trades()
        {
            // Настройки для торгуемой стратегии
            Symbol symbol = new Symbol("RTS-9.13_FT", 1, 8, 10, BrokerDateTime.Make(DateTime.Now));

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

            StrategyHeader strategyHeader = new StrategyHeader(6, "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.Buy, OrderType.Market, 150000, 0, 0);

            EmulateTradeFor(inputSignal, 150050, 3);

            // Копия отправленной брокеру заявки на открытие позиции
            Order inputOrder = this.tradingData.Get <IEnumerable <Order> >().Single(o => o.SignalId == inputSignal.Id);

            // Часть заявки исполнена, позиция открыта ровно на исполненный сделкой объем
            Assert.IsFalse(inputOrder.IsFilled);
            Assert.IsTrue(inputOrder.IsFilledPartially);
            Assert.AreEqual(3, this.tradingData.GetAmount(strategyHeader));

            // Заявки на приказы stop loss и take profit не генерируются, поскольку рыночная заявка не исполнена
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Следующая сделка
            EmulateTradeFor(inputSignal, 150060, 5);

            // Часть заявки исполнена, позиция увеличилась ровно на исполненный сделкой объем
            Assert.IsFalse(inputOrder.IsFilled);
            Assert.IsTrue(inputOrder.IsFilledPartially);
            Assert.AreEqual(8, this.tradingData.GetAmount(strategyHeader));

            // Заявки на приказы stop loss и take profit не генерируются, поскольку рыночная заявка не исполнена
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            EmulateTradeFor(inputSignal, 150070, 2);

            // Заявка полностью исполнена, позиция увеличилась ровно на исполненный сделкой объем
            Assert.IsTrue(inputOrder.IsFilled);
            Assert.IsFalse(inputOrder.IsFilledPartially);
            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());

            Signal slSignal = this.tradingData.Get <IEnumerable <Signal> >().Single(s => s.OrderType == OrderType.Stop);
            Signal tpSignal = this.tradingData.Get <IEnumerable <Signal> >().Single(s => s.OrderType == OrderType.Limit);
            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.AreEqual(149770, slOrder.Stop);
            Assert.AreEqual(150570, tpOrder.Price);

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

            // Take profit приказ исполнен лишь частично. Позиция не закрыта. Stop loss приказ не отменен
            Assert.IsFalse(tpOrder.IsFilled);
            Assert.IsTrue(tpOrder.IsFilledPartially);
            Assert.AreEqual(6, this.tradingData.GetAmount(strategyHeader));
            Assert.IsFalse(slOrder.IsCanceled);

            // Исполняется вторая сделка
            EmulateTradeFor(tpSignal, 150500, 5);

            // Take profit приказ исполнен лишь частично. Позиция не закрыта. Stop loss приказ не отменен
            Assert.IsFalse(tpOrder.IsFilled);
            Assert.IsTrue(tpOrder.IsFilledPartially);
            Assert.AreEqual(1, this.tradingData.GetAmount(strategyHeader));
            Assert.IsFalse(slOrder.IsCanceled);

            // Исполняется третья сделка
            EmulateTradeFor(tpSignal, 150500, 1);

            // Take profit приказ исполнен
            Assert.IsTrue(tpOrder.IsFilled);
            Assert.IsFalse(slOrder.IsFilled);
            Assert.IsFalse(slOrder.IsCanceled);

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

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

            // Брокер подтверждает получение заявки на отмену приказа
            this.tradingData.Get <ObservableHashSet <OrderCancellationConfirmation> >().Add(new OrderCancellationConfirmation(slOrder, BrokerDateTime.Make(DateTime.Now), "Заявка снята"));
            Assert.IsTrue(slOrder.IsCanceled);
        }
        public void open_short_position_with_market_order_protect_it_with_stop_and_limit_and_close_with_stop_multiple_trades()
        {
            // Настройки для торгуемой стратегии
            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(), true);
            StrategyTakeProfitByPointsOnTick takeProfitHandler =
                new StrategyTakeProfitByPointsOnTick(strategyHeader, this.tradingData, this.signalQueue, new NullLogger(), true);

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


            // Сигнал на открытие позиции
            Signal inputSignal = new Signal(strategyHeader, BrokerDateTime.Make(DateTime.Now), TradeAction.Sell, OrderType.Market, 150000, 0, 0);

            this.signalQueue.Enqueue(inputSignal);

            // Сигнал успешно обработан и заявка отправлена брокеру
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Копия отправленной брокеру заявки на открытие позиции
            Order inputOrder = this.tradingData.Get <IEnumerable <Order> >().Last();

            // Брокер подтвердил получение заявки
            this.tradingData.Get <ObservableHashSet <OrderDeliveryConfirmation> >().Add(new OrderDeliveryConfirmation(inputOrder, BrokerDateTime.Make(DateTime.Now)));
            Assert.IsTrue(inputOrder.IsDelivered);

            // Брокер исполнил заявку несколькими сделками
            Trade inputTrade = new Trade(inputOrder, inputOrder.Portfolio, inputOrder.Symbol, 149900, -7, BrokerDateTime.Make(DateTime.Now));

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

            // Часть заявки исполнена, позиция открыта ровно на исполненный сделкой объем
            Assert.IsFalse(inputOrder.IsFilled);
            Assert.IsTrue(inputOrder.IsFilledPartially);
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Position> >().Count());
            Position position = this.tradingData.Get <IEnumerable <Position> >().Last();

            Assert.AreEqual(-7, position.Amount);

            // Заявки на приказы stop loss и take profit не генерируются, поскольку рыночная заявка не исполнена
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Следующая сделка
            Trade t2 = new Trade(inputOrder, inputOrder.Portfolio, inputOrder.Symbol, 149920, -1, BrokerDateTime.Make(DateTime.Now));

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

            // Часть заявки исполнена, позиция увеличилась ровно на исполненный сделкой объем
            Assert.IsFalse(inputOrder.IsFilled);
            Assert.IsTrue(inputOrder.IsFilledPartially);
            Assert.AreEqual(-8, position.Amount);

            // Заявки на приказы stop loss и take profit не генерируются, поскольку рыночная заявка не исполнена
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(1, this.tradingData.Get <IEnumerable <Order> >().Count());

            // Следующая сделка
            Trade t3 = new Trade(inputOrder, inputOrder.Portfolio, inputOrder.Symbol, 149950, -2, BrokerDateTime.Make(DateTime.Now));

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

            // Заявка полностью исполнена, позиция увеличилась ровно на исполненный сделкой объем
            Assert.IsTrue(inputOrder.IsFilled);
            Assert.IsFalse(inputOrder.IsFilledPartially);
            Assert.AreEqual(-10, position.Amount);

            // Для позиции созданы и отправлены брокеру защитные стоп и тейк профит приказы
            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)));
            Assert.IsTrue(slOrder.IsDelivered);
            Assert.IsTrue(tpOrder.IsDelivered);

            // Через некоторое время цена на рынке падает, срабатывает защитный take profit приказ и исполняется первая сделка
            Trade outputTrade = new Trade(tpOrder, tpOrder.Portfolio, tpOrder.Symbol, 149500, 3, BrokerDateTime.Make(DateTime.Now));

            tradingData.Get <ObservableHashSet <Trade> >().Add(outputTrade);

            // Take profit приказ исполнен лишь частично. Позиция не закрыта. Stop loss приказ не отменен
            Assert.IsFalse(tpOrder.IsFilled);
            Assert.IsTrue(tpOrder.IsFilledPartially);
            Assert.AreEqual(-7, position.Amount);
            Assert.IsFalse(slOrder.IsCanceled);

            // Исполняется вторая сделка
            Trade ot2 = new Trade(tpOrder, tpOrder.Portfolio, tpOrder.Symbol, 149500, 4, BrokerDateTime.Make(DateTime.Now));

            tradingData.Get <ObservableHashSet <Trade> >().Add(ot2);

            // Take profit приказ исполнен лишь частично. Позиция не закрыта. Stop loss приказ не отменен
            Assert.IsFalse(tpOrder.IsFilled);
            Assert.IsTrue(tpOrder.IsFilledPartially);
            Assert.AreEqual(-3, position.Amount);
            Assert.IsFalse(slOrder.IsCanceled);

            // Исполняется третья сделка
            Trade ot3 = new Trade(tpOrder, tpOrder.Portfolio, tpOrder.Symbol, 149500, 3, BrokerDateTime.Make(DateTime.Now));

            tradingData.Get <ObservableHashSet <Trade> >().Add(ot3);

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

            // Позиция закрыта
            Assert.AreEqual(0, position.Amount);

            // Брокеру отправлен запрос на отмену приказа stop loss
            Assert.AreEqual(1, this.tradingData.Get <ObservableHashSet <OrderCancellationRequest> >().Count);

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