Example #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());
        }
Example #2
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.spSettings = new StopPointsSettings(this.strategyHeader, 100, false);
            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(this.spSettings);

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

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

            this.buySignal =
                new Signal(this.strategyHeader, DateTime.Now, TradeAction.Buy, OrderType.Market, 125000, 0, 0);
            this.sellSignal =
                new Signal(this.strategyHeader, DateTime.Now, TradeAction.Sell, OrderType.Market, 125000, 0, 0);

            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Signal> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Order> >().Count());
            Assert.AreEqual(0, this.signalQueue.Count);
        }
Example #3
0
        public void TradingDataContext_GetStopPointsSettings_returns_settings_test()
        {
            StopPointsSettings settings = this.tradingData.GetStopPointsSettings(this.strategy1);

            Assert.IsNotNull(settings);
            Assert.AreEqual(100, settings.Points);
            Assert.IsFalse(settings.Trail);
        }
Example #4
0
        public void Setup()
        {
            this.strategy1 = this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 1);
            this.strategy2 = this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 2);

            StopPointsSettings sps1 = new StopPointsSettings(this.strategy1, 100, false);

            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(sps1);
        }
        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);
        }
Example #6
0
        public void Handlers_Setup()
        {
            this.tradingData = new TradingDataContext();

            PlaceCancelOrderRequestOnTick handler = new PlaceCancelOrderRequestOnTick(this.tradingData, new NullLogger());

            this.tradingData.Get <ICollection <Symbol> >().Add(new Symbol("RTS-9.13_FT", 1, 8, 10, BrokerDateTime.Make(DateTime.Now)));

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

            this.str2 = new StrategyHeader(2, "Strategy 2", "BP12345-RF-01", "Si-9.13_FT", 10);
            this.tradingData.Get <ICollection <StrategyHeader> >().Add(this.str2);

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

            this.s1 = new Signal(this.str1, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 150000, 0, 150100);
            this.tradingData.Get <ObservableHashSet <Signal> >().Add(this.s1);

            this.s2 = new Signal(this.str2, BrokerDateTime.Make(DateTime.Now), TradeAction.Sell, OrderType.Market, 33000, 0, 0);
            this.tradingData.Get <ObservableHashSet <Signal> >().Add(this.s2);

            this.s3 = new Signal(this.str3, BrokerDateTime.Make(DateTime.Now), TradeAction.Buy, OrderType.Limit, 150100, 0, 150200);
            this.tradingData.Get <ObservableHashSet <Signal> >().Add(this.s3);

            StopPointsSettings sls1 = new StopPointsSettings(this.str1, 50, false);

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

            StopPointsSettings sls2 = new StopPointsSettings(this.str2, 10, false);

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

            StopPointsSettings sls3 = new StopPointsSettings(this.str3, 35, false);

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

            ProfitPointsSettings tps1 = new ProfitPointsSettings(this.str1, 80, false);

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

            ProfitPointsSettings tps2 = new ProfitPointsSettings(this.str2, 20, false);

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

            ProfitPointsSettings tps3 = new ProfitPointsSettings(this.str3, 50, false);

            this.tradingData.Get <ICollection <ProfitPointsSettings> >().Add(tps3);
        }
Example #7
0
 private void SetStopLossOrderSettings()
 {
     try
     {
         this.spSettings =
             this.tradingData.
             Get <IEnumerable <StopPointsSettings> >().
             SingleOrDefault(i => i.Strategy.Id == this.strategyHeader.Id);
     }
     catch
     {
         this.spSettings = null;
     }
 }
Example #8
0
        public void StopLossSettings_constructor_test()
        {
            StrategyHeader     strategyHeader   = new StrategyHeader(1, "Strategy 1", "BP12345-RF-01", "RTS-9.13_FT", 10);
            StopPointsSettings stopLossSettings = new StopPointsSettings(strategyHeader, 300, true);

            Assert.IsTrue(stopLossSettings is IIdentified);
            Assert.IsInstanceOfType(stopLossSettings, typeof(PointsSettings));
            Assert.AreEqual(strategyHeader.Id, stopLossSettings.Id);
            Assert.AreEqual(strategyHeader, stopLossSettings.Strategy);
            Assert.AreEqual(strategyHeader.Id, stopLossSettings.StrategyId);
            Assert.AreEqual(300, stopLossSettings.Points);
            Assert.IsInstanceOfType(stopLossSettings.Points, typeof(double));
            Assert.IsTrue(stopLossSettings.Trail);
        }
