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.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); }
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); }
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); }
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); }
private void SetStopLossOrderSettings() { try { this.spSettings = this.tradingData. Get <IEnumerable <StopPointsSettings> >(). SingleOrDefault(i => i.Strategy.Id == this.strategyHeader.Id); } catch { this.spSettings = null; } }
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); }
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); }
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); }
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()); }
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); }
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); }
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); }