fromflaskimportFlask,request,render_template,jsonify,redirectimportrandomimportosimporturllib.request,urllib.parse,urllib.error,jsonimportdatetimeapp=Flask(__name__)app.debug=Truestocks=[]date=datetime.date(2000,1,3)cash=100000classStock:def__init__(self,symbol,quantity,purch_date,init_price):self.symbol=symbolself.quantity=quantityself.purch_date=purch_dateself.init_price=init_priceself.earnings=0self.last_price=init_priceself.last_earning=0@app.route("/")defindex():returnrender_template('paper.html',date=date,stocks=stocks,cash=cash)@app.route("/advance/<int:days>")defadvance_day(days):globaldatedate+=datetime.timedelta(days=days)whilenotis_trading_day(date):date+=datetime.timedelta(days=1)update_stocks()returnredirect('/')defupdate_stocks():forsinstocks:q=fetch_quotes(s.symbol,date,date)ifq:s.earnings=s.quantity*(float(q['Close'])-s.init_price)s.last_earning=s.quantity*(float(q['Close'])-s.last_price)s.last_price=float(q['Close'])@app.route('/trade')deftrade():globalcashsymbol=request.args['symbol']quantity=int(request.args['quantity'])q=fetch_quotes(symbol,date,date)ifq:s=Stock(symbol,quantity,date,float(q['Open']))cash-=quantity*s.init_pricestocks.append(s)returnredirect('/')@app.route('/sell/<int:sidx>')defsell(sidx):globalcashstock=stocks[sidx]cash+=stock.quantity*stock.last_pricedelstocks[sidx]returnredirect('/')@app.route('/lookup/<sym>')deflookup(sym):quotes=fetch_quotes(sym,date-datetime.timedelta(30),date)ifquotes:returnjsonify(quotes)else:returnjsonify({})defis_trading_day(date):returnfetch_quotes('YHOO',date,date)isnotNonedeffetch_quotes(symbol,start_date,end_date):base_url='http://query.yahooapis.com/v1/public/yql'yql=('select * from yahoo.finance.historicaldata where symbol = "'+symbol+'" and startDate = "'+start_date.isoformat()+'" and endDate = "'+end_date.isoformat()+'"')req_url=(base_url+'?q='+urllib.parse.quote(yql)+'&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json')try:response=urllib.request.urlopen(req_url)results=json.loads(response.read().decode('utf-8'))['query']['results']ifresults:returnresults['quote']else:returnNoneexcepturllib.error.HTTPError:returnNoneif__name__=='__main__':app.run()