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