示例#1
0
def parse_command(s: str):
    if cli_handler is None:
        __setup_handler()

    lines = s.strip().split(';')
    for l in lines:
        args = l.strip().split(' ')
        nargs = len(args)

        found = False

        print('Searching for {}'.format(args[0]))
        for c in commands:
            if args[0] == c.title:
                print('Found {}'.format(args[0]))
                data = c.parse(args[1:] if len(args) > 1 else [])
                c.handle(cli_handler, data)
                found = True

        if not found:
            print('{} not found, executing as json message'.format(args[0]))
            if nargs == 1:
                cli_handler.send(Message(args[0]))
            elif nargs == 2:
                cli_handler.send(Message(args[0], args[1]))
            elif nargs == 3:
                cli_handler.send(Message(args[0], args[1],
                                         json.loads(args[2])))
示例#2
0
 def check_triggers(self):
     for i, s in enumerate(self.stocks):
         if self.limits[s.acronym].check_buy(self.history[i].bid_price,
                                             s.ask_price):
             self.handler.send(Message('trade_control', 'buy', s))
         elif self.limits[s.acronym].check_sell(self.history[i].ask_price,
                                                s.bid_price):
             self.handler.send(Message('trade_control', 'sell', s))
 def test_config_filename(self):
     self.client.send(
         Message('json_config', 'filename', '/tmp/robin_test_2/'))
     self.client.send(Message('json_request', 'save'))
     time.sleep(1)
     self.assertTrue(
         path.exists(path.join('/tmp/robin_test_2/', state_save_file)),
         'Modifying filename, configures to save in new location')
 def test_remove_stock(self):
     self.client.send(Message('vault_request', 'add_monitor',
                              Stock('AAPL')))
     self.client.send(
         Message('vault_request', 'remove_monitor', Stock('AAPL')))
     time.sleep(0.5)
     names = StockVault.get_stock_names()
     self.assertTrue('AAPL' not in names,
                     'A removed stock should not appear in the database')
 def test_config_count(self):
     self.client.send(Message('json_config', 'count', 2))
     second_uut = TestQSM('test2')
     second_uut.start()
     self.client.send(Message('json_request', 'save'))
     time.sleep(1)
     data = JSONController.load(output_directory)
     self.assertTrue(
         len(data) == 3,
         "Modifying the count value should've generated three controllers, not {}"
         .format(len(data)))
示例#6
0
 def sell_stock(self, s: ManagedStock):
     self.balance += s.bid_price * s.shares
     self.handler.send(
         Message('trade_balance_update', self.name,
                 BalanceUpdate(self.balance)))
     self.handler.send(
         Message(
             'trade', self.name,
             StockTransaction(s.acronym, False, s.bid_price, s.ask_price,
                              s.shares)))
     print("Selling {}".format(s))
示例#7
0
 def buy_stock(self, s: ManagedStock):
     if self.balance >= s.ask_price * s.shares:
         self.handler.send(
             Message('trade_balance_update', self.name,
                     BalanceUpdate(self.balance)))
         self.handler.send(
             Message(
                 'trade', self.name,
                 StockTransaction(s.acronym, True, s.bid_price, s.ask_price,
                                  s.shares)))
         print("Buying {}".format(s))
     else:
         print('Rejecting transaction, insufficient funds')
 def handle(self, handler: MessageHandler, data: dict) -> None:
     handler.send(
         Message(
             'vault_request', 'add_stock',
             ManagedStock(data['acronym'],
                          last_price=float(data['price']),
                          shares=int(data['shares']))))
示例#9
0
 def all_msg(self, msg: Message):
     if msg.msg == 'save':
         self.handler.send(Message('json_update', self.name, {'dtype': str(type(self).__name__),
                                                              'package': inspect.getmodulename(
                                                                  inspect.getfile(self.__class__)),
                                                              'path': str(inspect.getfile(self.__class__)),
                                                              'data': self.dict}))
示例#10
0
 def test_add_stock(self):
     self.client.send(Message('vault_request', 'add_monitor',
                              Stock('AAPL')))
     time.sleep(0.5)
     names = StockVault.get_stock_names()
     print(names)
     self.assertTrue('AAPL' in names,
                     'An inserted stock should appear in the database')
示例#11
0
 def test_get_info(self):
     self.client.send(Message('vault_request', 'add_monitor',
                              Stock('AAPL')))
     time.sleep(0.1)
     info = StockVault.get_info('AAPL')
     self.assertTrue(
         info.acronym == 'AAPL',
         'Inserted database element should be able to be found by info grab'
     )
 def test_save(self):
     self.client.send(Message('json_request', 'save'))
     time.sleep(1)
     self.assertTrue(
         path.exists(path.join(output_directory, state_save_file)),
         'Saving generates a state file')
     self.assertTrue(
         path.getsize(path.join(output_directory, state_save_file)) > 0,
         'Saving should populate file')
    def get_stock_ids() -> list:
        if StockVault.instance is None:
            StockVault.setup_instance()

        StockVault.instance.req_lock.acquire()
        print('Acquired lock')
        StockVault.instance.requestq.put(Message('request', 'get_stock_ids'))
        print('Waiting for response')
        results = StockVault.instance.req_out.get()
        StockVault.instance.req_lock.release()

        return results
    def add_stock(s: ManagedStock) -> int:
        if StockVault.instance is None:
            StockVault.setup_instance()

        StockVault.instance.req_lock.acquire()
        # print('Acquired lock')
        StockVault.instance.requestq.put(Message('request', 'add_stock', s))
        # print('Waiting for response')
        result = StockVault.instance.req_out.get()
        StockVault.instance.req_lock.release()

        return result
    def get_info(acronym: str) -> Stock:
        if StockVault.instance is None:
            StockVault.setup_instance()

        StockVault.instance.req_lock.acquire()
        # print('Acquired lock')
        StockVault.instance.requestq.put(
            Message('request', 'get_info', acronym))
        # print('Waiting for response')
        result = StockVault.instance.req_out.get()
        StockVault.instance.req_lock.release()

        return result
    def test_load(self):
        self.client.send(Message('json_request', 'save'))
        time.sleep(1)
        data = JSONController.load(output_directory)
        self.assertTrue(
            len(data) == 2, "Loading should've created two controllers")

        found = False
        for d in data:
            if d.name == 'test':
                found = True

        self.assertTrue(found,
                        "TestQSM should've been loaded by the controller")
