def call_ta(self, _):
        """Process ta command"""
        if not self.current_coin:
            print("Please load a coin through either load or select", "\n")

        elif self.current_df.empty:
            print("Price dataframe is empty")

        else:
            # Coingecko does not provide candles so we can only provide close data.
            if self.source == "CG":

                self.current_df = self.current_df[["Price"]].rename(
                    columns={"Price": "Close"}
                )

            self.current_df.index.name = "date"

            ta_controller.menu(
                self.current_coin,
                self.current_df.index[0],
                "",
                self.current_df,
                "crypto",
            )
            print("")
    def call_ta(self, other_args):
        """Process ta command"""
        if self.current_coin:
            self.current_df, self.current_currency = pycoingecko_view.ta(
                self.current_coin, other_args)
            if self.current_df is not None:
                try:
                    self.current_df = self.current_df[[
                        "price"
                    ]].rename(columns={"price": "Close"})
                    self.current_df.index.name = "date"
                    quit = ta_controller.menu(
                        stock=self.current_df,
                        ticker=self.current_coin.coin_symbol,
                        start=self.current_df.index[0],
                        interval="",
                        context="(crypto)>(cg)",
                    )
                    print("")
                    if quit is not None:
                        if quit is True:
                            return quit

                except (ValueError, KeyError) as e:
                    print(e)
            else:
                return
        else:
            print("Please load a coin through either load - coin", "\n")
            return
    def call_ta(self, _):
        """Process ta command"""
        if not self.current_coin:
            print("Please load a coin through either load -c ", "\n")

        elif self.current_df.empty:
            print("Price dataframe is empty")

        else:

            try:
                quit = ta_controller.menu(
                    stock=self.current_df,
                    ticker=self.current_coin,
                    start=self.current_df.index[0],
                    interval="",
                    context="(crypto)>(bin)",
                )
                print("")
                if quit is not None:
                    if quit is True:
                        return quit

            except (ValueError, KeyError) as e:
                print(e)
 def call_ta(self, _):
     """Process ta command"""
     return ta_controller.menu(
         self.ticker,
         self.start,
         self.interval,
         self.stock,
     )
    def call_ta(self, _):
        """Process ta command"""
        if not self.current_coin:
            print("Please load a coin through either load or select", "\n")
        if self.current_df.empty:
            print("Price dataframe is empty")
        else:
            # Need to make the columns in df be compatible.  Also since there are no splits or dividends, there is no
            # adj close.  To tell ta to use Close, we can just set the interval to anything but 1440.
            # Binance provides candles so we just need to rename:
            if self.source == "BIN":
                self.current_df = self.current_df.rename(
                    columns={
                        "Open": "1. open",
                        "High": "2. high",
                        "Low": "3. low",
                        "Close": "4. close",
                        "Volume": "6. volume",
                    }
                )
                self.current_df.index.name = "date"

            # Coingecko does not provide candles so we can only provide close data.
            elif self.source == "CG":

                self.current_df = self.current_df[["Price"]].rename(
                    columns={"Price": "4. close"}
                )
                self.current_df.index.name = "date"

            return ta_controller.menu(
                self.current_df,
                self.current_coin,
                self.current_df.index[0],
                "",
            )
