{"name": "OldWang_Buy Updated with Munal.ipynb", "path": "OldWang_Buy Updated with Munal.ipynb", "last_modified": "2024-11-25T17:14:38.442597Z", "created": "2024-01-02T16:43:32.602088Z", "content": {"cells": [{"cell_type": "code", "execution_count": 5, "id": "dea6d4f3", "metadata": {"trusted": true}, "outputs": [{"name": "stdout", "output_type": "stream", "text": "Buying power before making trade: 18099.41\nTotal stock in pool: 68\nSelected stocks: 41\nABBV:\n  5-min price: $177.79\n  10-min price: $177.36\n  Previous close price: $176.94\n  Percentage change: 0.51%\nABT:\n  5-min price: $117.95\n  10-min price: $117.87\n  Previous close price: $117.73\n  Percentage change: 0.17%\nAOS:\n  5-min price: $75.43\n  10-min price: $75.39\n  Previous close price: $73.42\n  Percentage change: 2.79%\nARE:\n  5-min price: $111.42\n  10-min price: $111.11\n  Previous close price: $108.30\n  Percentage change: 2.92%\nASH:\n  5-min price: $80.81\n  10-min price: $80.50\n  Previous close price: $79.08\n  Percentage change: 2.10%\nAZN:\n  5-min price: $66.13\n  10-min price: $66.04\n  Previous close price: $65.63\n  Percentage change: 0.73%\nBBY:\n  5-min price: $93.86\n  10-min price: $93.84\n  Previous close price: $89.55\n  Percentage change: 4.96%\nBRC:\n  5-min price: $74.66\n  10-min price: $74.65\n  Previous close price: $72.78\n  Percentage change: 2.62%\nBYD:\n  5-min price: $74.00\n  10-min price: $73.80\n  Previous close price: $72.33\n  Percentage change: 2.34%\nCBT:\n  5-min price: $114.07\n  10-min price: $113.71\n  Previous close price: $110.36\n  Percentage change: 3.51%\nCRAI:\n  5-min price: $194.82\n  10-min price: $194.46\n  Previous close price: $193.60\n  Percentage change: 1.16%\nDFS:\n  5-min price: $182.73\n  10-min price: $182.51\n  Previous close price: $179.07\n  Percentage change: 2.09%\nEBAY:\n  5-min price: $65.39\n  10-min price: $65.29\n  Previous close price: $63.22\n  Percentage change: 3.46%\nEXPO:\n  5-min price: $100.64\n  10-min price: $100.44\n  Previous close price: $98.04\n  Percentage change: 2.67%\nFUL:\n  5-min price: $77.74\n  10-min price: $77.59\n  Previous close price: $76.15\n  Percentage change: 2.23%\nHXL:\n  5-min price: $62.74\n  10-min price: $62.67\n  Previous close price: $61.20\n  Percentage change: 2.66%\nICE:\n  5-min price: $159.45\n  10-min price: $159.40\n  Previous close price: $159.29\n  Percentage change: 0.06%\nJBHT:\n  5-min price: $188.67\n  10-min price: $188.58\n  Previous close price: $182.37\n  Percentage change: 3.67%\nLANC:\n  5-min price: $189.18\n  10-min price: $189.15\n  Previous close price: $186.18\n  Percentage change: 1.63%\nLEA:\n  5-min price: $102.02\n  10-min price: $101.91\n  Previous close price: $97.89\n  Percentage change: 4.24%\nLFUS:\n  5-min price: $252.80\n  10-min price: $252.23\n  Previous close price: $243.75\n  Percentage change: 3.85%\nLYB:\n  5-min price: $84.79\n  10-min price: $84.53\n  Previous close price: $83.88\n  Percentage change: 1.17%\nMSA:\n  5-min price: $175.85\n  10-min price: $175.79\n  Previous close price: $174.97\n  Percentage change: 0.59%\nNSC:\n  5-min price: $275.18\n  10-min price: $274.48\n  Previous close price: $268.95\n  Percentage change: 2.36%\nNUE:\n  5-min price: $155.85\n  10-min price: $155.57\n  Previous close price: $151.90\n  Percentage change: 2.91%\nOTIS:\n  5-min price: $102.44\n  10-min price: $102.36\n  Previous close price: $101.18\n  Percentage change: 1.27%\nOTTR:\n  5-min price: $82.50\n  10-min price: $82.24\n  Previous close price: $80.77\n  Percentage change: 2.33%\nPCAR:\n  5-min price: $115.92\n  10-min price: $115.86\n  Previous close price: $114.73\n  Percentage change: 1.05%\nPEP:\n  5-min price: $162.60\n  10-min price: $162.28\n  Previous close price: $162.01\n  Percentage change: 0.39%\nPKG:\n  5-min price: $247.67\n  10-min price: $247.56\n  Previous close price: $246.34\n  Percentage change: 0.53%\nPRGS:\n  5-min price: $70.18\n  10-min price: $70.07\n  Previous close price: $69.28\n  Percentage change: 1.34%\nSBUX:\n  5-min price: $102.65\n  10-min price: $102.50\n  Previous close price: $102.50\n  Percentage change: 0.17%\nSNX:\n  5-min price: $122.12\n  10-min price: $121.53\n  Previous close price: $118.82\n  Percentage change: 2.81%\nSTT:\n  5-min price: $98.87\n  10-min price: $98.79\n  Previous close price: $97.51\n  Percentage change: 1.39%\nSTX:\n  5-min price: $102.24\n  10-min price: $102.14\n  Previous close price: $99.62\n  Percentage change: 2.69%\nSWK:\n  5-min price: $92.12\n  10-min price: $92.05\n  Previous close price: $89.26\n  Percentage change: 3.23%\nSYF:\n  5-min price: $67.25\n  10-min price: $67.11\n  Previous close price: $65.98\n  Percentage change: 1.87%\nSYY:\n  5-min price: $77.13\n  10-min price: $76.90\n  Previous close price: $75.78\n  Percentage change: 1.85%\nWM:\n  5-min price: $225.65\n  10-min price: $225.46\n  Previous close price: $224.39\n  Percentage change: 0.58%\nXLB:\n  5-min price: $95.14\n  10-min price: $94.93\n  Previous close price: $94.09\n  Percentage change: 1.12%\nXLI:\n  5-min price: $143.29\n  10-min price: $143.23\n  Previous close price: $142.53\n  Percentage change: 0.56%\nToday's stock pick contains 42 stocks:\nMarket Optimism Factor: 0.53\nStock Pool Activity Coefficient: 0.68\nMultiplicative Factor: 47\nBuying power:\n15384\nAttempting to buy ABBV:\nFunds allocated: $366.3\nAttempting to buy ABT:\nFunds allocated: $366.3\nAttempting to buy AOS:\nFunds allocated: $366.3\nAttempting to buy ARE:\nFunds allocated: $366.3\nAttempting to buy ASH:\nFunds allocated: $366.3\nAttempting to buy AZN:\nFunds allocated: $366.3\nAttempting to buy BBY:\nFunds allocated: $366.3\nAttempting to buy BRC:\nFunds allocated: $366.3\nAttempting to buy BYD:\nFunds allocated: $366.3\nAttempting to buy CBT:\nFunds allocated: $366.3\nAttempting to buy CRAI:\nFunds allocated: $366.3\nAttempting to buy DFS:\nFunds allocated: $366.3\nAttempting to buy EBAY:\nFunds allocated: $366.3\nAttempting to buy EHC:\nFunds allocated: $366.3\nAttempting to buy EXPO:\nFunds allocated: $366.3\nAttempting to buy FUL:\nFunds allocated: $366.3\nAttempting to buy HXL:\nFunds allocated: $366.3\nAttempting to buy ICE:\nFunds allocated: $366.3\nAttempting to buy JBHT:\nFunds allocated: $366.3\nAttempting to buy LANC:\nFunds allocated: $366.3\nAttempting to buy LEA:\nFunds allocated: $366.3\nAttempting to buy LFUS:\nFunds allocated: $366.3\nAttempting to buy LYB:\nFunds allocated: $366.3\nAttempting to buy MSA:\nFunds allocated: $366.3\nAttempting to buy NSC:\nFunds allocated: $366.3\nAttempting to buy NUE:\nFunds allocated: $366.3\nAttempting to buy OTIS:\nFunds allocated: $366.3\nAttempting to buy OTTR:\nFunds allocated: $366.3\nAttempting to buy PCAR:\nFunds allocated: $366.3\nAttempting to buy PEP:\nFunds allocated: $366.3\nAttempting to buy PKG:\nFunds allocated: $366.3\nAttempting to buy PRGS:\nFunds allocated: $366.3\nAttempting to buy SBUX:\nFunds allocated: $366.3\nAttempting to buy SNX:\nFunds allocated: $366.3\nAttempting to buy STT:\nFunds allocated: $366.3\nAttempting to buy STX:\nFunds allocated: $366.3\nAttempting to buy SWK:\nFunds allocated: $366.3\nAttempting to buy SYF:\nFunds allocated: $366.3\nAttempting to buy SYY:\nFunds allocated: $366.3\nAttempting to buy WM:\nFunds allocated: $366.3\nAttempting to buy XLB:\nFunds allocated: $366.3\nAttempting to buy XLI:\nFunds allocated: $366.3\nBuying power after making trade: 3438.56\n"}], "source": "import robin_stocks.robinhood as rh\nimport pandas as pd\nimport requests\nfrom datetime import datetime\nimport yfinance as yf\nimport time \nimport math\nimport random\n\nusername ='liuweiwang0824@gmail.com'\npassword ='Umcqar45&M'\n\ndef login():\n    rh.login(username, password)\n\n\nlogin()\n\ndef open_market():\n    time_now = datetime.now().time()\n    market_open = datetime.time(9, 30, 0)\n    market_close = datetime.time(15, 59, 0)\n    return market_open < time_now < market_close\n\ndef get_cash():\n    rh.login(username, password)\n    rh_profile = rh.load_account_profile()\n    return float(rh_profile['portfolio_cash'])\nprint(f'Buying power before making trade: {get_cash()}')\n\ndef get_holdings_and_bought_price(stocks):\n    holdings = {stock: 0 for stock in stocks}\n    bought_price = {stock: 0 for stock in stocks}\n    rh_holdings = rh.account.build_holdings()\n    for stock in stocks:\n        holdings[stock] = int(float((rh_holdings.get(stock, {}).get('quantity', '0'))))\n        bought_price[stock] = float((rh_holdings.get(stock, {}).get('average_buy_price', '0')))\n    return holdings, bought_price\n\ntoday = datetime.today()\na, b, c = str(today.year), str(today.month), str(today.day)\n\nf1 = pd.read_csv(r'\\\\DESKTOP-RRDK2EH\\Server\\Users\\jizha\\Desktop\\seabridge_datapool1\\final_strategy_data_temporaly\\\\three_strategy_buy_point_' + a + '_' + b + '_' + c + '.csv')\n# \u79fb\u9664\u5e26\u6709\u70b9\uff08\".\"\uff09\u7684\u80a1\u7968\u4ee3\u7801\nticker_sum = f1['0'].tolist()\n\nticker_sum = [ticker for ticker in ticker_sum if \".\" not in ticker]\n#ticker_sum.remove('RTWG.L')\n#ticker_sum.remove('PPHC.L')\nprint(f\"Total stock in pool: {len(ticker_sum)}\")\n \n\ndef buy(stock, allowable_holdings):\n    rh.orders.order_buy_fractional_by_price(stock, allowable_holdings, timeInForce='gfd', extendedHours=False)\n \ndef get_yahoo_historical_prices_5min(stock):\n    data = yf.download(stock, interval='5m', period='2d', progress=False)\n    if len(data) < 3:  # Ensure we have enough data points\n        return None, None, None, None\n    current_price = data['Close'].iloc[-1]  # Last data point\n    price_5min = data['Close'].iloc[-2]  # Second last data point\n    price_10min = data['Close'].iloc[-3]  # Third last data point\n    \n    # Extracting the previous day's close\n    yesterday_data = data[data.index.date != data.index[-1].date()]\n    close_p = yesterday_data['Close'].iloc[-1] if not yesterday_data.empty else None\n\n    return current_price, price_5min, price_10min, close_p\ndef final_trade_stock_data(stocks):\n    final_data = {}\n    \n    for stock in stocks:\n        current_price, price_5min, price_10min, close_p = get_yahoo_historical_prices_5min(stock)\n        if current_price is None or price_5min is None or price_10min is None or close_p is None:\n            continue\n        \n        # Check if the stock meets the criteria\n        if price_5min > price_10min and current_price > close_p:\n            pct_change = ((current_price - close_p) / close_p) * 100\n            if 0 < pct_change <5:\n                final_data[stock] = {\n                    'current_price': current_price,\n                    'price_5min': price_5min,\n                    'price_10min': price_10min,\n                    'close_p': close_p,\n                    'pct_change': pct_change\n                }\n    \n    return final_data\n\n\nselected_stocks = final_trade_stock_data(ticker_sum)\n\nprint(f\"Selected stocks: {len(selected_stocks)}\")\nfor stock, data in selected_stocks.items():\n    print(f\"{stock}:\")\n    print(f\"  5-min price: ${data['price_5min']:.2f}\")\n    print(f\"  10-min price: ${data['price_10min']:.2f}\")\n    print(f\"  Previous close price: ${data['close_p']:.2f}\")\n    print(f\"  Percentage change: {data['pct_change']:.2f}%\")\n\n\ndef calculate_multiplicative_factor(change):\n#    \"\"\"\u6839\u636e\u5e02\u573a\u53d8\u5316\u8ba1\u7b97\u4e58\u6cd5\u56e0\u5b50\u3002\"\"\"\n    return 40 + 40 * abs(change) / 0.03\n    \ndef calculate_market_activity_coefficient(total_stocks, selected_stocks):\n    \"\"\"\u8ba1\u7b97\u5e02\u573a\u6d3b\u8dc3\u5ea6\u7cfb\u6570\"\"\"\n    ratio = selected_stocks / total_stocks\n    market_activity_coefficient = 0.6 / (1 + math.exp(-12 * (ratio - 0.5))) + 0.2\n    market_activity_coefficient=round(market_activity_coefficient,2)\n\n    return market_activity_coefficient\n \ndef calculate_total_buying_power(change, cash, total_stocks, selected_stocks):\n    market_activity_coefficient = calculate_market_activity_coefficient(total_stocks, selected_stocks)\n    print(f\"Stock Pool Activity Coefficient: {market_activity_coefficient}\")  # \u6253\u5370\u5e02\u573a\u6d3b\u8dc3\u7cfb\u6570\n\n    multiplicative_factor = calculate_multiplicative_factor(change)\n    multiplicative_factor=round(multiplicative_factor)\n    print(f\"Multiplicative Factor: {multiplicative_factor}\")  # \u6253\u5370\u4e58\u6cd5\u56e0\u5b50\n\n    adjustment_coefficient = 1 + change * multiplicative_factor\n    total_buying_power_adjusted = adjustment_coefficient * cash * market_activity_coefficient\n    total_buying_power_adjusted = max(0, total_buying_power_adjusted)\n    if total_buying_power_adjusted > cash:\n        total_buying_power_adjusted = cash\n    \n    return total_buying_power_adjusted\n\nstocks = final_trade_stock_data(ticker_sum)\nnum_of_stocks = len(stocks)\nprint(f\"Today's stock pick contains {num_of_stocks} stocks:\")\ndef get_stock_change(stock):\n    # \u4f7f\u7528yfinance\u83b7\u53d6\u80a1\u7968\u7684\u6700\u8fd1\u4e24\u5929\u7684\u6536\u76d8\u4ef7\u683c\n    data = yf.download(stock, period=\"2d\", progress=False)['Close']\n    if len(data) < 2:\n        return None, None\n    today_close, yesterday_close = data[-1], data[-2]\n    change_percentage = (today_close - yesterday_close) / yesterday_close * 100\n    return today_close, change_percentage\n\n# \u4fee\u6539\u6253\u5370\u80a1\u7968\u4fe1\u606f\u7684\u90e8\u5206\uff1a\nfor stock in stocks:\n    current_price, change_pct = get_stock_change(stock)\n    if current_price is None or change_pct is None:\n        print(f\"{stock}: Data not available\")\n        continue\n    #print(f\"{stock}: Current Price: ${current_price:.2f}, Change: {change_pct:.2f}%\")\n\nspy_current = yf.download(\"SPY\", period=\"1d\", progress=False)['Close'][-1]\nqqq_current = yf.download(\"QQQ\", period=\"1d\", progress=False)['Close'][-1]\nspy_previous_close = yf.download(\"SPY\", period=\"2d\", progress=False)['Close'][-2]\nqqq_previous_close = yf.download(\"QQQ\", period=\"2d\", progress=False)['Close'][-2]\nspy_change = (spy_current - spy_previous_close) / spy_previous_close\nqqq_change = (qqq_current - qqq_previous_close) / qqq_previous_close\naverage_change = (spy_change + qqq_change)  \n\n#print(f\"SPY Change: {spy_change*100:.2f}%\")\n#print(f\"QQQ Change: {qqq_change*100:.2f}%\")\nprint(f\"Market Optimism Factor: {average_change*100:.2f}\")  # \u6253\u5370SPY\u548cQQQ\u7684\u6da8\u8dcc\u767e\u5206\u6bd4\n\nstocks = final_trade_stock_data(ticker_sum)\n\nmyCash = get_cash()\ncash = calculate_total_buying_power(average_change, myCash, len(ticker_sum), len(stocks))\ncash = round(cash) - 1\nprint('Buying power:')\nprint(cash)\nif cash <= 0:\n    print(\"Insufficient buying power. No trades will be executed.\")\nelse:\n \n    trade_dict = {stock: 0 for stock in stocks}\n    price_dict = {stock: 0 for stock in stocks}\n    df_trades = pd.DataFrame(columns=stocks)\n    df_prices = pd.DataFrame(columns=stocks)\n\n    #prices = rh.stocks.get_latest_price(stocks)\n    holdings, bought_price = get_holdings_and_bought_price(stocks)\n    # Modify the check_purchase_successful function to check the holdings directly\n    def check_purchase_successful(stock):\n        holdings_after_purchase, _ = get_holdings_and_bought_price([stock])\n        return holdings_after_purchase[stock] > 0  # Check if we hold any of the stock\n\n    for stock in stocks:\n        allowable_holdings = round(cash / len(stocks), 1)\n        print(f\"Attempting to buy {stock}:\")\n        print(f\"Funds allocated: ${allowable_holdings}\")\n\n        # Place the market order\n        buy(stock, allowable_holdings)\n\n        # Pause for 3 seconds to allow the broker to process the order\n        time_to_sleep = random.uniform(5, 12)\n                                \n        time.sleep(time_to_sleep)\n\n        # Check if purchase was successful\n    #    attempts = 1\n    #    while not check_purchase_successful(stock) and attempts < 1:  # Limit to 2 attempts\n    #        print(f\"Purchase of {stock} failed. Retrying...\")\n    #        buy(stock, allowable_holdings)\n\n            # Pause for 3 seconds again\n    #        time.sleep(3)\n\n    #        attempts += 1\n\n     #   if attempts == 1:\n     #       print(f\"Failed to buy {stock} after 1 attempt.\")\n\n\n    #-----------#\n    time.sleep(time_to_sleep)\n\n    print(f'Buying power after making trade: {get_cash()}')\n\n\n#ToolBox\n#quantity = 11.11 # convert quantity to float once\n#s='A'   \n#rh.orders.order_sell_market(symbol=s, quantity=quantity, timeInForce='gfd')\n    "}, {"cell_type": "code", "execution_count": null, "id": "82fa9411", "metadata": {"trusted": true}, "outputs": [], "source": " import robin_stocks.robinhood as rh\nimport pandas as pd\nimport time\n\nusername = 'liuweiwang0824@gmail.com'\npassword = 'Umcqar45&M'\n\n# \u767b\u5f55\ndef login():\n    rh.login(username, password)\n\nlogin()\n\n# \u83b7\u53d6\u73b0\u91d1\u4f59\u989d\ndef get_cash():\n    rh_profile = rh.load_account_profile()\n    return float(rh_profile['portfolio_cash'])\n\n# \u4e70\u5165\u6307\u5b9a\u80a1\u7968\ndef buy(stock, allowable_holdings):\n    rh.orders.order_buy_fractional_by_price(stock, allowable_holdings, timeInForce='gfd', extendedHours=False)\n\n# \u8ba1\u7b97\u4e70\u5165\u6bcf\u53ea\u80a1\u7968\u7684\u91d1\u989d\ndef calculate_allowable_holdings(cash, stocks):\n    return round(cash / len(stocks), 2)\n\n# \u4e3b\u6d41\u7a0b\ndef main():\n    selected_stocks = ['BX', 'LOW', 'GRMN', 'AIG', 'AOS', 'WSM', 'LECO']\n    cash = get_cash()\n    allowable_cash = round(cash / 2, 2)  # \u4f7f\u7528\u8d2d\u4e70\u529b\u7684\u4e00\u534a\n    print(f'Buying power to be used: ${allowable_cash}')\n    \n    allowable_holdings = calculate_allowable_holdings(allowable_cash, selected_stocks)\n    print(f'Funds allocated per stock: ${allowable_holdings}')\n    \n    if allowable_holdings <= 0:\n        print(\"Insufficient buying power. No trades will be executed.\")\n        return\n    \n    for stock in selected_stocks:\n        print(f\"Attempting to buy {stock}:\")\n        buy(stock, allowable_holdings)\n        print(f\"Bought {stock} with ${allowable_holdings}\")\n        time.sleep(120)  # \u6bcf\u6b21\u4e70\u5165\u540e\u95f4\u96942\u5206\u949f\n    \n    print(f'Buying power after making trade: {get_cash()}')\n\nif __name__ == \"__main__\":\n    main()\n"}, {"cell_type": "code", "execution_count": null, "id": "26f2e861", "metadata": {"trusted": true}, "outputs": [], "source": "import robin_stocks.robinhood as rh\n\nusername = 'liuweiwang0824@gmail.com'\npassword = 'Umcqar45&M'\n\n# \u767b\u5f55\ndef login():\n    rh.login(username, password)\n\nlogin()\n\n# \u83b7\u53d6\u6307\u5b9a\u80a1\u7968\u7684\u6301\u4ed3\u6570\u91cf\ndef get_stock_holdings(stock):\n    rh_holdings = rh.account.build_holdings()\n    holdings = int(float(rh_holdings.get(stock, {}).get('quantity', '0')))\n    return holdings\n\n# \u4e3b\u6d41\u7a0b\ndef main(stock):\n    shares = get_stock_holdings(stock)\n    print(f'You hold {shares} shares of {stock}.')\n\nif __name__ == \"__main__\":\n    stock_to_check = 'BX'  # \u5728\u8fd9\u91cc\u66ff\u6362\u4e3a\u60a8\u60f3\u8981\u68c0\u67e5\u7684\u80a1\u7968\u4ee3\u7801\n    main(stock_to_check)\n"}, {"cell_type": "code", "execution_count": null, "id": "7f0cd31a", "metadata": {"trusted": true}, "outputs": [], "source": "import robin_stocks.robinhood as rh\nimport pandas as pd\nimport time\n\nusername = 'liuweiwang0824@gmail.com'\npassword = 'Umcqar45&M'\n\n# \u767b\u5f55\ndef login():\n    rh.login(username, password)\n\nlogin()\n\n# \u83b7\u53d6\u73b0\u91d1\u4f59\u989d\ndef get_cash():\n    rh_profile = rh.load_account_profile()\n    return float(rh_profile['portfolio_cash'])\n\n# \u4e70\u5165\u6307\u5b9a\u80a1\u7968\ndef buy(stock, allowable_holdings):\n    rh.orders.order_buy_fractional_by_price(stock, allowable_holdings, timeInForce='gfd', extendedHours=False)\n\n# \u83b7\u53d6\u6301\u4ed3\u548c\u4e70\u5165\u4ef7\u683c\ndef get_holdings_and_bought_price(stocks):\n    holdings = {stock: 0 for stock in stocks}\n    rh_holdings = rh.account.build_holdings()\n    for stock in stocks:\n        holdings[stock] = int(float(rh_holdings.get(stock, {}).get('quantity', '0')))\n    return holdings\n\n# \u8ba1\u7b97\u4e70\u5165\u6bcf\u53ea\u80a1\u7968\u7684\u91d1\u989d\ndef calculate_allowable_holdings(cash, stocks):\n    return round(cash / len(stocks), 2)\n\n# \u68c0\u67e5\u662f\u5426\u6210\u529f\u4e70\u5165\ndef check_purchase_successful(stock, initial_holdings):\n    current_holdings = get_holdings_and_bought_price([stock])\n    return current_holdings[stock] > initial_holdings[stock]\n\nticker = [\"APD\", \"GD\", \"MA\", \"MDLZ\", \"PG\", \"VRSN\"]\n# \u4e3b\u6d41\u7a0b\ndef main():\n    selected_stocks = tickers\n    cash = get_cash()\n    allowable_cash = round(cash / 1.5, 2)  # \u4f7f\u7528\u8d2d\u4e70\u529b\u7684\u4e00\u534a\n    print(f'Buying power to be used: ${allowable_cash}')\n    \n    allowable_holdings = calculate_allowable_holdings(allowable_cash, selected_stocks)\n    print(f'Funds allocated per stock: ${allowable_holdings}')\n    \n    if allowable_holdings <= 0:\n        print(\"Insufficient buying power. No trades will be executed.\")\n        return\n    \n    failed_purchases = []\n    for stock in selected_stocks:\n        print(f\"Attempting to buy {stock}:\")\n        initial_holdings = get_holdings_and_bought_price([stock])\n        success = False\n        for attempt in range(3):\n            buy(stock, allowable_holdings)\n            time.sleep(30)  # \u7b49\u5f8530\u79d2\u540e\u68c0\u67e5\u6301\u4ed3\n            if check_purchase_successful(stock, initial_holdings):\n                print(f\"Successfully bought {stock} with ${allowable_holdings} on attempt {attempt + 1}\")\n                success = True\n                break\n            else:\n                print(f\"Attempt {attempt + 1} to buy {stock} failed.\")\n        if not success:\n            failed_purchases.append(stock)\n            print(f\"Failed to buy {stock} after 3 attempts. Needs manual purchase.\")\n        time.sleep(90)  # \u6bcf\u6b21\u4e70\u5165\u540e\u95f4\u96942\u5206\u949f\uff08\u5305\u62ec30\u79d2\u68c0\u67e5\u65f6\u95f4\uff09\n    \n    print(f'Buying power after making trade: {get_cash()}')\n    if failed_purchases:\n        print(\"The following stocks need manual purchase:\")\n        for stock in failed_purchases:\n            print(stock)\n\nif __name__ == \"__main__\":\n    main()\n"}, {"cell_type": "code", "execution_count": null, "id": "7579bcea", "metadata": {"trusted": true}, "outputs": [], "source": "import robin_stocks.robinhood as rh\n\nusername = 'liuweiwang0824@gmail.com'\npassword = 'Umcqar45&M'\n\n# \u767b\u5f55\ndef login():\n    rh.login(username, password)\n\nlogin()\n\n# \u83b7\u53d6\u6307\u5b9a\u80a1\u7968\u7684\u6301\u4ed3\u6570\u91cf\ndef get_stock_holdings(stock):\n    rh_holdings = rh.account.build_holdings()\n    holdings = int(float(rh_holdings.get(stock, {}).get('quantity', '0')))\n    return holdings\n\n# \u4e3b\u6d41\u7a0b\ndef main(stock):\n    shares = get_stock_holdings(stock)\n    print(f'You hold {shares} shares of {stock}.')\n\nif __name__ == \"__main__\":\n    stock_to_check = 'AOS'  # \u5728\u8fd9\u91cc\u66ff\u6362\u4e3a\u60a8\u60f3\u8981\u68c0\u67e5\u7684\u80a1\u7968\u4ee3\u7801\n    main(stock_to_check)\n"}, {"cell_type": "code", "execution_count": null, "id": "71fd6081", "metadata": {"trusted": true}, "outputs": [], "source": ""}], "metadata": {"kernelspec": {"display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9"}}, "nbformat": 4, "nbformat_minor": 5}, "format": "json", "mimetype": null, "size": 29325, "writable": true, "type": "notebook"}