def build_holdings(): """Builds a dictionary of important information regarding the stocks and positions owned by the user. :returns: Returns a dictionary where the keys are the stock tickers and the value is another dictionary \ that has the stock price, quantity held, equity, percent change, equity change, type, name, id, pe ratio, \ percentage of portfolio, and average buy price. """ positions_data = get_current_positions() portfolios_data = profiles.load_portfolio_profile() accounts_data = profiles.load_account_profile() if not positions_data or not portfolios_data or not accounts_data: return({}) if portfolios_data['extended_hours_equity'] is not None: total_equity = max(float(portfolios_data['equity']),float(portfolios_data['extended_hours_equity'])) else: total_equity = float(portfolios_data['equity']) cash = "{0:.2f}".format(float(accounts_data['cash'])+float(accounts_data['uncleared_deposits'])) holdings = {} for item in positions_data: # It is possible for positions_data to be [None] if not item: continue try: instrument_data = stocks.get_instrument_by_url(item['instrument']) symbol = instrument_data['symbol'] fundamental_data = stocks.get_fundamentals(symbol)[0] price = stocks.get_latest_price(instrument_data['symbol'])[0] quantity = item['quantity'] equity = float(item['quantity'])*float(price) equity_change = (float(quantity)*float(price))-(float(quantity)*float(item['average_buy_price'])) percentage = float(item['quantity'])*float(price)*100/(float(total_equity)-float(cash)) if (float(item['average_buy_price']) == 0.0): percent_change = 0.0 else: percent_change = (float(price)-float(item['average_buy_price']))*100/float(item['average_buy_price']) holdings[symbol]=({'price': price }) holdings[symbol].update({'quantity': quantity}) holdings[symbol].update({'average_buy_price': item['average_buy_price']}) holdings[symbol].update({'equity':"{0:.2f}".format(equity)}) holdings[symbol].update({'percent_change': "{0:.2f}".format(percent_change)}) holdings[symbol].update({'equity_change':"{0:2f}".format(equity_change)}) holdings[symbol].update({'type': instrument_data['type']}) holdings[symbol].update({'name': stocks.get_name_by_symbol(symbol)}) holdings[symbol].update({'id': instrument_data['id']}) holdings[symbol].update({'pe_ratio': fundamental_data['pe_ratio'] }) holdings[symbol].update({'percentage': "{0:.2f}".format(percentage)}) except: pass return(holdings)
def build_holdings(access_token, with_dividends=False): """Builds a dictionary of important information regarding the stocks and positions owned by the user. :param with_dividends: True if you want to include divident information. :type with_dividends: bool :returns: Returns a dictionary where the keys are the stock tickers and the value is another dictionary \ that has the stock price, quantity held, equity, percent change, equity change, type, name, id, pe ratio, \ percentage of portfolio, and average buy price. """ positions_data = get_open_stock_positions(access_token) portfolios_data = profiles.load_portfolio_profile(access_token) accounts_data = profiles.load_account_profile(access_token) # user wants dividend information in their holdings if with_dividends is True: dividend_data = get_dividends() if not positions_data or not portfolios_data or not accounts_data: return ({}) if portfolios_data['extended_hours_equity'] is not None: total_equity = max(float(portfolios_data['equity']), float(portfolios_data['extended_hours_equity'])) else: total_equity = float(portfolios_data['equity']) cash = "{0:.2f}".format( float(accounts_data['cash']) + float(accounts_data['uncleared_deposits'])) holdings = {} for item in positions_data: # It is possible for positions_data to be [None] if not item: continue try: instrument_data = stocks.get_instrument_by_url(item['instrument'], access_token, info=None) symbol = instrument_data['symbol'] # fundamental_data = stocks.get_fundamentals(symbol, access_token, info=None)[0] price = stocks.get_latest_price(instrument_data['symbol'], access_token=access_token)[0] quantity = item['quantity'] equity = float(item['quantity']) * float(price) equity_change = (float(quantity) * float(price)) - \ (float(quantity) * float(item['average_buy_price'])) percentage = float(item['quantity']) * float(price) * \ 100 / (float(total_equity) - float(cash)) if (float(item['average_buy_price']) == 0.0): percent_change = 0.0 else: percent_change = (float(price) - float( item['average_buy_price'])) * 100 / float( item['average_buy_price']) holdings[symbol] = ({'price': price}) holdings[symbol].update({'quantity': quantity}) holdings[symbol].update( {'average_buy_price': item['average_buy_price']}) holdings[symbol].update({'equity': "{0:.2f}".format(equity)}) holdings[symbol].update( {'percent_change': "{0:.2f}".format(percent_change)}) holdings[symbol].update( {'equity_change': "{0:2f}".format(equity_change)}) holdings[symbol].update( {'percentage': "{0:2f}".format(percentage)}) holdings[symbol].update({'type': instrument_data['type']}) holdings[symbol].update( {'name': stocks.get_name_by_symbol(symbol)}) holdings[symbol].update({'id': instrument_data['id']}) # holdings[symbol].update( # {'percentage': "{0:2f}".format(percentage)}) # holdings[symbol].update({'pe_ratio': fundamental_data['pe_ratio']}) if with_dividends is True: # dividend_data was retrieved earlier holdings[symbol].update( get_dividends_by_instrument(item['instrument'], dividend_data)) except: pass return (holdings)