Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
        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);
        }