コード例 #1
0
 def artificialUpdateGraph(self, ticker):
     if not ticker:
         return
     self.ticker = ticker
     self.loading = LoadingPopup()
     self.loading.open()
     Clock.schedule_once(self.updateGraph)
コード例 #2
0
 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)
コード例 #3
0
 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)
コード例 #4
0
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()
コード例 #5
0
 def updateLoader(self, *args):
     self.loading = LoadingPopup()
     self.loading.open()
     Clock.schedule_once(self.update)
コード例 #6
0
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'))
コード例 #7
0
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
コード例 #8
0
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)