python - 我正在尝试创建一个股票投资组合交易应用程序,但我遇到了特定变量的问题
问题描述
我正在尝试创建一个股票投资组合交易应用程序(实际上并没有连接到银行账户,所以它必须是一个 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()
解决方案
推荐阅读
- python - 大型 Dask/Pandas 数据帧(27M 行 x 52 列).to_csv 或 .to_sql MemoryError
- typescript - Typescript中没有省略号的动态参数
- php - 检索每个组中的最后一条记录没有得到预期的结果 - MySQL
- web2py - 有没有办法将另一个表中引用的 firleds 的引用信息保存为字符串字段?
- javascript - 遵循文档以使用弹性 ui 自定义主题时遇到问题
- python - Skimage.draw.ellipse 生成两条不需要的线
- python - 如何在 Python 中一次保存多个数据
- vue.js - 可能使用插槽将值从父级传递给子级
- javascript - VueJS子到父隐藏组件的布尔值
- bash - 从终端打开 Firefox-bin 文件时打印 Firefox 日志消息?