Пример #1
0
  private static String[] registerSemiRandomTrades(StockExchange stockExchange) {
    String[] symbols = new String[] {"TEA", "POP", "ALE", "JIN", "JOE"};
    String[] prices = new String[] {"4.0000", "6.0000", "0.5000", "1.0000", "20.0000"};
    long[] quantities = new long[] {100, 200, 300, 100, 100, 200};
    TradeType[] types = new TradeType[] {BUY, BUY, SELL, SELL, SELL, BUY};

    Random random = new Random(System.nanoTime());
    for (int i = 0; i < symbols.length; i++) {
      for (int j = 0; j < types.length; j++) {
        BigDecimal avgPrice = new BigDecimal(prices[i]);
        double var = avgPrice.doubleValue() * 0.05;
        double price = avgPrice.doubleValue() + (var * random.nextDouble() - var / 2);
        BigDecimal bdPrice =
            new BigDecimal(price).setScale(StockExchange.PRECISION, RoundingMode.HALF_DOWN);

        switch (types[j]) {
          case BUY:
            stockExchange.buy(symbols[i], quantities[i], bdPrice);
            break;
          case SELL:
            stockExchange.sell(symbols[i], quantities[i], bdPrice);
            break;
        }
      }
    }
    return symbols;
  }
 @Test
 public void simulationStatusShouldBeSimulationUninitialised() {
   // given when
   StockExchange stockExchange = new StockExchange();
   // then
   assertEquals(SimulationStatus.SIMULATION_UNINITIALISED, stockExchange.getSimulationStatus());
 }
Пример #3
0
 private static void printStockInfo(StockExchange stockExchange, String[] symbols) {
   System.out.printf("    %7s %7s  %9s\n", "Price", "Yield", "P/E Rat");
   for (int i = 0; i < symbols.length; i++) {
     System.out.printf(
         "%3s %7s %7s%% %9s\n",
         symbols[i],
         stockExchange.calculateStockPrice(symbols[i]),
         stockExchange.calculateDividentYield(symbols[i]).scaleByPowerOfTen(2),
         stockExchange.calculatePERatio(symbols[i]));
   }
   System.out.printf("\n--- All share index: %7s\n", stockExchange.calculateAllShareIndex());
 }
  @Test
  public void simulationStatusShouldBeSimulationFinishedAfterInitialising()
      throws DateTimeParseException, FileNotFoundException, IOException {
    // given
    Mockito.doNothing().when(dataProvider).readDataFromFile(Mockito.anyString());
    Mockito.when(dataProvider.getEarliestDate()).thenReturn(LocalDate.parse("2013-12-30"));
    Mockito.when(dataProvider.getLatestDate()).thenReturn(LocalDate.parse("2013-01-02"));

    // when
    stockExchange.initialise("Test");

    // then
    Mockito.verify(dataProvider).readDataFromFile(Mockito.anyString());
    assertEquals(SimulationStatus.SIMULATION_FINISHED, stockExchange.getSimulationStatus());
  }
  @Test
  public void nextDayShouldIncrementDateAndCallGetStockByDate()
      throws DateTimeParseException, FileNotFoundException, IOException {
    // given
    Mockito.doNothing().when(dataProvider).readDataFromFile(Mockito.anyString());
    Mockito.when(dataProvider.getEarliestDate()).thenReturn(LocalDate.parse("2013-01-02"));
    Mockito.when(dataProvider.getLatestDate()).thenReturn(LocalDate.parse("2013-01-07"));
    Mockito.when(dataProvider.getStocksByDate(Mockito.any()))
        .thenReturn(
            Arrays.asList(
                new Stock("TPSA", LocalDate.parse("2013-01-03"), new BigDecimal("12.13"))));
    stockExchange.initialise("Test");

    // when
    stockExchange.nextDay();

    // then
    Mockito.verify(dataProvider).getStocksByDate(LocalDate.parse("2013-01-03"));
    assertEquals(SimulationStatus.SIMULATION_NOT_FINISHED, stockExchange.getSimulationStatus());
  }