def main():
    """
    Gamestonk Terminal is an awesome stock market terminal that has been developed for fun,
    while I saw my GME shares tanking. But hey, I like the stock.
    """
    # Enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607
    if sys.platform == "win32":
        os.system("")

    s_ticker = ""
    s_start = ""
    df_stock = pd.DataFrame()
    s_interval = "1440min"

    # Set stock by default to speed up testing
    # s_ticker = "BB"
    # ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas')
    # df_stock, d_stock_metadata = ts.get_daily_adjusted(symbol=s_ticker, outputsize='full')
    # df_stock.sort_index(ascending=True, inplace=True)
    # s_start = datetime.strptime("2020-06-04", "%Y-%m-%d")
    # df_stock = df_stock[s_start:]

    # Add list of arguments that the main parser accepts
    menu_parser = argparse.ArgumentParser(add_help=False,
                                          prog="gamestonk_terminal")
    choices = [
        "help",
        "quit",
        "q",
        "clear",
        "load",
        "candle",
        "view",
        "export",
        "disc",
        "scr",
        "mill",
        "ba",
        "res",
        "fa",
        "ta",
        "dd",
        "eda",
        "pred",
        "ca",
        "op",
        "fred",
        "pa",
        "crypto",
        "ra",
        "po",
    ]

    menu_parser.add_argument("opt", choices=choices)
    completer = NestedCompleter.from_nested_dict({c: None for c in choices})

    # Print first welcome message and help
    print("\nWelcome to Gamestonk Terminal 🚀\n")
    should_print_help = True
    parsed_stdin = False

    if gtff.ENABLE_THOUGHTS_DAY:
        print("-------------------")
        try:
            thought.get_thought_of_the_day()
        except Exception as e:
            print(e)
        print("")

    # Loop forever and ever
    while True:
        main_cmd = False
        if should_print_help:
            print_help(s_ticker, s_start, s_interval, b_is_stock_market_open())
            should_print_help = False

        # Get input command from stdin or user
        if not parsed_stdin and len(sys.argv) > 1:
            as_input = " ".join(sys.argv[1:])
            parsed_stdin = True
            print(f"{get_flair()}> {as_input}")
        elif session and gtff.USE_PROMPT_TOOLKIT:
            as_input = session.prompt(f"{get_flair()}> ", completer=completer)
        else:
            as_input = input(f"{get_flair()}> ")

        # Is command empty
        if not as_input:
            print("")
            continue

        # Parse main command of the list of possible commands
        try:
            (ns_known_args,
             l_args) = menu_parser.parse_known_args(as_input.split())

        except SystemExit:
            print("The command selected doesn't exist\n")
            continue

        b_quit = False
        if ns_known_args.opt == "help":
            should_print_help = True

        elif (ns_known_args.opt == "quit") or (ns_known_args.opt == "q"):
            break

        elif ns_known_args.opt == "clear":
            s_ticker, s_start, s_interval, df_stock = clear(
                l_args, s_ticker, s_start, s_interval, df_stock)
            main_cmd = True

        elif ns_known_args.opt == "load":
            s_ticker, s_start, s_interval, df_stock = load(
                l_args, s_ticker, s_start, s_interval, df_stock)
            main_cmd = True

        elif ns_known_args.opt == "candle":

            if s_ticker:
                candle(
                    s_ticker,
                    (datetime.now() -
                     timedelta(days=180)).strftime("%Y-%m-%d"),
                )

            else:
                print(
                    "No ticker selected. Use 'load ticker' to load the ticker you want to look at.",
                    "\n",
                )

            main_cmd = True

        elif ns_known_args.opt == "view":

            if s_ticker:
                view(l_args, s_ticker, s_start, s_interval, df_stock)

            else:
                print(
                    "No ticker selected. Use 'load ticker' to load the ticker you want to look at.",
                    "\n",
                )
            main_cmd = True

        elif ns_known_args.opt == "export":
            export(l_args, df_stock)
            main_cmd = True

        elif ns_known_args.opt == "disc":
            b_quit = disc_controller.menu()

        elif ns_known_args.opt == "mill":
            b_quit = mill.papermill_menu()

        elif ns_known_args.opt == "ba":
            b_quit = ba_controller.menu(s_ticker, s_start)

        elif ns_known_args.opt == "res":
            b_quit = rm.res_menu(s_ticker, s_start, s_interval)

        elif ns_known_args.opt == "ca":
            b_quit = ca_controller.menu(df_stock, s_ticker, s_start,
                                        s_interval)

        elif ns_known_args.opt == "fa":
            b_quit = fam.fa_menu(s_ticker, s_start, s_interval)

        elif ns_known_args.opt == "ta":
            b_quit = ta_controller.menu(df_stock, s_ticker, s_start,
                                        s_interval)

        elif ns_known_args.opt == "dd":
            b_quit = dd_controller.menu(df_stock, s_ticker, s_start,
                                        s_interval)

        elif ns_known_args.opt == "eda":
            if s_interval == "1440min":
                b_quit = eda_controller.menu(df_stock, s_ticker, s_start,
                                             s_interval)
            else:
                df_stock = yf.download(s_ticker, start=s_start, progress=False)
                df_stock = df_stock.rename(
                    columns={
                        "Open": "1. open",
                        "High": "2. high",
                        "Low": "3. low",
                        "Close": "4. close",
                        "Adj Close": "5. adjusted close",
                        "Volume": "6. volume",
                    })
                df_stock.index.name = "date"
                s_interval = "1440min"

                b_quit = eda_controller.menu(df_stock, s_ticker, s_start,
                                             s_interval)

        elif ns_known_args.opt == "op":
            b_quit = op_controller.menu(s_ticker)

        elif ns_known_args.opt == "fred":
            b_quit = fred_controller.menu()

        elif ns_known_args.opt == "pa":
            b_quit = port_controller.menu()

        elif ns_known_args.opt == "crypto":
            b_quit = crypto_controller.menu()

        elif ns_known_args.opt == "po":
            b_quit = po_controller.menu([s_ticker])

        elif ns_known_args.opt == "pred":

            if not gtff.ENABLE_PREDICT:
                print("Predict is not enabled in feature_flags.py")
                print("Prediction menu is disabled")
                print("")
                continue

            try:
                # pylint: disable=import-outside-toplevel
                from gamestonk_terminal.prediction_techniques import pred_controller
            except ModuleNotFoundError as e:
                print("One of the optional packages seems to be missing")
                print("Optional packages need to be installed")
                print(e)
                print("")
                continue
            except Exception as e:
                print(e)
                print("")
                continue

            if s_interval == "1440min":
                b_quit = pred_controller.menu(df_stock, s_ticker, s_start,
                                              s_interval)
            # If stock data is intradaily, we need to get data again as prediction
            # techniques work on daily adjusted data. By default we load data from
            # Alpha Vantage because the historical data loaded gives a larger
            # dataset than the one provided by quandl
            else:
                try:
                    ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE,
                                    output_format="pandas")
                    # pylint: disable=unbalanced-tuple-unpacking
                    df_stock_pred, _ = ts.get_daily_adjusted(symbol=s_ticker,
                                                             outputsize="full")
                    # pylint: disable=no-member
                    df_stock_pred = df_stock_pred.sort_index(ascending=True)
                    df_stock_pred = df_stock_pred[s_start:]
                    b_quit = pred_controller.menu(df_stock_pred,
                                                  s_ticker,
                                                  s_start,
                                                  s_interval="1440min")
                except Exception as e:
                    print(e)
                    print(
                        "Either the ticker or the API_KEY are invalids. Try again!"
                    )
                    return

        elif ns_known_args.opt == "ra":
            b_quit = ra_controller.menu(df_stock, s_ticker, s_start,
                                        s_interval)

        elif ns_known_args.opt == "scr":
            b_quit = screener_controller.menu()

        else:
            print("Shouldn't see this command!")
            continue

        if b_quit:
            break
        else:
            if not main_cmd:
                should_print_help = True

    print(
        "Hope you enjoyed the terminal. Remember that stonks only go up. Diamond hands.\n"
    )