public void testBasicFunctionality() { Objects.freezeNow("2009/06/25 12:00:00"); var timers = Objects.timerManager(); timers.isInterceptingTimersForTest = true; var heart = new Heartbeat(JMSTestCase.TEST_BROKER, "test.heartbeat", 2000); var fieldsResult = new Fields[] { null }; heart.subscribe(fields => { Bomb.unlessNull(fieldsResult[0], () => "have " + fieldsResult[0] + " but received " + fields); fieldsResult[0] = fields; }); timers.intercept("2009/06/25 12:00:00", "first beat"); heart.initiate(); timers.intercept("2009/06/25 12:00:02", "second beat"); timers.runTimers("2009/06/25 12:00:00"); Objects.wait(() => fieldsResult[0] != null); AreEqual(Objects.hostname(), fieldsResult[0].get("Hostname")); fieldsResult[0] = null; timers.intercept("2009/06/25 12:00:04", "third beat"); timers.runTimers("2009/06/25 12:00:02"); Objects.wait(() => fieldsResult[0] != null); }
public void testTimerSequence() { Objects.freezeNow("2008/11/11 11:11:11"); double currentState = -1; var sequence = new TimerSequence <double>(d => { currentState = d; }); sequence.add(1.1, 500); sequence.add(2.2, 500); sequence.add(3.3); IsFalse(sequence.running()); // starts in 1.1 sequence.startAsOf(O.now()); O.wait(() => currentState == 1.1); IsTrue(sequence.running()); Objects.advanceNow(500); O.wait(() => currentState == 2.2); Objects.advanceNow(500); O.wait(() => currentState == 3.3); IsFalse(sequence.running()); sequence.startAsOf(O.now()); O.wait(() => currentState == 1.1); Objects.advanceNow(500); O.wait(() => currentState == 2.2); sequence.startAsOf(O.now()); O.wait(() => currentState == 1.1); Objects.advanceNow(500); O.wait(() => currentState == 2.2); Objects.advanceNow(500); O.wait(() => currentState == 3.3); // starts in 2.2 var asOf = O.now(); Objects.advanceNow(500); sequence.startAsOf(asOf); O.wait(() => currentState == 2.2); Objects.advanceNow(500); O.wait(() => currentState == 3.3); // starts in 3.3 asOf = O.now(); currentState = -1; Objects.advanceNow(1000); sequence.startAsOf(asOf); O.wait(() => currentState == 3.3); }
public void testMarketOnClose() { var in1 = buy("in", Order.market(), OnClose.ON_CLOSE); bar(1, 4, 2, 3, ONE_LONG); hasNewTrades(new Trade(in1, 3, 1, slippage(), 1)); var out1 = exit("out", Order.market(), OnClose.ON_CLOSE); O.freezeNow("2009/01/01 13:59:59"); tick(4.5, ONE_LONG); noNewTrades(); O.freezeNow("2009/01/01 14:00:00"); tick(3.5); hasNewTrades(new Trade(out1, 3.5, 1, slippage(), 1)); buy("in2", Order.market(), OnClose.ON_CLOSE); tick(3.5); noNewTrades(); }
public void testSummary() { var gui = startGui(); var systemId = 1234; var topic = new Topic(CloudMonitor.progressTopic(systemId)); gui.setSystemId(systemId); gui.doAllWork(); O.freezeNow("2008/02/03 02:00:00"); topic.send(new Dictionary <string, object> { { "RunsComplete", 1000 }, { "TotalRuns", 10000 }, { "RunsPerMinute", 10 }, }); O.wait(() => gui.runsComplete() == 1000); AreEqual(date("2008/02/03 17:00:00"), gui.completionTime()); AreEqual(10000, gui.totalRuns()); }
public void testHideShowZeros() { O.freezeNow("07/01/2009"); MarketTickersTable.TICKERS.C_BLOOMBERG.updateOne(MarketTickersTable.TICKERS.C_MARKET.@is("FV.1C"), "anything"); MarketTickersTable.TICKERS.C_BLOOMBERG.updateOne(MarketTickersTable.TICKERS.C_MARKET.@is("TU.1C"), "TOE"); var nday20 = new Topic("TOMAHAWK.NDayBreak.1.0.daily.BFBD20.FV.1C.optimalPosition"); var tuTopic = LiveWatcher.tickerTopic("QF.NDayBreak", "TOE", "Comdty"); var fakeGui = new FakeWatcherGui(); var watcher = new LiveWatcher(fakeGui); watcher.initialize(); watcher.requireVisible(0); publishAim(tuTopic, "QF.NDayBreak", "TOE", "COMDTY", 5, "2009/07/01 14:00:03"); fakeGui.waitMatches(1, watcher.visible); publishTomahawk(nday20, 11, "2009/07/01 14:00:04"); fakeGui.waitMatches(2, watcher.visible); watcher.setFilterZeroes(false); fakeGui.wait(() => watcher.visible() > 10); }
public void testCanPopulateStuffFromSystemIdLive() { O.freezeNow("2009/04/28"); var gui = new FakeResearchGUI(); gui.setSystemId("39"); gui.loadSystem(); gui.doAllWork(); var parameters = gui.parameters(); AreEqual(39, parameters.get <int>("systemId")); AreEqual(50, parameters.get <int>("LeadBars")); AreEqual(30, parameters.get <int>("BreakDays")); IsTrue(gui.runNumberEnabled()); IsFalse(gui.runInNativeCurrency()); var markets = O.convert(O.list <Market>(SystemDetailsTable.DETAILS.details(39).liveSystem().markets()), m => m.name()); AreEqual(O.list(markets), gui.markets()); }
[Test] public void testOneSubscribe() { OrderTable.prefix = "PREFIX"; O.freezeNow("2009/07/10 13:00:00"); var liveSystem = OneSystemTest <EmptySystem> .fakeLiveSystem(new Parameters(), false); liveSystem.removeAllLiveMarkets(); insertMarket("FOO", 0); liveSystem.addLiveMarket("FOO", "2009/07/07", null); insertMarket("BAR", 0); liveSystem.addLiveMarket("BAR", "2009/07/07", null); var fooTopic = new QTopic("PREFIX.TestSystem1.1.0.daily.Slow.FOO.heartbeat"); O.timerManager().isInterceptingTimersForTest = true; O.timerManager().intercept("2009/07/10 13:00:00", "gui update"); var map = new StatusTreeMap(new FakeStatusMapGUI(), O.list(liveSystem)); map.setIsEqualSizes(false); var systemNode = O.the(map.nodes()); AreEqual("TestSystem1", systemNode.text); var pvNode = O.the(systemNode.children()); AreEqual("Slow", pvNode.text); var symbolNodes = O.dictionaryFromValues(O.convert(pvNode.children(), child => child as LiveMarketNode), child => child.id); AreEqual(1d, symbolNodes["FOO"].size); AreEqual(0, symbolNodes["FOO"].ticksReceived); AreEqual(1d, symbolNodes["BAR"].size); var message = new Fields(); message.put("timestamp", "2009/07/10 12:59:59"); message.put("lastTickProcessed", "2009/07/10 12:59:58"); message.put("ticksReceived", "200"); message.put("hostname", "hullabaloo"); fooTopic.send(message); Objects.timerManager().intercept("2009/07/10 13:00:01", "second gui update"); O.timerManager().runTimers("2009/07/10 13:00:00"); waitMatches(200d, () => symbolNodes["FOO"].ticksReceived); // you just }
public void testFerretOrderSimFilled() { O.freezeNow("2009/03/03"); insertSubmitted(39, SYMBOL, "test", "f2"); var id = insertSubmitted(39, SYMBOL, "test", "f3"); insertSubmitted(39, SYMBOL, "test", "f4"); insertSubmitted(39, SYMBOL, "test", "f5"); var gui = startGui(); gui.setMarket(SYMBOL); gui.wait(populateCompleted); var filledAt = Dates.date("1999/09/09 09:09:09"); LiveOrders.ORDERS.order(id).updateFill(12345, filledAt); publish(id); var row = Util.Objects.nth(gui.tracker.orderTable().rows(), 3); AreEqual(id.ToString(), row["liveOrderId"]); gui.waitMatches("12345.000000", () => row["simFillPrice"]); }
public void testSystemSelectPopulatesPvAndMarketCombo() { O.freezeNow("2009/07/15"); var gui = startGui(); gui.tracker.systemUpdated(); gui.doAllWork(); gui.selectedSystem = SYSTEM; gui.tracker.systemUpdated(); gui.wait(populateCompleted); IsTrue(gui.marketChoices.Contains("TY.1C")); IsTrue(gui.marketChoices.Contains("CD.1C")); IsFalse(gui.marketChoices.Contains("TRI.CNAIG5")); IsTrue(gui.pvChoices.Contains("BFBD30")); IsFalse(gui.pvChoices.Contains("CDXMV20")); gui.selectedPv = "BFBD30"; gui.tracker.pvUpdated(); gui.wait(populateCompleted); IsTrue(gui.marketChoices.Contains("TY.1C")); IsFalse(gui.marketChoices.Contains("CD.1C")); }
public void testIsolatedTomahawkMessages() { O.freezeNow("07/01/2009"); MarketTickersTable.TICKERS.C_BLOOMBERG.updateOne(MarketTickersTable.TICKERS.C_MARKET.@is("FV.1C"), "anything"); var nday20 = new Topic("TOMAHAWK.NDayBreak.1.0.daily.BFBD20.FV.1C.optimalPosition"); var nday30 = new Topic("TOMAHAWK.NDayBreak.1.0.daily.BFBD30.FV.1C.optimalPosition"); var fakeGui = new FakeWatcherGui(); var watcher = new LiveWatcher(fakeGui); watcher.initialize(); watcher.eachRow(row => AreEqual(row["tomahawk"], 0)); watcher.requireContains("QF.NDayBreak", "anything Comdty"); var fv1C = new Symbol("FV.1C"); Action <double> waitForCount = expected => fakeGui.waitMatches(expected, () => watcher.row("QF.NDayBreak", fv1C)["tomahawk"]); publishTomahawk(nday20, 3, "2009/07/01 14:00:00"); waitForCount(3); publishTomahawk(nday20, 2, "2009/07/01 14:00:01"); waitForCount(2); publishTomahawk(nday30, 3, "2009/07/01 14:00:03"); waitForCount(5); }
public void testNBarFade() { O.freezeNow("2009/03/10"); var symbol = new Symbol("RE.TEST.TY.1C", 1000); var args = new SystemArguments(symbol, new Parameters { { "systemId", 133486 }, { "RunMode", (double)RunMode.RIGHTEDGE }, { "LeadBars", 50 }, { "ATRLen", 5 }, { "nDays", 6 }, { "nATRentry", 1.5 }, { "exitATRmultiple", 1 }, { "stopAfStep", 0.02 }, { "stopAfMax", 0.2 }, { "entryBarWindow", 2 }, { "closeBetter", 1 }, { "riskDollars", 100000000 } }); var loader = new SystemDbBarLoader(Interval.DAILY, O.list(symbol), date("2003/01/01")); var simulator = new Simulator(args, loader, OrderTable.prefix); simulator.processBars(); }
public void testStoWorks() { LogC.setOut("testStoWorks", @"C:\logs\localCloud.log", false); LogC.useJavaLog = true; const int systemId = 178114; var curveFile = new QFile(@"V:\Market Systems\General Market Systems\Benchmark\20080923\CurvesBin\Benchmark_1.0_daily_RE.TEST.TY.1C/run_678.bin"); curveFile.deleteIfExists(); var testQueue = new Queue("TEST.LocalCloud"); O.timerManager().isInterceptingTimersForTest = true; O.freezeNow("2009/06/22 03:00:00"); O.timerManager().intercept("2009/06/22 03:00:00", "heartbeat"); O.timerManager().intercept("2009/06/22 03:00:03", "second heartbeat"); var server = new STOServer(systemId, 2); var fired = false; server.heart.subscribe(fields => { fired = true; AreEqual(fields.get("Hostname"), O.hostname()); AreEqual(fields.get("ServerIndex"), 2); }); server.subscribe(testQueue); server.heart.initiate(); IsFalse(fired); O.timerManager().runTimers("2009/06/22 03:00:00"); O.wait(() => fired); MetricResults metrics = null; O.timerManager().intercept("2009/06/22 03:00:00", "client heartbeat"); new STOClient(SystemDetailsTable.DETAILS.details(systemId), testQueue).metrics(678, results => metrics = results); O.wait(100, 1000, () => metrics != null); AreEqual(-1953125.00, metrics["RE.TEST.TY.1C"]["QNetProfit"]); curveFile.requireExists(); }
public void testTick() { O.freezeNow("2008/08/08 11:00:00"); StatusTracker.LATE_MILLIS = 500; StatusTracker.CRASHED_MILLIS = 500; var tracker = startGui(); AreEqual(SystemStatus.UNKNOWN, gui.tickStatus(system)); message("2008/08/08 11:00:00", "2008/08/08 10:00:00"); waitForTickStatus(SystemStatus.GREEN); O.advanceNow(1000); Log.setFile(@"C:\foo.log"); SYMBOL.publish(new Bar(0, 0, 0, 0, date("2008/08/08 11:00:01"))); O.wait(() => tracker.tickTimers[system].running()); O.advanceNow(500); waitForTickStatus(SystemStatus.YELLOW); O.advanceNow(500); waitForTickStatus(SystemStatus.RED); O.advanceNow(59000); message("2008/08/08 11:01:00", "2008/08/08 11:00:01"); waitForTickStatus(SystemStatus.GREEN); // lastTickProcessed should be the time on the tick }
public void testOrderSubmission() { O.freezeNow("2008/08/08 08:08:08"); var order1 = buy("order 1", stop(99.50), 100, oneBar()); symbolSystem.order(order1); processBar(1, 3, 1, 2); hasOrders(order1); requireFerretHasOrders(); processTick(2.5); requireFerretHasOrders(order1); emailer.allowMessages(); var submitted = O.the <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersSubmitted(systemId, symbol().name)); AreEqual("Enter", submitted.entryExit()); fill(order1, 123); submitted = O.the <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersSubmitted(systemId, symbol().name)); var filled = O.the(O.list <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersFilled(systemId, symbol().name))); AreEqual(123.0, filled.price().doubleValue()); AreEqual(submitted, filled); var order2 = sell("order 2", stop(97.50), 10, oneBar()); symbolSystem.order(order2); processTick(3.0); requireFerretHasOrders(order1, order2); var order3 = sell("market", market(), 50, oneBar()); symbolSystem.order(order3); processTick(3.0); requireFerretHasOrders(order1, order2); symbolSystem.order(symbolSystem.position().exit("exit 1", market(), onTheClose())); processTick(4.0); submitted = O.first(O.list <LiveOrders.LiveOrder>(LiveOrders.ORDERS.ordersSubmitted(systemId, symbol().name))); AreEqual("Exit", submitted.entryExit()); }
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); }