def test_remove_trade(self):
     stock_exchange = StockExchange('test')
     Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange)
     trade = TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130',
                         '2017-02-05 23:14:39')
     trade1 = TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150',
                          '2017-02-05 22:14:39')
     stock_exchange.remove_trade(trade)
     stock_exchange.remove_trade(trade)
     stock_exchange.remove_trade(trade1)
     stock_exchange.remove_trade(trade1)
 def test_vw_stock_price_calculator1(self):
     stock_exchange = StockExchange('test')
     Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange)
     TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130',
                 '2017-01-05 21:14:39')
     TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150',
                 '2017-01-05 22:14:39')
     TradeRecord(stock_exchange, 'GIN', '200', 'sell', '120',
                 '2017-01-05 23:14:39')
     volume_weighted_price = stock_exchange.vw_stock_price_calculator('GIN')
     self.assertIsNone(volume_weighted_price)
 def test_vw_stock_price_calculator(self):
     stock_exchange = StockExchange('test')
     Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange)
     TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130')
     TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150')
     TradeRecord(stock_exchange, 'GIN', '200', 'sell', '120')
     stock_exchange.vw_stock_price_calculator('TEA')
     stock_exchange.vw_stock_price_calculator('GIN', '10')
     stock_exchange.vw_stock_price_calculator('GIN', 'test')
     volume_weighted_price = stock_exchange.vw_stock_price_calculator('GIN')
     self.assertEqual(volume_weighted_price, 138.0)
 def test_add_new_trade(self):
     stock_exchange = StockExchange('test')
     stock = Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange)
     stock_exchange.add_new_trade(
         TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150',
                     '2017-02-05 22:14:39'))
     stock_exchange.add_new_trade(
         TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130',
                     '2017-02-05 23:14:39'))
     stock_exchange.remove_existing_stock(stock)
     stock_exchange.add_new_trade(
         TradeRecord(stock_exchange, 'GIN', '200', 'sell', '150',
                     '2017-02-05 23:15:39'))
예제 #5
0
def add_trade():
    """
    A POST rest wrapper for StockExchange.add_new_trade()
    Example usage: {
                    "stock_symbol": "POP",
                    "quantity": "300",
                    "trade_type": "buy",
                    "traded_price": "150",
                    "time_stamp": "2017-02-04 23:30:39"
                    }
    """
    check_stock_exchange()

    required_params = ['stock_symbol', 'quantity', 'trade_type', 'traded_price']
    json_request = request.json

    if json_request:
        # Checking if all required params were in the request
        if all([True if required_param in json_request else False for required_param in required_params]):
            # Testing if the underlying code in StockExchange.add_new_trade() executed successfully.
            try:
                result = ''
                # Stock can be created either with a fixed dividend or not.
                if len(json_request) < 5:
                    result = stock_exchange.add_new_trade(
                        TradeRecord(stock_exchange, json_request['stock_symbol'], json_request['quantity'],
                                    json_request['trade_type'], json_request['traded_price']))
                elif len(json_request) == 5 and 'time_stamp' in json_request:
                    result = stock_exchange.add_new_trade(
                        TradeRecord(stock_exchange, json_request['stock_symbol'], json_request['quantity'],
                                    json_request['trade_type'], json_request['traded_price'],
                                    json_request['time_stamp']))
                else:
                    abort(400, 'Fifth parameter must be "time_stamp".')
                if result:
                    return jsonify({'Added trade for stock': json_request['stock_symbol']}), 200
                else:
                    abort(400, 'Please first add stock: {} in stock exchange. Then add a trade for it.'.format(
                        json_request['stock_symbol']))
            except TypeError as error:
                abort(500, error)
        else:
            missing_params = set(required_params).difference(json_request)
            abort(400, 'Parameters {} needs to be in the request'.format(list(missing_params)))
    else:
        abort(400)
 def test_time_stamp(self):
     trade = TradeRecord(StockExchange('test'), 'TEA', '500', 'sell', '150',
                         '2017-02-05 22:14:39')
     self.assertEqual(trade.stock_symbol, 'TEA')
     self.assertEqual(trade.quantity, 500.0)
     self.assertEqual(trade.trade_type, 'sell')
     self.assertEqual(trade.traded_price, 150)
     self.assertEqual(
         trade.time_stamp,
         datetime.strptime('2017-02-05 22:14:39', '%Y-%m-%d %H:%M:%S'))
     self.assertTrue(trade.created_successfully)
 def test_simple(self):
     trade = TradeRecord(StockExchange('test'), 'TEA', '500', 'sell', '150')
     time_stamp = datetime.strptime(
         str(datetime.now())[:-10], '%Y-%m-%d %H:%M')
     self.assertEqual(trade.stock_symbol, 'TEA')
     self.assertEqual(trade.quantity, 500.0)
     self.assertEqual(trade.trade_type, 'sell')
     self.assertEqual(trade.traded_price, 150)
     self.assertEqual(str(trade.time_stamp)[:-3],
                      str(time_stamp)[:-3])  # removing seconds
     self.assertTrue(trade.created_successfully)
 def test_exceptions(self):
     trade = TradeRecord('test', 'TEA', 'test1', 'test2', 'test3', 'test4')
     self.assertFalse(trade.created_successfully)
