首页 > 解决方案 > 我正在尝试创建一个股票投资组合交易应用程序,但我遇到了特定变量的问题

问题描述

我正在尝试创建一个股票投资组合交易应用程序(实际上并没有连接到银行账户,所以它必须是一个 sim 卡)并且我遇到了一个特定变量的问题。顺便说一句:在代码中,当它询问我的 MongoDB 身份验证字符串时,我在发布此内容时将其保留为空白,但在运行代码时将其填写。

正在发生的事情的解释:

我使用 pymongo 作为所有当前资产和现金的数据库。我还使用 yfinance 作为股票价格检查器。我有各种命令都链接到 commandRedirect、commandArray 和 getCommand 函数和数组。getCommand() 函数将输入语句放入 cmd,然后获取由每个空格分隔的字符串,以便我可以获取命令的每个子字符串并创建一个 if/elif/else 循环以使用该命令的适当函数。这存储在一个名为 commandArray 的子字符串数组中。commandRedirect(commandArray) 使用数组并将每个单独的命令重定向到要运行的每个函数。我遇到问题的函数是 trade() 函数(特别是当用户想要出售股票时)。首先在交易功能中,它检查发送的命令是否指定它是买入还是卖出。如果是卖出,我会在数据库的单独部分中获得我拥有的全部现金,以便在我卖出股票时添加到其中。我还得到了用户键入的股票代码的股票价格。然后,我列出了我拥有的特定股票代码的所有持股,并要求用户根据循环通过数据库时显示的 ObjectId 选择哪一个。然后我得到选择并制作一个适合数据库中即将发生的更改的字符串。问题来了:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:我在数据库的单独部分中获得了总现金,以便在我出售股票时可以添加到其中。我还得到了用户键入的股票代码的股票价格。然后,我列出了我拥有的特定股票代码的所有持股,并要求用户根据循环通过数据库时显示的 ObjectId 选择哪一个。然后我得到选择并制作一个适合数据库中即将发生的更改的字符串。问题来了:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:我在数据库的单独部分中获得了总现金,以便在我出售股票时可以添加到其中。我还得到了用户键入的股票代码的股票价格。然后,我列出了我拥有的特定股票代码的所有持股,并要求用户根据循环通过数据库时显示的 ObjectId 选择哪一个。然后我得到选择并制作一个适合数据库中即将发生的更改的字符串。问题来了:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:然后,我列出了我拥有的特定股票代码的所有持股,并要求用户根据循环通过数据库时显示的 ObjectId 选择哪一个。然后我得到选择并制作一个适合数据库中即将发生的更改的字符串。问题来了:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:然后,我列出了我拥有的特定股票代码的所有持股,并要求用户根据循环通过数据库时显示的 ObjectId 选择哪一个。然后我得到选择并制作一个适合数据库中即将发生的更改的字符串。问题来了:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:接下来的几行只是我试图获取我在该股票中持有的当前股份数量,以及该股票的当前价值,以便我可以在出售时相应地更改价值。当我尝试这样做时,我得到的错误代码是:

错误代码:

File "E:\StockTraderCMD\main.py", line 110, in <module>
    main()
  File "E:\StockTraderCMD\main.py", line 9, in main
    commandRedirect(commandArray)
  File "E:\StockTraderCMD\main.py", line 98, in commandRedirect
    main()
  File "E:\StockTraderCMD\main.py", line 9, in main
    commandRedirect(commandArray)
  File "E:\StockTraderCMD\main.py", line 97, in commandRedirect
    trade(Array[1], Array[2], int(Array[3]))
  File "E:\StockTraderCMD\main.py", line 64, in trade
    currentAmount = chosenHolding["currentAmount"]
TypeError: 'NoneType' object is not subscriptable

请帮忙!!!

import pymongo
import yfinance as yf
import sys

def main():
    dbConnect()
    update()
    commandArray = getCommand()
    commandRedirect(commandArray)

def dbConnect():
    global holdings, users, cash
    client = pymongo.MongoClient()
    db = client["stock-manager"]
    holdings = db["holdings"]
    cash = db["cash"]



def getCommand():
    command = input("Command: ")
    command += " "
    keyWords = []
    spaces = []
    commandPos = 0
    spacePos = 0
    previousSpaceIndex = None
    for char in command:
        if char == ' ':
            spaces.append(commandPos)
            if previousSpaceIndex == None:
                keyWords.append(command[:spaces[spacePos]])
                previousSpaceIndex = spaces[spacePos]
            else:
                keyWords.append(command[previousSpaceIndex+1:spaces[spacePos]])
                previousSpaceIndex = spaces[spacePos]
            spacePos += 1
        commandPos += 1
    return keyWords

def trade(buySell, ticker, amount):
    if buySell == "buy":
        stockInfo = yf.Ticker(ticker).info
        stockPrice = int(stockInfo['regularMarketPrice'])
        total = stockPrice*amount
        newHolding = {
            "ticker": ticker,
            "buyAmount": amount,
            "buyPrice": stockPrice,
            "totalCost": total,
            "currentValue": total,
            "currentAmount": amount,
        }
        holdings.insert_one(newHolding)
    elif buySell == "sell":
        totalCash = cash.find_one()["totalCash"]
        stockInfo = yf.Ticker(ticker).info
        stockPrice = int(stockInfo['regularMarketPrice'])
        print("Type the ID of the chosen holding")
        view(ticker)
        choice = input("Which One: ")
        query = {"_id": "ObjectId(" + choice +")"}
        chosenHolding = holdings.find_one(query)
        currentAmount = chosenHolding["currentAmount"]
        if currentAmount >= amount:
            newValues = { "$set": { "currentAmount": chosenHolding["currentAmount"]-amount, "currentValue": (chosenHolding["currentAmount"]-amount)*stockPrice} }
            holdings.update_one(query, newValues)
            cash.update_one({"_id": "ObjectId(617f3722b4dbb070901690b6)"}, {"totalCash": totalCash + amount*stockPrice})
        else:
            print("error: not enough shares")


def view(ticker):
    query = {"ticker": ticker,}

    queryResults = holdings.find(query)
    for x in queryResults:
        print(x)

def login(username, password):
    pass

def update():
    for x in holdings.find():
        id = x["_id"]
        ticker = x["ticker"]
        amount = x["currentAmount"]
        stockInfo = yf.Ticker(ticker).info
        stockPrice = int(stockInfo['regularMarketPrice'])
        value = stockPrice*amount
        query = {"_id": id}
        newValues = { "$set": { "currentValue": value } }
        holdings.update_one(query, newValues)

def commandRedirect(Array):
    if Array[0] == "trade":
        trade(Array[1], Array[2], int(Array[3]))
        main()
    elif Array[0] == "view":
        view(Array[1])
        main()
    elif Array[0] == "login":
        login(Array[1], Array[2])
        main()
    elif Array[0] == "quit" or Array[0] == "exit":
        sys.exit()

softwareVersion = "2.0"
print("This is StockTrader version " + softwareVersion)
main()

标签: pythonstock

解决方案


推荐阅读