def artificialUpdateGraph(self, ticker): if not ticker: return self.ticker = ticker self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.updateGraph)
def updateLoader(self, *args): if not self.searchText.text: return self.ticker = self.searchText.text.upper() self.searchText.text = "" self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.updateGraph)
def toCompareActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) if "stats" not in self.alpha.activities: self.loading = LoadingPopup() self.loading.open() self.invertScroll() Clock.schedule_once(self.makeCompareActivity) else: self.alpha.activity = self.alpha.activities["stats"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll)
class ActivitySelect(BoxLayout): def __init__(self, alpha): super().__init__(orientation="horizontal", y=0, size_hint=(1, None), height=Window.height * .1) self.spacing = (self.width * .2) / 4 self.alpha = alpha self.buttons = dict() srcs = ["search", "money", "chart", "rank", "learn"] acts = ["search", "track", "stats", "rank", "learn"] funcs = [ self.toSearchActivity, self.toTrackActivity, self.toCompareActivity, self.toRankActivity, self.toLearnActivity ] for i in range(len(srcs)): b = IconButton(self, funcs[i], srcs[i]) self.buttons[acts[i]] = b self.add_widget(b) self.updateSelected(self.buttons["search"]) def artificialClick(self, activity): button = self.buttons[activity] if activity == "search": self.toSearchActivity(button) elif activity == "track": self.toTrackActivity(button) elif activity == "stats": self.toCompareActivity(button) elif activity == "rank": self.toRankActivity(button) def invertScroll(self, *args): self.alpha.scrollView.do_scroll_y = not self.alpha.scrollView.do_scroll_y def toSearchActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) self.alpha.activity = self.alpha.activities["search"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll) def toTrackActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) if "track" not in self.alpha.activities: self.loading = LoadingPopup() self.loading.open() self.invertScroll() Clock.schedule_once(self.makeTrackActivity) else: self.alpha.activity = self.alpha.activities["track"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll) def makeTrackActivity(self, *args): self.alpha.activities["track"] = TrackActivity(self.alpha, self.alpha.searchDB) self.alpha.activity = self.alpha.activities["track"] self.alpha.scrollView.add_widget(self.alpha.activity) self.loading.dismiss() def toCompareActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) if "stats" not in self.alpha.activities: self.loading = LoadingPopup() self.loading.open() self.invertScroll() Clock.schedule_once(self.makeCompareActivity) else: self.alpha.activity = self.alpha.activities["stats"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll) def makeCompareActivityExceptImAHomelessManThatDoesntKnowHowToCode( self, abbr): self.alpha.activities["stats"] = StatsActivity(self.alpha, self.alpha.searchDB, abbr) def makeCompareActivity(self, *args): self.alpha.activities["stats"] = StatsActivity(self.alpha, self.alpha.searchDB) self.alpha.activity = self.alpha.activities["stats"] self.alpha.scrollView.add_widget(self.alpha.activity) self.loading.dismiss() def toRankActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) if "rank" not in self.alpha.activities: self.loading = LoadingPopup() self.loading.open() self.invertScroll() Clock.schedule_once(self.makeRankActivity) else: self.alpha.activity = self.alpha.activities["rank"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll) def makeRankActivity(self, *args): self.alpha.activities["rank"] = RankActivity(self.alpha) self.alpha.activity = self.alpha.activities["rank"] self.alpha.scrollView.add_widget(self.alpha.activity) self.loading.dismiss() def toLearnActivity(self, itself): self.alpha.conduit = None self.invertScroll() self.updateSelected(itself) self.alpha.scrollView.remove_widget(self.alpha.activity) if "learn" not in self.alpha.activities: self.loading = LoadingPopup() self.loading.open() self.invertScroll() Clock.schedule_once(self.makeLearnActivity) else: self.alpha.activity = self.alpha.activities["learn"] self.alpha.scrollView.add_widget(self.alpha.activity) Clock.schedule_once(self.invertScroll) def makeLearnActivity(self, *args): self.alpha.activities["learn"] = LearnActivity(self.alpha) self.alpha.activity = self.alpha.activities["learn"] self.alpha.scrollView.add_widget(self.alpha.activity) self.loading.dismiss() def updateSelected(self, itself): for button in self.buttons.values(): if button != itself: button.colorUnselected() itself.colorSelected()
def updateLoader(self, *args): self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.update)
class PortfolioWidgetsLayout(GridLayout): def __init__(self, portfolios, activity): super().__init__(cols=1, size_hint_y=None) self.bind(minimum_height=self.setter('height')) self.portfolios = portfolios self.activity = activity self.pWidgets = [] self.updateLayout = GridLayout(rows=1, size_hint_y=None, height=Window.height * .1) self.updateSpacer = Label(text="", size_hint_y=None, size_hint_x=None, height=Window.height * .1, width=Window.width * .85) self.updateLayout.add_widget(self.updateSpacer) self.updateButton = IconButton(self.updateLoader, "sync") self.updateLayout.add_widget(self.updateButton) self.add_widget(self.updateLayout) for portfolio in self.portfolios: pWidget = PortfolioWidget(portfolio, self, self.activity) self.pWidgets.append(pWidget) self.add_widget(pWidget) self.centeringLayout = GridLayout(rows=1, size_hint_y=None) self.centeringLabel = Label(text="", size_hint_y=None, size_hint_x=None, height=Window.height * .1, width=Window.width * .45) self.centeringLayout.add_widget(self.centeringLabel) self.addPortfolioButton = IconButton(self.addPortfolio, "add", (0, 1, 0, .6)) self.centeringLayout.add_widget(self.addPortfolioButton) self.add_widget(self.centeringLayout) # self.bind(pos = self.manageConduit, size = self.manageConduit) def manageConduit(self, *args): self.activity.app.conduit = None def updateLoader(self, *args): self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.update) def update(self, *args): for portfolio in self.portfolios: portfolio.update() pickle.dump(self.portfolios, open("res/userPortfolios.p", 'wb')) self.redraw() self.loading.dismiss() def redraw(self): self.clear_widgets() self.pWidgets = [] self.add_widget(self.updateLayout) for portfolio in self.portfolios: pWidget = PortfolioWidget(portfolio, self, self.activity) self.pWidgets.append(pWidget) self.add_widget(pWidget) self.add_widget(self.centeringLayout) def addPortfolio(self, *args): newPortfolio = Portfolio() self.activity.portfolios.append(newPortfolio) self.remove_widget(self.centeringLayout) pWidget = PortfolioWidget(newPortfolio, self, self.activity) self.add_widget(pWidget) self.add_widget(self.centeringLayout) pickle.dump(self.portfolios, open("res/userPortfolios.p", 'wb'))
class PortfolioEditorLayout(GridLayout): def __init__(self, portfolio, activity): super().__init__(cols=1, size_hint_y=None) self.bind(minimum_height=self.setter('height')) self.portfolio = portfolio self.activity = activity self.titleLayout = GridLayout(rows=1, size_hint_y=None, height=Window.height * .1) self.backButton = IconButton(self.back, "back") self.titleLayout.add_widget(self.backButton) self.nameEntry = TextInput(text=self.portfolio.name, background_color=(0, 0, 0, 0), foreground_color=(1, 1, 1, 1), cursor_color=(0, 1, 0, 1), multiline=False, font_size="24sp", height=Window.height * .1, size_hint_y=None, width=Window.width * .75, size_hint_x=None, padding=[6, (Window.height * .025)]) self.nameEntry.bind(on_text_validate=self.changeName) self.nameEntry.bind(focus=self.changeNameFocus) self.titleLayout.add_widget(self.nameEntry) self.updateButton = IconButton(self.updateLoader, "sync") self.titleLayout.add_widget(self.updateButton) self.add_widget(self.titleLayout) self.sWidgets = [] for stock in self.portfolio.stocks: sWidget = StockWidget(stock, self, self.activity.app) self.sWidgets.append(sWidget) self.add_widget(sWidget) self.centeringLayout = GridLayout(rows=1, size_hint_y=None) self.centeringLabel = Label(text="", size_hint_y=None, size_hint_x=None, height=Window.height * .1, width=Window.width * .45) self.centeringLayout.add_widget(self.centeringLabel) self.addStockButton = IconButton(self.addStock, "add", (0, 1, 0, .6)) self.centeringLayout.add_widget(self.addStockButton) self.add_widget(self.centeringLayout) pickle.dump(self.activity.portfolios, open("res/userPortfolios.p", 'wb')) self.bind(pos=self.manageConduit, size=self.manageConduit) def manageConduit(self, *args): self.activity.app.conduit = self def updateLoader(self, *args): self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.update) def update(self, *args): # for stock in self.portfolio.stocks: # stock.update() self.portfolio.update() pickle.dump(self.activity.portfolios, open("res/userPortfolios.p", 'wb')) self.redraw() self.loading.dismiss() def addStock(self, *args): self.activity.titleLabel.text = "Add Stock to " + self.portfolio.name self.activity.swap(StockAdderWidget(self, self.activity)) def redraw(self): self.clear_widgets() self.add_widget(self.titleLayout) self.sWidgets = [] for stock in self.portfolio.stocks: sWidget = StockWidget(stock, self, self.activity.app) self.sWidgets.append(sWidget) self.add_widget(sWidget) self.add_widget(self.centeringLayout) def back(self, *args): self.activity.app.conduit = None self.activity.titleLabel.text = "Portfolios" self.activity.swap( PortfolioWidgetsLayout(self.activity.portfolios, self.activity)) def changeNameFocus(self, *args): if not args[-1]: self.changeName(None) def changeName(self, *args): newName = self.nameEntry.text self.portfolio.name = newName self.activity.titleLabel.text = self.portfolio.name + "'s Stocks" self.nameEntry.focus = False
class StatsActivity(GridLayout): def __init__(self, app, searchDB, abbr="GE"): super().__init__(cols=1, size_hint_y=None) ####################################### ############ Housekeeping ############# ####################################### self.app = app self.searchDB = searchDB self.abbr = abbr self.stockGraph = None self.coloredWidgets = [] self.color = (255 / 255, 255 / 255, 255 / 255, 1) self.bind(minimum_height=self.setter('height')) #[red, orange, yellow, green, blue, purple] self.colorPallete = [(255 / 255, 0 / 255, 0 / 255, 1), (255 / 255, 165 / 255, 0 / 255, 1), (255 / 255, 255 / 255, 0 / 255, 1), (0 / 255, 255 / 255, 0 / 255, 1), (0 / 255, 0 / 255, 255 / 255, 1), (255 / 255, 0 / 255, 255 / 255, 1)] ####################################### ############ Search Layout ############ ####################################### self.searchLayout = BoxLayout(orientation='horizontal') self.searchText = SearchBar(self, self.searchDB) self.searchText.width = Window.width * .8 self.searchText.bind(on_text_validate=self.updateLoader) self.searchLayout.add_widget(self.searchText) self.searchButton = Button(text="Cancel", font_name="res/Aldrich", font_hinting="light", bold=True) self.searchButton.width = Window.width * .2 self.searchButton.bind(on_press=self.removeText) self.searchLayout.add_widget(self.searchButton) self.add_widget(self.searchLayout) ####################################### ############# Data Layout ############# ####################################### self.dataLayout = BoxLayout(orientation="vertical") self.currentLayout = self.dataLayout ####################################### ############ Ticker Layout ############ ####################################### self.tickerLayout = BoxLayout(orientation='horizontal') self.tickerTitle = Label(text=self.abbr, color=self.color, font_name="res/Aldrich", font_hinting="light", bold=True, halign="center", valign="center") def tickerTitleScale(*args): self.tickerTitle.text_size = self.tickerTitle.size self.tickerTitle.bind(size=tickerTitleScale) self.coloredWidgets.append(self.tickerTitle) self.tickerLayout.add_widget(self.tickerTitle) self.tickerDisplay = Label(text="", halign="center", color=self.color, font_name="res/Aldrich", font_hinting="light", bold=True) self.coloredWidgets.append(self.tickerDisplay) self.tickerLayout.add_widget(self.tickerDisplay) self.dataLayout.add_widget(self.tickerLayout) ####################################### ############# Stock Graph ############# ####################################### self.stockGraph = StatsGraph(self.abbr, self, False) self.dataLayout.add_widget(self.stockGraph) # for i in range(len(self.stockGraph.AIKB)): # button = ####################################### ############ Range Options ############ ####################################### self.rangeLayout = BoxLayout(orientation='horizontal') ranges = [("1W", "1wk", "1d"), ("2W", "2wk", "1d"), ("1M", "1mo", "1d"), ("3M", "3mo", "1d"), ("YTD", "YTD", "1d"), ("1Y", "1y", "1d"), ("2Y", "2y", "1d")] self.rangeButtons = [] for r in ranges: rangeButton = RangeButton(r[0], self, r[1], r[2]) self.rangeLayout.add_widget(rangeButton) if r[0] == "YTD": rangeButton.active = True self.rangeButtons.append(rangeButton) self.dataLayout.add_widget(self.rangeLayout) self.signalLineGrid = GridLayout(rows=1, size_hint_y=None, height=Window.height * .1) self.signalButtons = [] # No Signals, Sell Signals, Buy Signals, All Signals combos = [("No\nSignals", self, False, False), ("Sell\nSignals", self, False, True), ("Buy\nSignals", self, True, False), ("Both\nSignals", self, True, True)] for combo in combos: sb = SignalButton(*combo) self.signalButtons.append(sb) self.signalLineGrid.add_widget(sb) self.signalButtons[0].active = True self.signalButtons[0].drawSelected() self.dataLayout.add_widget(self.signalLineGrid) self.updateColors() self.updateInfo(self.abbr) self.statGrid = GridLayout(cols=2, size_hint_y=None, height=Window.height * .5) self.statLayouts = [] for k, v in self.stockGraph.stats.items(): rng = False default = 0 if k in [ "Bollinger Bands", "Exponential Moving Average", "Simple Moving Average", "Relative Strength Index", "Average True Range", "Triple EMA" ]: rng = True default = 10 statLayout = StatLayout(k, v[1], self, v[0], rng, default) self.statGrid.add_widget(statLayout) self.statLayouts.append(statLayout) self.dataLayout.add_widget(self.statGrid) self.add_widget(self.dataLayout) ####################################### ############# Ratio Setup ############# ####################################### self.searchLayout.size_hint_y = None self.searchLayout.height = Window.height * .1 self.tickerLayout.size_hint_y = None self.tickerLayout.height = Window.height * .1 self.stockGraph.size_hint_y = None self.stockGraph.height = Window.height * .5 self.rangeLayout.size_hint_y = None self.rangeLayout.height = Window.height * .1 self.dataLayout.size_hint_y = None self.dataLayout.height = (self.tickerLayout.height + self.stockGraph.height + self.rangeLayout.height + Window.height * .6) # self.bind(size = self.scale) def scale(self, *args): Clock.schedule_once(self.continuousHeight, 0) def continuousHeight(self, *args): self.dataLayout.height = (self.tickerLayout.height + self.stockGraph.height + self.rangeLayout.height + Window.height * .6) def removeText(self, *args): # if not self.searchText.text: # return self.searchText.text = "" self.swap() def updateColors(self): if not self.stockGraph: return self.color = self.stockGraph.color for widget in self.coloredWidgets: widget.color = self.color for button in self.rangeButtons: button.updateColor() def updateLoader(self, *args): if not self.searchText.text: return self.ticker = self.searchText.text.upper() self.searchText.text = "" self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.updateGraph) def updateGraph(self, *args): try: for stat in self.statLayouts: stat.statButton.active = False stat.statButton.draw() self.stockGraph.updateTicker(self.ticker) self.tickerTitle.text = self.ticker self.updateInfo(self.ticker) except BadTickerException as e: errmsg = str(e.ticker) + " does not exist or has been delisted!" self.errorPopup = ErrorPopup(errmsg) self.errorPopup.open() self.loading.dismiss() def updateInfo(self, newTicker): try: self.stockInfo = self.stockGraph.ticker.info except: print("Unable to load info for", newTicker) try: self.tickerTitle.text = newTicker + "\n" + self.stockInfo[ "longName"] except: print("longName failed") def artificialUpdateGraph(self, ticker): if not ticker: return self.ticker = ticker self.loading = LoadingPopup() self.loading.open() Clock.schedule_once(self.updateGraph) def swap(self, new=None): if not new: new = self.dataLayout self.remove_widget(self.currentLayout) self.currentLayout = new self.add_widget(self.currentLayout)