예제 #9
0
def add_trade(from_='add_trade'):
    """
    A console wrapper for TradeRecord
    :param from_: An optional argument for keeping track which method called add_trade()
    :return: Recursion or add_stock()
    """
    create_exchange_market()

    user_provided_args = ''
    if stock_exchange.registered_stocks:
        user_prompt = 'Please provide trade information for addition in the following format:\nstock symbol, ' \
                      'quantity, trade type, traded price, time stamp (Y-m-d H:M:S or empty to use current time.), '
        # Normal case. User Asked for add_trade().
        if from_ == 'add_trade':
            user_provided_args = raw_input(user_prompt + ' or \'q\'to quit\n:')
        # Case when add_trade() is called from remove_trade() -> add_trade()-> add_stock()-> add_trade()->remove_trade()
        elif from_ == 'remove_trade':
            user_provided_args = raw_input(user_prompt + '\n"remove" to start removing trades or \'q\'to quit\n:')
            if user_provided_args.strip() == 'remove':
                remove_trade()
        # Case when add_trade() is called from calculate_volume_weighted_price()-> add_trade()-> add_stock()->
        # add_trade()-> calculate_volume_weighted_price()
        elif from_ == 'volume_weighted_price':
            user_provided_args = raw_input(
                user_prompt + '\n"vw" to calculate the volume weighted price or \'q\'to quit\n:')
            if user_provided_args.strip() == 'vw':
                calculate_volume_weighted_price()
        # Case when add_trade() is called from calculate_all_share_index() -> add_trade() -> add_stock()-> add_trade()
        # -> calculate_all_share_index()
        elif from_ == 'all_share_index':
            user_provided_args = raw_input(
                user_prompt + '\n"index" to calculate all share index or \'q\'to quit\n:')
            if user_provided_args.strip() == 'index':
                calculate_volume_weighted_price()
        exit_program(user_provided_args)

        user_provided_args = [arg.strip() for arg in user_provided_args.split(',') if arg]

        # Checking if the trade the user wants to add is about an already registered stock.
        if stock_exchange.is_stock_registered(user_provided_args[0]):
            # TradeRecord can be created either with user provided or system provided timestamp.
            try:
                if len(user_provided_args) < 5:
                    TradeRecord(stock_exchange, user_provided_args[0], user_provided_args[1], user_provided_args[2],
                                user_provided_args[3])
                elif len(user_provided_args) == 5:
                    TradeRecord(stock_exchange, user_provided_args[0], user_provided_args[1], user_provided_args[2],
                                user_provided_args[3], user_provided_args[4])
            except TypeError as error:
                print error
                # Retrying
                return add_trade(from_)

            # Recursion to add more trades.
            return add_trade(from_)
        # The trade the user wants to add is about a non existing stock. prompting the user to add it.
        else:
            add_stock('add_trade')
    # First time running add_trade(). Need to first add stocks.
    else:
        print 'Stock Exchange Empty. Please register some stocks first.'
        add_stock(from_)