Esempio n. 1
0
 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)
Esempio n. 2
0
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
Esempio n. 3
0
    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)
Esempio n. 4
0
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")
Esempio n. 5
0
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()
Esempio n. 6
0
    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)
Esempio n. 7
0
def single_stock_historic(request, symbol):
    data = stock_api.get_stock_historic_prices(symbol, time_range='1m')
    return JsonResponse({'data': data})
Esempio n. 8
0
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})
Esempio n. 9
0
 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("")