public void testIntraDayLiveBars() { var siv5Minute = new Siv("TestSystem1", "second", "1.0"); var liveSystem = new LiveSystem(siv5Minute, FAST); liveSystem.insertParameter("LeadBars", "0"); var args = arguments(O.list(SYMBOL, SYMBOL2), liveSystem, RunMode.LIVE, typeof(EmptySystem)); var loader = new FakeBarLoader(SYMBOL, SYMBOL2); var simulator = loader.simulator(args, OrderTable.prefix); try { Action <int, int> bar = (close, minutesAfter9) => { var barTime = Dates.minutesAhead(minutesAfter9, Dates.date("2008/09/08 09:00:00")); loader.add(SYMBOL, close, close, close, close, barTime); loader.add(SYMBOL2, close, close, close, close, barTime); simulator.nextBar(); }; Action <Symbol, int, string> doTick = (symbol, price, time) => { O.freezeNow("2008/09/08 " + time); tick(simulator, new Bar(0, price, 0, price, O.now()), symbol); }; bar(5, 0); O.freezeNow("2008/09/08 09:00:00"); simulator.goLive(); doTick(SYMBOL, 26, "09:00:00"); doTick(SYMBOL2, 28, "09:00:00"); doTick(SYMBOL, 25, "09:00:00"); doTick(SYMBOL2, 29, "09:00:00"); simulator.waitForBar(); var system = simulator.theSymbolSystem <EmptySystem>(SYMBOL); var system2 = simulator.theSymbolSystem <EmptySystem>(SYMBOL2); AreEqual(new Bar(26, 26, 25, 25, date("2008/09/08 09:00:00")), system.bar); AreEqual(new Bar(28, 29, 28, 29, date("2008/09/08 09:00:00")), system2.bar); O.freezeNow("2008/09/08 09:00:01"); doTick(SYMBOL, 42, "09:00:01"); doTick(SYMBOL, 57, "09:00:01"); doTick(SYMBOL, 15, "09:00:01"); system.placeOrder(SYMBOL.buy("somethin", Order.market(), 1, FillOrKill.FILL_KILL)); simulator.waitForBar(); // if it blows up in orderFilled here, it filled orders during live intraday bar (incorrect) IsTrue(O.isEmpty(system.allPositions())); AreEqual(new Bar(42, 57, 15, 15, date("2008/09/08 09:00:01")), system.bar); AreEqual(new Bar(28, 29, 28, 29, date("2008/09/08 09:00:00")), system2.bar); AreEqual(3, system.bars.count()); AreEqual(2, system2.bars.count()); } finally { simulator.clearTimer(); } }
public void testEmails() { var abc = new Symbol("RE.TEST.TY.1C"); var slippage = MarketTable.MARKET.fixedSlippage(abc.name); var monitor = new PositionMonitor(LIVE_SYSTEM, O.list(abc, new Symbol("DEF")), "A_TOPIC"); var counter = new PublishCounter("OrderTracker.orderAdded"); var order = abc.buy("Go LONG", new Stop(50), 10, FillOrKill.FILL_KILL).placed(); var trade = new Trade(order, 52, 10, slippage, 1); var position = order.fill(trade); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); monitor.goLive(O.list(position), abc); O.freezeNow("2008/09/22 14:47:04"); LiveOrderEmailsTable.ORDER_EMAILS.insert("S-I-V", "PV", "ALL", "team"); emailer.allowMessages(); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); var message = emailer.sent(); message.hasSubject(@"S\(PV\) Filled Order for RE.TEST.TY.1C - " + O.hostname()); message.hasContent(@"Order.*: Enter long 10 RE.TEST.TY.1C @ 52 STOP\(50.0000000\)"); message.hasContent("Timestamp: 2008/09/22 14:47:04"); message.hasContent("Description: Go LONG"); emailer.clear(); var liveOrders = O.list <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersFilled(LIVE_SYSTEM.id(), abc.name)); HasCount(1, liveOrders); var liveOrder = O.the(liveOrders); AreEqual(10, liveOrder.size()); AreEqual("Enter", liveOrder.entryExit()); AreEqual("long", liveOrder.positionDirection()); AreEqual(liveOrder.id(), counter.getOneAndClear <int>("liveOrderId")); order = position.scaleUpLong("gimme more", new StopLimit(50, 60), 25, FillOrKill.FILL_KILL).placed(); trade = new Trade(order, 55, 25, slippage, 1); order.fill(trade); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); emailer.sent().hasContent(@"Order.*: Scale up long 25 RE.TEST.TY.1C @ 55 STOP_LIMIT\(50.0000000, 60.0000000\)"); emailer.clear(); liveOrders = O.list <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersFilled(LIVE_SYSTEM.id(), abc.name)); HasCount(2, liveOrders); liveOrder = O.first(liveOrders); AreEqual(25, liveOrder.size()); AreEqual("Scale up", liveOrder.entryExit()); AreEqual("long", liveOrder.positionDirection()); order = position.scaleDownLong("gimme more", new Limit(55), 20, FillOrKill.FILL_KILL).placed(); trade = new Trade(order, 55, 20, slippage, 1); order.fill(trade); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); emailer.sent().hasContent(@"Order.*: Scale down long 20 RE.TEST.TY.1C @ 55 LIMIT\(55.0000000\)"); emailer.clear(); order = position.exitLong("Get out", new Market(), OneBar.ONE).placed(); trade = new Trade(order, 40, 15, slippage, 1); order.fill(trade); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); emailer.sent().hasContent(@"Order.*: Exit long 15 RE.TEST.TY.1C @ 40 MARKET"); emailer.disallowMessages(); LiveOrderEmailsTable.ORDER_EMAILS.deleteAll(Clause.TRUE); monitor.positionUpdate(position, trade, PositionMonitor.basicTradeEmail); }