示例#17
0
 def update_prices(self):
     for s in self.stocks:
         quote = self.adapter.get_quote(s.acronym)
         prev_ask = s.ask_price
         prev_bid = s.bid_price
         s.ask_price = float(quote['ask_price'])
         s.bid_price = float(quote['bid_price'])
         print('Updated {}'.format(s))
         if prev_ask != s.ask_price or prev_bid != s.bid_price:
             self.handler.send(
                 Message(
                     'monitor_update', self.name,
                     StockUpdate(-1, s.acronym, s.ask_price,
                                 int(quote['ask_size']), s.bid_price,
                                 int(quote['bid_size']))))
     self.append_state('check_triggers')
    def __add_stock(self, msg: Message):
        if self.is_connected:
            monitors = execute_read_query(self.connection,
                                          'select acronym from Stocks')
            monitors = [m[0] for m in monitors] if monitors is not None else []
            if msg.payload.acronym not in monitors:
                print('Adding monitor for {} as well'.format(
                    msg.payload.acronym))
                self.requestq.put(
                    Message('vault_request', 'add_monitor',
                            Stock(msg.payload.acronym)))

            ins_str = setup_record_insertion('ManagedStocks',
                                             ManagedStock.get_tuple_names(),
                                             [msg.payload.to_tuple_str()])
            execute_query(self.connection, ins_str)
    def add_stocks(self, msg: Message):
        if self.is_connected:
            monitors = execute_read_query(self.connection,
                                          'select acronym from Stocks')
            monitors = [m[0] for m in monitors] if monitors is not None else []
            needs_adding = []
            for a in msg.payload:
                if a.acronym not in monitors:
                    print('Adding monitor for {} as well'.format(a.acronym))
                    needs_adding.append(Stock(a.acronym))
            self.requestq.put(
                Message('vault_request', 'add_monitors', needs_adding))

            ins_str = setup_record_insertion(
                'ManagedStocks', ManagedStock.get_tuple_names(),
                [r.to_tuple_str() for r in msg.payload])
            execute_query(self.connection, ins_str)
 def handle(self, handler: MessageHandler, data: dict) -> None:
     trans = StockTransaction(data['id'], '', True, data['price'],
                              data['shares'])
     trans.date = dt.datetime.strptime(data['date'], date_format)
     handler.send(Message('vault_request', 'add_transaction', trans))
示例#21
0
 def handle(self, handler: MessageHandler, data: dict) -> None:
     handler.send(Message('all', 'load'))
 def exit_state(self):
     self.handler.send(Message('EXIT'))
     for m in self.modules:
         m.join()
     self.handler.join()
     super().exit_state()
示例#23
0
 def handle(self, handler: MessageHandler, data: dict) -> None:
     if data['title'] == 'force':
         handler.send(Message('monitor_config', 'update'))
     else:
         super().handle(handler, data)
示例#24
0
 def initial_state(self):
     self.handler.send(Message('test'))
     print('Sent test message')
 def handle(self, handler: MessageHandler, data: dict) -> None:
     handler.send(Message('vault_request', 'remove_stock', ManagedStock('None', data['id'], data['shares'])))
 def save(self):
     self.buffer.clear()
     self.handler.send(Message('all', 'save'))
 def handle(self, handler: MessageHandler, data: dict) -> None:
     up = BalanceUpdate(data['amount'])
     up.date = dt.datetime.strptime(data['date'], date_format)
     handler.send(Message('vault_request', 'add_balance_update', up))
 def handle(self, handler: MessageHandler, data: dict) -> None:
     handler.send(Message('monitor_config', 'add', Stock(data['acronym'])))
 def handle(self, handler: MessageHandler, data: dict) -> None:
     handler.send(Message('monitor_config', 'limit', data['limit']))
        second_uut.start()
        self.client.send(Message('json_request', 'save'))
        time.sleep(1)
        data = JSONController.load(output_directory)
        self.assertTrue(
            len(data) == 3,
            "Modifying the count value should've generated three controllers, not {}"
            .format(len(data)))


if __name__ == '__main__':
    # unittest.main()
    uut = TestQSM()
    uut.start()

    jcontr = JSONController('test_json', output_directory, 1)
    jcontr.start()

    client = MessageHandler('client')

    client.send(Message('json_request', 'save'))
    time.sleep(1)
    data = JSONController.load(output_directory)
    assert len(data) == 2

    found = False
    for d in data:
        if isinstance(d, TestQSM):
            found = True
    assert found