ETF : update choices (#3610)

* Moving Docker folder into Build

* Workflows : update Docker

* Docker : update compose image version

* Docker : fix volumes path

* etf/disc : update choices

* etf/scr : update choices

* etf/scr : update choices

* ETF : update choices

Co-authored-by: James Maslek <jmaslek11@gmail.com>
This commit is contained in:
Chavithra
2022-11-28 19:20:57 +01:00
committed by GitHub
parent d8c46b0aef
commit d712fce7cb
5 changed files with 114 additions and 229 deletions

View File

@@ -29,29 +29,14 @@ class DiscoveryController(BaseController):
"active",
]
PATH = "/etf/disc/"
CHOICES_GENERATION = True
def __init__(self, queue: List[str] = None):
"""Constructor"""
super().__init__(queue)
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
choices["gainers"] = {
"--limit": None,
"-l": "--limit",
}
choices["decliners"] = {
"--limit": None,
"-l": "--limit",
}
choices["active"] = {
"--limit": None,
"-l": "--limit",
}
choices["support"] = self.SUPPORT_CHOICES
choices["about"] = self.ABOUT_CHOICES
choices: dict = self.choices_default
self.completer = NestedCompleter.from_nested_dict(choices)

View File

@@ -28,7 +28,6 @@ from openbb_terminal.etf.technical_analysis import ta_controller
from openbb_terminal.helper_funcs import (
EXPORT_BOTH_RAW_DATA_AND_FIGURES,
EXPORT_ONLY_RAW_DATA_ALLOWED,
check_non_negative_float,
check_positive,
export_data,
valid_date,
@@ -37,7 +36,7 @@ from openbb_terminal.helper_funcs import (
)
from openbb_terminal.menu import session
from openbb_terminal.parent_classes import BaseController
from openbb_terminal.rich_config import console, MenuText, get_ordered_list_sources
from openbb_terminal.rich_config import console, MenuText
from openbb_terminal.stocks import stocks_helper
from openbb_terminal.stocks.comparison_analysis import ca_controller
@@ -82,6 +81,7 @@ class ETFController(BaseController):
PATH = "/etf/"
FILE_PATH = os.path.join(os.path.dirname(__file__), "README.md")
CHOICES_GENERATION = True
def __init__(self, queue: List[str] = None):
"""Constructor"""
@@ -93,58 +93,7 @@ class ETFController(BaseController):
self.TRY_RELOAD = True
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
one_to_hundred: dict = {str(c): {} for c in range(1, 100)}
choices["search"] = {
"--name": None,
"-n": "--name",
"--description": None,
"-d": "--description",
"--source": {
c: {} for c in get_ordered_list_sources(f"{self.PATH}search")
},
"--limit": None,
"-l": "--limit",
}
choices["load"] = {
"--ticker": None,
"-t": "--ticker",
"--start": None,
"-s": "--start",
"--end": None,
"-e": "--end",
"--limit": None,
"-l": "--limit",
}
choices["weights"] = {"--min": one_to_hundred, "-m": "--min", "--raw": {}}
choices["candle"] = {
"--sort": {c: {} for c in self.CANDLE_COLUMNS},
"-s": "--sort",
"--plotly": {},
"-p": "--plotly",
"--ma": None,
"--reverse": {},
"-r": "--reverse",
"--trend": {},
"-t": "--trend",
"--raw": {},
"--num": one_to_hundred,
"-n": "--num",
}
choices["pir"] = {
"--etfs": None,
"-e": "--etfs",
"--filename": None,
"--folder": None,
}
choices["compare"] = {
"--etfs": None,
"-e": "--etfs",
}
choices["support"] = self.SUPPORT_CHOICES
choices["about"] = self.ABOUT_CHOICES
choices: dict = self.choices_default
self.completer = NestedCompleter.from_nested_dict(choices)
@@ -372,9 +321,6 @@ class ETFController(BaseController):
help="Number of holdings to get",
default=10,
)
if not self.etf_name:
console.print("Please load a ticker using <load name>. \n")
return
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-l")
@@ -382,12 +328,15 @@ class ETFController(BaseController):
parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED
)
if ns_parser:
stockanalysis_view.view_holdings(
symbol=self.etf_name,
limit=ns_parser.limit,
export=ns_parser.export,
)
console.print()
if self.etf_name:
stockanalysis_view.view_holdings(
symbol=self.etf_name,
limit=ns_parser.limit,
export=ns_parser.export,
)
console.print()
else:
console.print("Please load a ticker using <load name>. \n")
@log_start_end(log=logger)
def call_news(self, other_args: List[str]):
@@ -497,13 +446,6 @@ class ETFController(BaseController):
"Only works when raw data is displayed."
),
)
parser.add_argument(
"--raw",
action="store_true",
dest="raw",
default=False,
help="Shows raw data instead of chart",
)
parser.add_argument(
"-n",
"--num",
@@ -511,6 +453,8 @@ class ETFController(BaseController):
help="Number to show if raw selected",
dest="num",
default=20,
choices=range(1, 100),
metavar="NUM",
)
parser.add_argument(
"-t",
@@ -532,7 +476,10 @@ class ETFController(BaseController):
)
ns_parser = self.parse_known_args_and_warn(
parser, other_args, EXPORT_BOTH_RAW_DATA_AND_FIGURES
parser,
other_args,
EXPORT_BOTH_RAW_DATA_AND_FIGURES,
raw=True,
)
if ns_parser:
if not self.etf_name:
@@ -655,22 +602,21 @@ class ETFController(BaseController):
parser.add_argument(
"-m",
"--min",
type=check_non_negative_float,
type=check_positive,
dest="min",
help="Minimum positive float to display sector",
default=5,
)
parser.add_argument(
"--raw",
action="store_true",
dest="raw",
help="Only output raw data",
choices=range(1, 100),
metavar="MIN",
)
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-l")
ns_parser = self.parse_known_args_and_warn(
parser, other_args, export_allowed=EXPORT_BOTH_RAW_DATA_AND_FIGURES
parser,
other_args,
export_allowed=EXPORT_BOTH_RAW_DATA_AND_FIGURES,
raw=True,
)
if ns_parser:
yfinance_view.display_etf_weightings(

View File

@@ -33,7 +33,8 @@ class ScreenerController(BaseController):
"sbc",
]
preset_choices = screener_model.get_preset_choices()
PRESET_CHOICES = screener_model.get_preset_choices()
ETF_CATEGORY_LIST = financedatabase_model.get_etfs_categories()
sortby_screen_choices = [
"Assets",
@@ -53,6 +54,7 @@ class ScreenerController(BaseController):
]
PATH = "/etf/scr/"
CHOICES_GENERATION = True
def __init__(self, queue: List[str] = None):
"""Constructor"""
@@ -62,15 +64,10 @@ class ScreenerController(BaseController):
self.screen_tickers: List = list()
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
choices["view"] = {c: None for c in self.preset_choices}
choices["set"] = {c: None for c in self.preset_choices}
choices["sbc"] = {
c: None for c in financedatabase_model.get_etfs_categories()
}
choices["support"] = self.SUPPORT_CHOICES
choices["about"] = self.ABOUT_CHOICES
choices: dict = self.choices_default
choices["view"].update({c: None for c in self.PRESET_CHOICES})
choices["set"].update({c: None for c in self.PRESET_CHOICES})
choices["sbc"].update({c: None for c in self.ETF_CATEGORY_LIST})
self.completer = NestedCompleter.from_nested_dict(choices)
@@ -103,7 +100,7 @@ class ScreenerController(BaseController):
type=str,
help="View specific custom preset",
default="",
choices=self.preset_choices,
choices=self.PRESET_CHOICES,
)
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-p")
@@ -112,7 +109,7 @@ class ScreenerController(BaseController):
if ns_parser.preset:
preset_filter = configparser.RawConfigParser()
preset_filter.optionxform = str # type: ignore
preset_filter.read(self.preset_choices[ns_parser.preset])
preset_filter.read(self.PRESET_CHOICES[ns_parser.preset])
headers = [
"Price",
@@ -144,9 +141,9 @@ class ScreenerController(BaseController):
else:
console.print("\nPresets:")
for preset in self.preset_choices:
for preset in self.PRESET_CHOICES:
with open(
self.preset_choices[preset],
self.PRESET_CHOICES[preset],
encoding="utf8",
) as f:
description = ""
@@ -174,7 +171,7 @@ class ScreenerController(BaseController):
type=str,
default="template",
help="Filter presets",
choices=self.preset_choices,
choices=self.PRESET_CHOICES,
)
if other_args and "-" not in other_args[0][0]:
other_args.insert(0, "-p")
@@ -251,6 +248,8 @@ class ScreenerController(BaseController):
nargs="+",
help="Category to look for",
required="-h" not in other_args,
choices=self.ETF_CATEGORY_LIST,
metavar="CATEGORY",
)
parser.add_argument(
"-l",
@@ -269,7 +268,7 @@ class ScreenerController(BaseController):
)
if ns_parser:
category = " ".join(ns_parser.category)
if category in financedatabase_model.get_etfs_categories():
if category in self.ETF_CATEGORY_LIST:
financedatabase_view.display_etf_by_category(
category=category,
limit=ns_parser.limit,
@@ -278,5 +277,5 @@ class ScreenerController(BaseController):
else:
console.print(
"The category selected does not exist, choose one from:"
f" {', '.join(financedatabase_model.get_etfs_categories())}\n"
f" {', '.join(self.ETF_CATEGORY_LIST)}\n"
)

View File

@@ -27,6 +27,7 @@ from openbb_terminal.common.technical_analysis import (
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import (
EXPORT_BOTH_RAW_DATA_AND_FIGURES,
check_non_negative,
check_positive,
check_positive_list,
valid_date,
@@ -72,6 +73,7 @@ class TechnicalAnalysisController(BaseController):
]
PATH = "/etf/ta/"
CHOICES_GENERATION = True
def __init__(
self,
@@ -90,112 +92,6 @@ class TechnicalAnalysisController(BaseController):
if session and obbff.USE_PROMPT_TOOLKIT:
choices: dict = {c: {} for c in self.controller_choices}
one_to_hundred: dict = {str(c): {} for c in range(1, 100)}
zero_to_hundred: dict = {str(c): {} for c in range(0, 100)}
ma = {
"--length": None,
"-l": "--length",
"--offset": zero_to_hundred,
"-o": "--offset",
}
choices["ema"] = ma
choices["sma"] = ma
choices["wma"] = ma
choices["hma"] = ma
choices["zlma"] = ma
choices["vwap"] = {
"--offset": zero_to_hundred,
"-o": "--offset",
"--start": None,
"--end": None,
}
choices["cci"] = {
"--length": one_to_hundred,
"-l": "--length",
"--scalar": None,
"-s": "--scalar",
}
choices["macd"] = {
"--fast": one_to_hundred,
"--slow": "--fast",
"--signal": "--fast",
}
choices["cci"] = {
"--length": one_to_hundred,
"-l": "--length",
"--scalar": None,
"-s": "--scalar",
"--drift": "--length",
"-d": "--drift",
}
choices["stoch"] = {
"--fastkperiod": one_to_hundred,
"-k": "--fastkperiod",
"--slowdperiod": "--fastkperiod",
"-d": "--slowdperiod",
"--slowkperiod": "--fastkperiod",
}
choices["fisher"] = {
"--length": one_to_hundred,
"-l": "--length",
}
choices["cg"] = {
"--length": one_to_hundred,
"-l": "--length",
}
choices["adx"] = {
"--length": one_to_hundred,
"-l": "--length",
"--scalar": None,
"-s": "--scalar",
"--drift": "--length",
"-d": "--drift",
}
choices["aroon"] = {
"--length": one_to_hundred,
"-l": "--length",
"--scalar": None,
"-s": "--scalar",
}
choices["bbands"] = {
"--length": one_to_hundred,
"-l": "--length",
"--std": {str(c): {} for c in np.arange(0.0, 10, 0.25)},
"-s": "--std",
"--mamode": {c: {} for c in volatility_model.MAMODES},
"-m": "--mamode",
}
choices["donchian"] = {
"--length_upper": one_to_hundred,
"-u": "--length_upper",
"--length_lower": "--length_upper",
"-l": "--length_lower",
}
choices["kc"] = {
"--length": one_to_hundred,
"-l": "--length",
"--scalar": None,
"-s": "--scalar",
"--mamode": {c: {} for c in volatility_model.MAMODES},
"-m": "--mamode",
"--offset": zero_to_hundred,
"-o": "--offset",
}
choices["ad"]["--open"] = {}
choices["adosc"] = {
"--open": {},
"--fast": one_to_hundred,
"--slow": "--fast",
}
choices["fib"] = {
"--period": {str(c): {} for c in range(1, 960)},
"--start": None,
"--end": None,
}
choices["support"] = self.SUPPORT_CHOICES
choices["about"] = self.ABOUT_CHOICES
self.completer = NestedCompleter.from_nested_dict(choices)
def print_help(self):
@@ -273,9 +169,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -325,9 +223,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -374,9 +274,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -423,9 +325,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -475,9 +379,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -513,9 +419,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
parser.add_argument(
"--start",
@@ -582,6 +490,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -631,6 +541,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=12,
help="The short period.",
choices=range(1, 100),
metavar="N_FAST",
)
parser.add_argument(
"--slow",
@@ -639,6 +551,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=26,
help="The long period.",
choices=range(1, 100),
metavar="N_SLOW",
)
parser.add_argument(
"--signal",
@@ -647,6 +561,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=9,
help="The signal period.",
choices=range(1, 100),
metavar="N_SIGNAL",
)
ns_parser = self.parse_known_args_and_warn(
@@ -686,6 +602,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -704,6 +622,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=1,
help="drift",
choices=range(1, 100),
metavar="N_DRIFT",
)
if other_args and "-" not in other_args[0][0]:
@@ -746,6 +666,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="The time period of the fastk moving average",
choices=range(1, 100),
metavar="N_FASTKPERIOD",
)
parser.add_argument(
"-d",
@@ -755,6 +677,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=3,
help="The time period of the slowd moving average",
choices=range(1, 100),
metavar="N_SLOWDPERIOD",
)
parser.add_argument(
"--slowkperiod",
@@ -763,6 +687,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=3,
help="The time period of the slowk moving average",
choices=range(1, 100),
metavar="N_SLOWKPERIOD",
)
ns_parser = self.parse_known_args_and_warn(
@@ -801,6 +727,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
if other_args and "-" not in other_args[0][0]:
@@ -840,6 +768,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
if other_args and "-" not in other_args[0][0]:
@@ -877,6 +807,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=14,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -895,6 +827,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=1,
help="drift",
choices=range(1, 100),
metavar="N_DRIFT",
)
if other_args and "-" not in other_args[0][0]:
@@ -942,6 +876,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=25,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -997,6 +933,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=15,
help="length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -1006,6 +944,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=2,
help="std",
choices=np.arange(0.0, 10, 0.25).tolist(),
metavar="N_STD",
)
parser.add_argument(
"-m",
@@ -1014,6 +954,7 @@ class TechnicalAnalysisController(BaseController):
dest="s_mamode",
default="sma",
help="mamode",
choices=volatility_model.MAMODES,
)
if other_args and "-" not in other_args[0][0]:
@@ -1056,6 +997,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=20,
help="length",
choices=range(1, 100),
metavar="N_LENGTH_UPPER",
)
parser.add_argument(
"-l",
@@ -1065,6 +1008,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=20,
help="length",
choices=range(1, 100),
metavar="N_LENGTH_LOWER",
)
ns_parser = self.parse_known_args_and_warn(
@@ -1102,6 +1047,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=20,
help="Window length",
choices=range(1, 100),
metavar="N_LENGTH",
)
parser.add_argument(
"-s",
@@ -1126,9 +1073,11 @@ class TechnicalAnalysisController(BaseController):
"--offset",
action="store",
dest="n_offset",
type=int,
type=check_non_negative,
default=0,
help="offset",
choices=range(0, 100),
metavar="N_OFFSET",
)
if other_args and "-" not in other_args[0][0]:
@@ -1218,6 +1167,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=3,
help="fast length",
choices=range(1, 100),
metavar="N_LENGTH_FAST",
)
parser.add_argument(
"--slow",
@@ -1226,6 +1177,8 @@ class TechnicalAnalysisController(BaseController):
type=check_positive,
default=10,
help="slow length",
choices=range(1, 100),
metavar="N_LENGTH_SLOW",
)
ns_parser = self.parse_known_args_and_warn(
@@ -1282,9 +1235,11 @@ class TechnicalAnalysisController(BaseController):
"-p",
"--period",
dest="period",
type=int,
type=check_positive,
help="Days to look back for retracement",
default=120,
choices=range(1, 960),
metavar="PERIOD",
)
parser.add_argument(
"--start",

View File

@@ -507,7 +507,7 @@ def test_call_func_expect_queue(expected_queue, func, queue):
[
"1",
"--std=2",
"--mamode=MOCK_MAMODE",
"--mamode=ema",
"--export=csv",
],
"volatility_view.display_bbands",
@@ -517,7 +517,7 @@ def test_call_func_expect_queue(expected_queue, func, queue):
data=MOCK_STOCK_DF,
window=1,
n_std=2,
mamode="MOCK_MAMODE",
mamode="ema",
export="csv",
),
),