Пример #6
0
  @Test
  public void testAddGetAndRemoveStock() {

    // First we will create an instance of our stock exchange class
    StockExchange myStockExchange = new StockExchange();

    // The stock exchange has no stocks yet so this should return null
    assertNull(myStockExchange.getStock("TEA"));

    // Let's add one type of stock
    myStockExchange.addStock(
        "TEA",
        StockElement.StockTypes.COMMON,
        new BigDecimal(0),
        new BigDecimal(0),
        new BigDecimal(100));

    // And now the stock must exist
    assertNotNull(myStockExchange.getStock("TEA"));

    // These two tests are just to ensure we are retrieving the right element, the test of ensuring
    // all the values are correct when created is being done in the StockElementTest class
    assertEquals(
        "Expecting the stock symbol of TEA to be correct ",
        "TEA",
        myStockExchange.getStock("TEA").getStockSymbol());
    assertEquals(
        "Expecting the par value of TEA to be correct ",
        0,
        myStockExchange.getStock("TEA").getParValue().compareTo(new BigDecimal("100")));

    myStockExchange.removeStock("TEA");

    // The TEA stock should no longer exist
    assertNull(myStockExchange.getStock("TEA"));
  }
Пример #7
0
  @Test
  public void testCalculateGBCEAllShareIndex() {

    // First we will create an instance of our stock exchange class
    StockExchange myStockExchange = new StockExchange();

    // To start this test we will had the stocks from the example table
    myStockExchange.addStock(
        "TEA",
        StockElement.StockTypes.COMMON,
        new BigDecimal(0),
        new BigDecimal(0),
        new BigDecimal(100));
    myStockExchange.addStock(
        "POP",
        StockElement.StockTypes.COMMON,
        new BigDecimal(8),
        new BigDecimal(0),
        new BigDecimal(100));
    myStockExchange.addStock(
        "ALE",
        StockElement.StockTypes.COMMON,
        new BigDecimal(23),
        new BigDecimal(0),
        new BigDecimal(60));
    myStockExchange.addStock(
        "GIN",
        StockElement.StockTypes.PREFERRED,
        new BigDecimal(8),
        new BigDecimal(2),
        new BigDecimal(100));
    myStockExchange.addStock(
        "JOE",
        StockElement.StockTypes.COMMON,
        new BigDecimal(13),
        new BigDecimal(0),
        new BigDecimal(250));

    // If there are no trades available we will receive null from the calculateGBCEAllShareIndex
    // method, this is by design and can be changed
    assertNull(
        "GBCE All share index is null if no trades are available",
        myStockExchange.calculateGBCEAllShareIndex());

    // now let's add some trades for each of them to set their value
    myStockExchange
        .getStock("TEA")
        .addTradeAction(100, StockTradeAction.actionTypes.BUY, new BigDecimal("80"));
    myStockExchange
        .getStock("TEA")
        .addTradeAction(100, StockTradeAction.actionTypes.BUY, new BigDecimal("90"));
    // if this is working well the stock value for TEA should be 85
    assertEquals(
        "TEA stock price is correct ",
        0,
        myStockExchange.getStock("TEA").calculateStockPrice().compareTo(new BigDecimal("85")));

    myStockExchange
        .getStock("POP")
        .addTradeAction(200, StockTradeAction.actionTypes.BUY, new BigDecimal("1"));
    myStockExchange
        .getStock("POP")
        .addTradeAction(200, StockTradeAction.actionTypes.BUY, new BigDecimal("7"));
    // if this is working well the stock value for POP should be 4
    assertEquals(
        "POP stock price is correct ",
        0,
        myStockExchange.getStock("POP").calculateStockPrice().compareTo(new BigDecimal("4")));

    assertEquals(
        "GBCE All share index is for TEA and POP is correct ",
        0,
        myStockExchange.calculateGBCEAllShareIndex().compareTo(new BigDecimal("18.439")));

    // now lets add some trades to the other stocks
    myStockExchange
        .getStock("ALE")
        .addTradeAction(50, StockTradeAction.actionTypes.BUY, new BigDecimal("30"));
    myStockExchange
        .getStock("ALE")
        .addTradeAction(150, StockTradeAction.actionTypes.BUY, new BigDecimal("90"));
    // and confirm this value is correct as well
    assertEquals(
        "ALE stock price is correct ",
        0,
        myStockExchange.getStock("ALE").calculateStockPrice().compareTo(new BigDecimal("75")));

    // Since we only have one trade for each of the following stocks their value will be
    // respectively GIN = 20 and JOE = 35
    myStockExchange
        .getStock("GIN")
        .addTradeAction(200, StockTradeAction.actionTypes.BUY, new BigDecimal("20"));
    myStockExchange
        .getStock("JOE")
        .addTradeAction(200, StockTradeAction.actionTypes.BUY, new BigDecimal("35"));

    // 5th root of 17850000 (85*35*20*75*4) = 28.205 so lets see if our calculations are correct
    assertEquals(
        "GBCE All share index is correct ",
        new BigDecimal("28.205"),
        myStockExchange.calculateGBCEAllShareIndex());
  }