/** Write [DATE] Buy [SYMBOL] [NUMBER]sh @[PRICE] = [VALUE] --> [NUMBER]sh held * */
  public void orderBought(
      TradeOrder order, Date date, StockPosition position, TradingAccount account) {
    double profitOrLoss =
        (order.shares * (order.getExecutedPrice() - position.getCostBasis())
            - account.getTradeFees(order.shares));

    double percent = profitOrLoss / (position.getCostBasis() * order.shares);

    this.writer.println(
        DATE_FORMAT.format(date)
            + " "
            + (position.getShares() != 0 ? "Buy " : "Cover ")
            + order.symbol
            + " "
            + order.shares
            + "sh "
            + "@"
            + DOLLAR_FORMAT.format(order.getExecutedPrice())
            + " = "
            + DOLLAR_FORMAT.format(order.getExecutedValue())
            + " --> "
            + position.getShares()
            + "sh "
            + (position.getShares() <= 0
                ? "left, "
                    + DOLLAR_FORMAT.format(profitOrLoss)
                    + (profitOrLoss > 0
                        ? " (" + PERCENT_FORMAT.format(percent) + " profit)"
                        : profitOrLoss < 0
                            ? " (" + PERCENT_FORMAT.format(percent) + "loss)"
                            : " (even)")
                : "long"));

    this.lastTraceDate = date;
  }
 /** Write [DATE] Buy/Sell [SYMBOL] [NUMBER]sh @[PRICE] CANCELLED (no price on date) * */
 public void orderCancelled(
     TradeOrder order, Date date, StockPosition position, TradingAccount account) {
   String priceString;
   switch (order.getPriceTiming()) {
     case OPEN:
     case CLOSE:
     default:
       priceString = DOLLAR_FORMAT.format(order.projectedPrice);
       break;
     case LIMIT_OR_BELOW:
       priceString = "<=" + DOLLAR_FORMAT.format(order.limit);
       break;
     case LIMIT_OR_ABOVE:
       priceString = ">=" + DOLLAR_FORMAT.format(order.limit);
       break;
   }
   // ATR removed "cancelled order" log. Doesn't make sense when
   // using lots of stop and limit orders that don't fill.
 }