class AVInterface: """ AlphaVantage interface class, provides methods to call AlphaVantage API and return the result in useful format handling possible errors. """ def __init__(self, apiKey, config): self.read_configuration(config) self._last_call_ts = dt.datetime.now() self.TS = TimeSeries( key=apiKey, output_format="pandas", indexing_type="integer", treat_info_as_error=True, retries=0, ) self.TI = TechIndicators(key=apiKey, output_format="pandas", retries=0) logging.info("AlphaVantage initialised.") def read_configuration(self, config): self.enable = config["alpha_vantage"]["enable"] self.api_timeout = config["alpha_vantage"]["api_timeout"] def get_prices(self, market_id, interval): """ Return the price time series of the requested market with the interval granularity. Return None if the interval is invalid """ if ( interval == AVInterval.MIN_1 or interval == AVInterval.MIN_5 or interval == AVInterval.MIN_15 or interval == AVInterval.MIN_30 or interval == AVInterval.MIN_60 ): return self.intraday(market_id, interval) elif interval == AVInterval.DAILY: return self.daily(market_id) elif interval == AVInterval.WEEKLY: return self.weekly(market_id) # TODO implement monthly call else: return None def daily(self, marketId): """ Calls AlphaVantage API and return the Daily time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_daily(symbol=market, outputsize="full") return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def intraday(self, marketId, interval): """ Calls AlphaVantage API and return the Intraday time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() if interval is AVIntervals.DAILY: logging.error("AlphaVantage Intraday does not support DAILY interval") return None market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_intraday( symbol=market, interval=interval.value, outputsize="full" ) return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def weekly(self, marketId): """ Calls AlphaVantage API and return the Weekly time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_weekly(symbol=market) return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def quote_endpoint(self, market_id): """ Calls AlphaVantage API and return the Quote Endpoint data for the given market - **market_id**: string representing the market id to fetch data of - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() market = self._format_market_id(market_id) try: data, meta_data = self.TS.get_quote_endpoint( symbol=market, outputsize="full" ) return data except: logging.error("AlphaVantage wrong api call for {}".format(market)) return None # Technical indicators def macdext(self, marketId, interval): """ Calls AlphaVantage API and return the MACDEXT tech indicator series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() market = self._format_market_id(marketId) try: data, meta_data = self.TI.get_macdext( market, interval=interval.value, series_type="close", fastperiod=12, slowperiod=26, signalperiod=9, fastmatype=2, slowmatype=1, signalmatype=0, ) if data is None: return None data.index = range(len(data)) return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def macd(self, marketId, interval): """ Calls AlphaVantage API and return the MACDEXT tech indicator series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call() market = self._format_market_id(marketId) try: data, meta_data = self.TI.get_macd( market, interval=interval.value, series_type="close", fastperiod=12, slowperiod=26, signalperiod=9, ) return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None # Utils functions def _format_market_id(self, marketId): """ Convert a standard market id to be compatible with AlphaVantage API. Adds the market exchange prefix (i.e. London is LON:) """ return "{}:{}".format("LON", marketId.split("-")[0]) def _wait_before_call(self): """ Wait between API calls to not overload the server """ while (dt.datetime.now() - self._last_call_ts) <= dt.timedelta( seconds=self.api_timeout ): time.sleep(0.5) self._last_call_ts = dt.datetime.now()
class AVInterface(StocksInterface): """ AlphaVantage interface class, provides methods to call AlphaVantage API and return the result in useful format handling possible errors. """ def initialise(self) -> None: logging.info("Initialising AVInterface...") api_key = self._config.get_credentials()["av_api_key"] self.TS = TimeSeries(key=api_key, output_format="pandas", treat_info_as_error=True) self.TI = TechIndicators(key=api_key, output_format="pandas", treat_info_as_error=True) def _to_av_interval(self, interval: Interval) -> AVInterval: """ Convert the Broker Interval to AlphaVantage compatible intervals. Return the converted interval or None if a conversion is not available """ if interval == Interval.MINUTE_1: return AVInterval.MIN_1 elif interval == Interval.MINUTE_5: return AVInterval.MIN_5 elif interval == Interval.MINUTE_15: return AVInterval.MIN_15 elif interval == Interval.MINUTE_30: return AVInterval.MIN_30 elif interval == Interval.HOUR: return AVInterval.MIN_60 elif interval == Interval.DAY: return AVInterval.DAILY elif interval == Interval.WEEK: return AVInterval.WEEKLY elif interval == Interval.MONTH: return AVInterval.MONTHLY else: logging.error( "Unable to convert interval {} to AlphaVantage equivalent". format(interval.value)) raise ValueError("Unsupported Interval value: {}".format(interval)) def get_prices(self, market: Market, interval: Interval, data_range: int) -> MarketHistory: data = None av_interval = self._to_av_interval(interval) if (av_interval == AVInterval.MIN_1 or av_interval == AVInterval.MIN_5 or av_interval == AVInterval.MIN_15 or av_interval == AVInterval.MIN_30 or av_interval == AVInterval.MIN_60): data = self.intraday(market.id, av_interval) elif av_interval == AVInterval.DAILY: data = self.daily(market.id) elif av_interval == AVInterval.WEEKLY: data = self.weekly(market.id) # TODO implement monthly call else: raise ValueError("Unsupported Interval.{}".format(interval.name)) history = MarketHistory( market, data.index, data["2. high"].values, data["3. low"].values, data["4. close"].values, data["5. volume"].values, ) return history def daily(self, marketId: str) -> pandas.DataFrame: """ Calls AlphaVantage API and return the Daily time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_daily(symbol=market, outputsize="full") return data except Exception as e: print(e) logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def intraday(self, marketId: str, interval: AVInterval) -> pandas.DataFrame: """ Calls AlphaVantage API and return the Intraday time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_intraday(symbol=market, interval=interval.value, outputsize="full") return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def weekly(self, marketId: str) -> pandas.DataFrame: """ Calls AlphaVantage API and return the Weekly time series for the given market - **marketId**: string representing an AlphaVantage compatible market id - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(marketId) try: data, meta_data = self.TS.get_weekly(symbol=market) return data except Exception as e: logging.error("AlphaVantage wrong api call for {}".format(market)) logging.debug(e) logging.debug(traceback.format_exc()) logging.debug(sys.exc_info()[0]) return None def quote_endpoint(self, market_id: str) -> pandas.DataFrame: """ Calls AlphaVantage API and return the Quote Endpoint data for the given market - **market_id**: string representing the market id to fetch data of - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(market_id) try: data, meta_data = self.TS.get_quote_endpoint(symbol=market, outputsize="full") return data except Exception: logging.error("AlphaVantage wrong api call for {}".format(market)) return None # Technical indicators def get_macd(self, market: Market, interval: Interval, datapoints_range: int) -> MarketMACD: av_interval = self._to_av_interval(interval) data = self.macdext(market.id, av_interval) macd = MarketMACD( market, data.index, data["MACD"].values, data["MACD_Signal"].values, data["MACD_Hist"].values, ) return macd def macdext(self, marketId: str, interval: AVInterval) -> pandas.DataFrame: """ Calls AlphaVantage API and return the MACDEXT tech indicator series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(marketId) data, meta_data = self.TI.get_macdext( market, interval=interval.value, series_type="close", fastperiod=12, slowperiod=26, signalperiod=9, fastmatype=2, slowmatype=1, signalmatype=0, ) return data def macd(self, marketId: str, interval: AVInterval) -> pandas.DataFrame: """ Calls AlphaVantage API and return the MACDEXT tech indicator series for the given market - **marketId**: string representing an AlphaVantage compatible market id - **interval**: string representing an AlphaVantage interval type - Returns **None** if an error occurs otherwise the pandas dataframe """ self._wait_before_call(self._config.get_alphavantage_api_timeout()) market = self._format_market_id(marketId) data, meta_data = self.TI.get_macd( market, interval=interval.value, series_type="close", fastperiod=12, slowperiod=26, signalperiod=9, ) return data # Utils functions def _format_market_id(self, marketId: str) -> str: """ Convert a standard market id to be compatible with AlphaVantage API. Adds the market exchange prefix (i.e. London is LON:) """ # TODO MarketProvider/IGInterface should return marketId without "-UK" return "{}:{}".format("LON", marketId.split("-")[0])
cmo_data, meta_data = ti.get_cmo(symbol=symbol, interval=interval) dema_data, meta_data = ti.get_dema(symbol=symbol, interval=interval) dx_data, meta_data = ti.get_dx(symbol=symbol, interval=interval) ema_data, meta_data = ti.get_ema(symbol=symbol, interval=interval) ht_dcperiod_data, meta_data = ti.get_ht_dcperiod(symbol=symbol, interval=interval) ht_dcphase_data, meta_data = ti.get_ht_dcphase(symbol=symbol, interval=interval) ht_phasor_data, meta_data = ti.get_ht_phasor(symbol=symbol, interval=interval) ht_sine_data, meta_data = ti.get_ht_sine(symbol=symbol, interval=interval) ht_trendline_data, meta_data = ti.get_ht_trendline(symbol=symbol, interval=interval) ht_trendmode_data, meta_data = ti.get_ht_trendmode(symbol=symbol, interval=interval) print("Progress: 40% complete...") kama_data, meta_data = ti.get_kama(symbol=symbol, interval=interval) macd_data, meta_data = ti.get_macd(symbol=symbol, interval=interval) macdext_data, meta_data = ti.get_macdext(symbol=symbol, interval=interval) mama_data, meta_data = ti.get_mama(symbol=symbol, interval=interval) mfi_data, meta_data = ti.get_mfi(symbol=symbol, interval=interval) midpoint_data, meta_data = ti.get_midpoint(symbol=symbol, interval=interval) midprice_data, meta_data = ti.get_midprice(symbol=symbol, interval=interval) minus_di_data, meta_data = ti.get_minus_di(symbol=symbol, interval=interval) mom_data, meta_data = ti.get_mom(symbol=symbol, interval=interval) natr_data, meta_data = ti.get_natr(symbol=symbol, interval=interval) print("Progress: 60% complete...") obv_data, meta_data = ti.get_obv(symbol=symbol, interval=interval) plus_di_data, meta_data = ti.get_plus_di(symbol=symbol, interval=interval) plus_dm_data, meta_data = ti.get_plus_dm(symbol=symbol, interval=interval) ppo_data, meta_data = ti.get_ppo(symbol=symbol, interval=interval) roc_data, meta_data = ti.get_roc(symbol=symbol, interval=interval)
def techIndicatorPull(symbol): interval = "1min" print("Calculating Tech Indicators ...") ti = TechIndicators(key='1HAYLUHGCB6E0VXC', output_format='pandas') print("Progress: 0% complete...") ad_data, meta_data = ti.get_ad(symbol=symbol, interval=interval) adosc_data, meta_data = ti.get_adosc(symbol=symbol, interval=interval) adx_data, meta_data = ti.get_adx(symbol=symbol, interval=interval) adxr_data, meta_data = ti.get_adxr(symbol=symbol, interval=interval) apo_data, meta_data = ti.get_apo(symbol=symbol, interval=interval) aroon_data, meta_data = ti.get_aroon(symbol=symbol, interval=interval) aroonosc_data, meta_data = ti.get_aroonosc(symbol=symbol, interval=interval) atr_data, meta_data = ti.get_atr(symbol=symbol, interval=interval) bop_data, meta_data = ti.get_bop(symbol=symbol, interval=interval) cci_data, meta_data = ti.get_cci(symbol=symbol, interval=interval) print("Progress: 20% complete...") cmo_data, meta_data = ti.get_cmo(symbol=symbol, interval=interval) dema_data, meta_data = ti.get_dema(symbol=symbol, interval=interval) dx_data, meta_data = ti.get_dx(symbol=symbol, interval=interval) ema_data, meta_data = ti.get_ema(symbol=symbol, interval=interval) ht_dcperiod_data, meta_data = ti.get_ht_dcperiod(symbol=symbol, interval=interval) ht_dcphase_data, meta_data = ti.get_ht_dcphase(symbol=symbol, interval=interval) ht_phasor_data, meta_data = ti.get_ht_phasor(symbol=symbol, interval=interval) ht_sine_data, meta_data = ti.get_ht_sine(symbol=symbol, interval=interval) ht_trendline_data, meta_data = ti.get_ht_trendline(symbol=symbol, interval=interval) ht_trendmode_data, meta_data = ti.get_ht_trendmode(symbol=symbol, interval=interval) print("Progress: 40% complete...") kama_data, meta_data = ti.get_kama(symbol=symbol, interval=interval) macd_data, meta_data = ti.get_macd(symbol=symbol, interval=interval) macdext_data, meta_data = ti.get_macdext(symbol=symbol, interval=interval) mama_data, meta_data = ti.get_mama(symbol=symbol, interval=interval) mfi_data, meta_data = ti.get_mfi(symbol=symbol, interval=interval) midpoint_data, meta_data = ti.get_midpoint(symbol=symbol, interval=interval) midprice_data, meta_data = ti.get_midprice(symbol=symbol, interval=interval) minus_di_data, meta_data = ti.get_minus_di(symbol=symbol, interval=interval) mom_data, meta_data = ti.get_mom(symbol=symbol, interval=interval) natr_data, meta_data = ti.get_natr(symbol=symbol, interval=interval) print("Progress: 60% complete...") obv_data, meta_data = ti.get_obv(symbol=symbol, interval=interval) plus_di_data, meta_data = ti.get_plus_di(symbol=symbol, interval=interval) plus_dm_data, meta_data = ti.get_plus_dm(symbol=symbol, interval=interval) ppo_data, meta_data = ti.get_ppo(symbol=symbol, interval=interval) roc_data, meta_data = ti.get_roc(symbol=symbol, interval=interval) rocr_data, meta_data = ti.get_rocr(symbol=symbol, interval=interval) rsi_data, meta_data = ti.get_rsi(symbol=symbol, interval=interval) sar_data, meta_data = ti.get_sar(symbol=symbol, interval=interval) sma_data, meta_data = ti.get_sma(symbol=symbol, interval=interval) stoch_data, meta_data = ti.get_stoch(symbol=symbol, interval=interval) print("Progress: 80% complete...") stochf_data, meta_data = ti.get_stochf(symbol=symbol, interval=interval) stochrsi_data, meta_data = ti.get_stochrsi(symbol=symbol, interval=interval) t3_data, meta_data = ti.get_t3(symbol=symbol, interval=interval) tema_data, meta_data = ti.get_tema(symbol=symbol, interval=interval) trange_data, meta_data = ti.get_trange(symbol=symbol, interval=interval) trima_data, meta_data = ti.get_trima(symbol=symbol, interval=interval) trix_data, meta_data = ti.get_trix(symbol=symbol, interval=interval) ultsoc_data, meta_data = ti.get_ultsoc(symbol=symbol, interval=interval) willr_data, meta_data = ti.get_willr(symbol=symbol, interval=interval) wma_data, meta_data = ti.get_wma(symbol=symbol, interval=interval) bbands_data, meta_data = ti.get_bbands(symbol=symbol, interval=interval) print("Progress: 90% complete...") result = pd.concat([ ad_data, adosc_data, adx_data, adxr_data, apo_data, aroon_data, aroonosc_data, atr_data, bop_data, cci_data, cmo_data, dema_data, dx_data, ema_data, ht_dcperiod_data, ht_dcphase_data, ht_phasor_data, ht_sine_data, ht_trendline_data, ht_trendmode_data, kama_data, macd_data, macdext_data, mama_data, mfi_data, midpoint_data, midprice_data, minus_di_data, mom_data, natr_data, obv_data, plus_di_data, plus_dm_data, ppo_data, roc_data, rocr_data, rsi_data, sar_data, sma_data, stoch_data, stochf_data, stochrsi_data, t3_data, tema_data, trange_data, trima_data, trix_data, ultsoc_data, willr_data, wma_data, bbands_data ], axis=1) result["stockticker"] = symbol result = result.reindex(result.index.rename('timestamp')) result = result.dropna(axis=0, how='any') result = result.round(2) result = result.rename( columns={ 'Chaikin A/D': 'ChaikinAD', 'Aroon Up': 'AroonUp', 'Aroon Down': 'AroonDown', 'LEAD SINE': 'LeadSine', 'Real Upper Band': 'RealUpperBand', 'Real Middle Band': 'RealMiddleBand', 'Real Lower Band': 'RealLowerBand' }) fd = open('results/rawTechIndicatorData.csv', 'w') result.to_csv(fd, index=True, encoding='utf-8') fd.close() print("Progress: 99% complete...") df = pd.read_csv('results/rawTechIndicatorData.csv') insertToOracleDatabase( df, '''insert /*+ ignore_row_on_dupkey_index(stocktechindicator, stocktechindicator_pk) */ into stocktechindicator (timestamp,ChaikinAD,ADOSC,ADX,ADXR, APO,AroonUp,AroonDown,AROONOSC,ATR, BOP,CCI,CMO,DEMA,DX, EMA,DCPERIOD,HT_DCPHASE,QUADRATURE, PHASE, LEADSINE,SINE,HT_TRENDLINE,TRENDMODE,KAMA, MACD,MACD_Hist,MACD_Signal,MACD_Signal2,MACD2, MACD_Hist2,FAMA,MAMA,MFI,MIDPOINT, MIDPRICE,MINUS_DI,MOM,NATR,OBV, PLUS_DI,PLUS_DM,PPO,ROC,ROCR, RSI,SAR,SMA,SlowK,SlowD, FastK,FastD,FastK2,FastD2,T3, TEMA,TRANGE,TRIMA,TRIX,ULTOSC, WILLR,WMA,RealLowerBand,RealUpperBand,RealMiddleBand, stockticker) values (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24, :25, :26, :27, :28, :29, :30, :31, :32, :33, :34, :35, :36, :37, :38, :39, :40, :41, :42, :43, :44, :45, :46, :47, :48, :49, :50, :51, :52, :53, :54, :55, :56, :57, :58, :59, :60, :61, :62, :63, :64, :65, :66)''')
def save_ti(ticker, interval='daily'): ti = TechIndicators(key='WS8K5VM8FZL52BTH', output_format='pandas') ti.get_sma( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_sma.csv') call_check() ti.get_ema( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_ema.csv') call_check() ti.get_wma( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_wma.csv') call_check() ti.get_dema( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_dema.csv') call_check() ti.get_tema( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_tema.csv') call_check() ti.get_trima( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_trima.csv') call_check() ti.get_kama( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_kama.csv') call_check() ti.get_mama( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_mama.csv') call_check() ti.get_t3( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_t3.csv') call_check() ti.get_macd( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_macd.csv') call_check() ti.get_macdext( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_macdext.csv') call_check() ti.get_stoch( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_stoch.csv') call_check() ti.get_stochf( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_stochf.csv') call_check() ti.get_rsi( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_rsi.csv') call_check() ti.get_stochrsi(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_stochris.csv') call_check() ti.get_willr( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_willr.csv') call_check() ti.get_adx( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_adx.csv') call_check() ti.get_adxr( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_adxr.csv') call_check() ti.get_apo( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_apo.csv') call_check() ti.get_ppo( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_ppo.csv') call_check() ti.get_mom( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_mom.csv') call_check() ti.get_bop( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_bop.csv') call_check() ti.get_cci( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_cci.csv') call_check() ti.get_cmo( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_cmo.csv') call_check() ti.get_roc( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_roc.csv') call_check() ti.get_rocr( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_rocr.csv') call_check() ti.get_aroon( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_aroon.csv') call_check() ti.get_aroonosc(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_aroonosc.csv') call_check() ti.get_mfi( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_mfi.csv') call_check() ti.get_trix( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_trix.csv') call_check() ti.get_ultosc( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_ultosc.csv') call_check() ti.get_dx( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_dx.csv') call_check() ti.get_minus_di(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_minus_di.csv') call_check() ti.get_plus_di( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_plus_di.csv') call_check() ti.get_minus_dm(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_minus_dm.csv') call_check() ti.get_plus_dm( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_plus_dm.csv') call_check() ti.get_bbands( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_bbands.csv') call_check() ti.get_midpoint(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_midpoint.csv') call_check() ti.get_midprice(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_midprice.csv') call_check() ti.get_sar( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_sar.csv') call_check() ti.get_trange( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_trange.csv') call_check() ti.get_atr( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_atr.csv') call_check() ti.get_natr( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_natr.csv') call_check() ti.get_ad( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_ad.csv') call_check() ti.get_adosc( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_adosc.csv') call_check() ti.get_obv( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_obv.csv') call_check() ti.get_ht_trendline(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_ht_trendline.csv') call_check() ti.get_ht_sine( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_ht_sine.csv') call_check() ti.get_ht_trendmode(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_ht_trendmode.csv') call_check() ti.get_ht_dcperiod(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_dcperiod.csv') call_check() ti.get_ht_dcphase( ticker, interval)[0].to_csv(f'./Stock Data/TI/{ticker}_{interval}_dcphase.csv') call_check() ti.get_ht_phasor(ticker, interval)[0].to_csv( f'./Stock Data/TI/{ticker}_{interval}_ht_phasor.csv')