def test_get_stock_historic_prices_symbol(self): for symbol in self.not_existed_symbols: self.assertRaises(StockSymbolNotFound, get_stock_historic_prices, symbol) for symbol in self.existed_symbols: response = get_stock_historic_prices(symbol) self.assertIsInstance(response, list) response = get_stock_historic_prices( ",".join(self.existed_symbols + self.not_existed_symbols)) self.assertEquals(len(response), len(self.existed_symbols)) response = get_stock_historic_prices("," + self.existed_symbols[0] + ",") self.assertIsInstance(response, list)
def single_stock_historic(request, symbols, time_range='1m'): context = None status_code = 200 try: data = stock_api.get_stock_historic_prices(symbols, time_range=time_range) context = {'data': data} except StockSymbolNotFound as e: context = {"error_message": e.message} status_code = 404 except InvalidTimeRange as e: context = {"error_message": e.message} status_code = 400 except StockServerUnReachable as e: context = {"error_message": e.message} status_code = 503 except Exception as e: context = { "error_message": "Unknown Error occurred: {}".format(", ".join(e.args)) } status_code = 520 finally: response = JsonResponse(context) response.status_code = status_code return response
def test_get_stock_historic_prices_time(self): for time_range in self.valid_time_ranges: response = get_stock_historic_prices(self.existed_symbols[0], time_range) first_date = datetime.fromisoformat(response[0].get('date')) final_date = datetime.fromisoformat(response[-1].get('date')) days_returned = len(response) today = datetime.now() days_since_last_result = (today - final_date).days if time_range.endswith('d'): if time_range == '1d': self.assertEquals((final_date - first_date).days, 0) elif time_range == '5d': self.assertLessEqual(days_returned, 7) if today.weekday() in list(range( 1, 6)): # if between Tuesday and Saturday self.assertLessEqual(days_since_last_result, 1) elif time_range.endswith('m'): self.assertLessEqual(days_returned, int(time_range[0]) * MAX_DAYS_PER_MONTH) elif time_range.endswith('y'): self.assertLessEqual(days_returned, int(time_range[0]) * MAX_DAYS_PER_YEAR) for time_range in self.invalid_time_ranges: self.assertRaises(InvalidTimeRange, get_stock_historic_prices, self.existed_symbols[0], time_range)
def multi_stocks_historic(request, stocks, time_range='1m'): result = [] stocks_list = stocks.split('-') for stock in stocks_list: result.append({ 'name': stock, 'data': stock_api.get_stock_historic_prices(stock, time_range=time_range) }) return JsonResponse({'data': result}, content_type="application/json")
def change_status_rule(): rules = ChangeStatusRule.get_rules() for rule in rules: if not rule.fired: num_of_days = rule.num_of_days if num_of_days < 5: time_range = '5d' elif num_of_days < 20: time_range = '1m' elif num_of_days < 60: time_range = '3m' elif num_of_days < 120: time_range = '6m' elif num_of_days < 240: time_range = '1y' else: time_range = '2y' days = stock_api.get_stock_historic_prices( symbols=rule.watched_stock.stock.symbol, time_range=time_range, chart_interval=1, filter=("changePercent", "date")) if num_of_days < len(days): for day in days[:-num_of_days - 1:-1]: if rule.status == 'N': if day['changePercent'] > 0: break # indicating no sequential negative change value through <num_of_days> days if rule.status == 'P': if day['changePercent'] < 0: break # indicating no sequential positive change value through <num_of_days> days else: # indicating there is sequential change through <num_of_days> days, # here we need to insert a notification to user in DB title = f"Sequential {'Positive' if rule.status == 'P' else 'Negative'} Change for" \ f" {rule.watched_stock.stock.name}" description = f"sequential {'Positive' if rule.status == 'P' else 'Negative'} change" \ f" in the past {num_of_days} days for {rule.watched_stock.stock.name}" Notification.objects.create( user=rule.watched_stock.profile, title=title, description=description, stock=rule.watched_stock.stock) rule.fired = True rule.save()
def should_trigger(self, operand, state, symbol, weeks, creation_time): if operand == 1: operand = 'high' elif operand == -1: operand = 'low' else: return False if weeks < 4: time_range = '1m' elif weeks < 8: time_range = '3m' else: time_range = '6m' data = stock_api.get_stock_historic_prices(symbol, time_range, 'date,' + operand) data = self.cut_data(data, creation_time) if not data: return False else: if state == 1: return self.is_increasing(data, operand) else: return self.is_decreasing(data, operand)
def single_stock_historic(request, symbol): data = stock_api.get_stock_historic_prices(symbol, time_range='1m') return JsonResponse({'data': data})
def single_stock_historic(request, symbol): """ Returns JSON object for a specific stock. """ data = stock_api.get_stock_historic_prices(symbol, time_range='1m') return JsonResponse({'data': data})
def test_get_stock_historic_prices(self): response = stock_api.get_stock_historic_prices(self.stock_object['symbol']) self.assertIsNotNone(response) with self.assertRaises(Exception): response = stock_api.get_stock_historic_prices("")