Example #9
0
        public void Configuration_StopPointsSettingsFactory_makes_settings_test()
        {
            StrategyHeader strategyHeader = new StrategyHeader(1, "Description", "BP12345-RF-01", "RTS-12.13_FT", 1);

            string prefix = "RTSX";

            IGenericFactory <StopPointsSettings> spSettingsFactory = new StopPointsSettingsFactory(strategyHeader, prefix);

            StopPointsSettings spSettings = spSettingsFactory.Make();

            Assert.AreEqual(strategyHeader.Id, spSettings.Id);
            Assert.AreEqual(strategyHeader.Id, spSettings.StrategyId);
            Assert.AreEqual(strategyHeader, spSettings.Strategy);
            Assert.AreEqual(500, spSettings.Points);
            Assert.AreEqual(false, spSettings.Trail);
        }
        public void Setup()
        {
            this.tradingData = new TradingDataContext();

            this.symbol = new Symbol("RTS-9.13_FT", 1, 8, 10, BrokerDateTime.Make(DateTime.Now).AddDays(1));
            this.tradingData.Get <ICollection <Symbol> >().Add(this.symbol);

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

            this.slSettings = new StopPointsSettings(this.strategyHeader, 50, false);
            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(this.slSettings);

            this.tpSettings = new ProfitPointsSettings(this.strategyHeader, 80, false);
            this.tradingData.Get <ICollection <ProfitPointsSettings> >().Add(this.tpSettings);
        }
Example #11
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.spSettings = new StopPointsSettings(this.strategyHeader, 100, false);
            this.tradingData.Get <ICollection <StopPointsSettings> >().Add(this.spSettings);

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

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

            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Order> >().Count());
            Assert.AreEqual(0, this.tradingData.Get <IEnumerable <Trade> >().Count());
            Assert.AreEqual(0, this.signalQueue.Count);
        }
Example #12
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());
        }
Example #13
0
        private static void AddStrategySettings()
        {
            TradingData.Instance.Make <StrategyHeader>().Add(strategyHeader);

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

            TradingData.Instance.Make <StopPointsSettings>().Add(spSettings);

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

            TradingData.Instance.Make <ProfitPointsSettings>().Add(ppSettings);

            StopLossOrderSettings sloSettings = new StopLossOrderSettings(strategyHeader, 3600);

            TradingData.Instance.Make <StopLossOrderSettings>().Add(sloSettings);

            TakeProfitOrderSettings tpoSettings = new TakeProfitOrderSettings(strategyHeader, 3600);

            TradingData.Instance.Make <TakeProfitOrderSettings>().Add(tpoSettings);

            OrderSettings oSettings = new OrderSettings(strategyHeader, 3600);

            TradingData.Instance.Make <OrderSettings>().Add(oSettings);
        }
Example #14
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);
        }
        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_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);
        }
Example #17
0
        public void TradingDataContext_GetStopPointsSettings_returns_null_test()
        {
            StopPointsSettings settings = this.tradingData.GetStopPointsSettings(this.strategy2);

            Assert.IsNull(settings);
        }
        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_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 OrderCancellationRequest Make()
        {
            if (order.IsFilled)
            {
                return(null);
            }

            if (order.OrderType != OrderType.Limit)
            {
                return(null);
            }

            if (order.Signal == null)
            {
                return(null);
            }

            if (order.Signal.Strategy == null)
            {
                return(null);
            }

            Symbol symbol = this.tradingData.GetSymbol(this.order.Symbol);

            if (symbol == null)
            {
                return(null);
            }

            StopPointsSettings slSettings = this.tradingData.GetStopPointsSettings(order.Signal.Strategy);

            if (slSettings == null)
            {
                return(null);
            }

            ProfitPointsSettings tpSettings = this.tradingData.GetProfitPointsSettings(order.Signal.Strategy);

            if (tpSettings == null)
            {
                return(null);
            }

            if (order.TradeAction == TradeAction.Buy)
            {
                double stopLossPrice = this.order.Signal.Limit - slSettings.Points;

                if (stopLossPrice + symbol.Step >= currentPrice)
                {
                    string descr = String.Format("Текущая цена {0} на расстоянии одного шага от stop loss цены {1} стратегии.", currentPrice, stopLossPrice);
                    return(new OrderCancellationRequest(order, descr));
                }

                double takeProfitPrice = this.order.Signal.Limit + tpSettings.Points;

                if (takeProfitPrice - symbol.Step <= currentPrice)
                {
                    string descr = String.Format("Текущая цена {0} на расстоянии одного шага от take profit цены {1} стратегии.", currentPrice, takeProfitPrice);
                    return(new OrderCancellationRequest(order, descr));
                }
            }

            if (order.TradeAction == TradeAction.Sell)
            {
                double stopLossPrice = this.order.Signal.Limit + slSettings.Points;

                if (stopLossPrice - symbol.Step <= currentPrice)
                {
                    string descr = String.Format("Текущая цена {0} на расстоянии одного шага от stop loss цены {1} стратегии.", currentPrice, stopLossPrice);
                    return(new OrderCancellationRequest(order, descr));
                }

                double takeProfitPrice = this.order.Signal.Limit - tpSettings.Points;

                if (takeProfitPrice + symbol.Step >= currentPrice)
                {
                    string descr = String.Format("Текущая цена {0} на расстоянии одного шага от take profit цены {1} стратегии.", currentPrice, takeProfitPrice);
                    return(new OrderCancellationRequest(order, descr));
                }
            }

            return(null);
        }