From d1aa19ef078754f23ad7e5707784a4860e33f4bb Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Fri, 24 Aug 2018 17:52:51 -0400 Subject: [PATCH] initial release TODO document everything --- alphavantage/init.lua | 657 ++++++++++++++++++++++++++++++++++++++++++ readme.md | 103 +++++++ 2 files changed, 760 insertions(+) create mode 100644 alphavantage/init.lua create mode 100644 readme.md diff --git a/alphavantage/init.lua b/alphavantage/init.lua new file mode 100644 index 0000000..a91b479 --- /dev/null +++ b/alphavantage/init.lua @@ -0,0 +1,657 @@ +local https = require("ssl.https") +local bin = require("bin") +local alpha = {} +alpha.APIKey = "" +function string:split( inSplitPattern, outResults) + if not outResults then + outResults = {} + end + local theStart = 1 + local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart ) + while theSplitStart do + table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) ) + theStart = theSplitEnd + 1 + theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart ) + end + table.insert( outResults, string.sub( self, theStart ) ) + return outResults +end +function alpha.setAPIKey(key) + alpha.APIKey = key +end +function alpha.getPhysicalCurrencyList(force) + local dat = "" + if bin.fileExists("PCL.dat") and not force then + dat = bin.load("PCL.dat").data + else + dat = https.request("https://www.alphavantage.co/physical_currency_list/") + bin.new(dat):tofile("PCL.dat") + end + if alpha.pcl then return alpha.pcl end + local c = {} + local lines = dat:lines() + local a,b + for i = 2,#lines-1 do + a,b = lines[i]:match("(.-),(.+)") + c[a]=b + end + alpha.pcl = c + return c +end +function alpha.getDigitalCurrencyList(force) + local dat = "" + if bin.fileExists("DCL.dat") and not force then + dat = bin.load("DCL.dat").data + else + dat = https.request("https://www.alphavantage.co/digital_currency_list/") + bin.new(dat):tofile("DCL.dat") + end + if alpha.dcl then return alpha.dcl end + local c = {} + local lines = dat:lines() + local a,b + for i = 2,#lines-1 do + a,b = lines[i]:match("(.-),(.+)") + c[a]=b + end + alpha.dcl = c + return c +end +function alpha.dataToTable(data) + local c = {} + local order = {} + local lines = data:lines(str) + local tab = {} + local tag = lines[1]:split(",") + for i = 2,#lines-1 do + tab = lines[i]:split(",") + c[tab[1]]={} + for e = 1,#tag do + order[#order+1]=tab[1] + c[tab[1]][tag[e]]=tab[e] + end + end + c.order = order + return c +end +local function simpleparse(command,symbols,outputsize,interval) + local cmd + local data = {} + if type(symbols)=="string" then + symbols = {symbols} + end + if outputsize then + outputsize = "&outputsize="..outputsize + end + local str = "" + if interval then + str = "&interval="..interval + end + for i=1,#symbols do + cmd = "https://www.alphavantage.co/query?function="..command.."&symbol="..symbols[i].."&datatype=csv&apikey="..alpha.APIKey..outputsize..str + dat = https.request(cmd) + if dat:find("Invalid API call") then + return nil, "Invalid API call" + else + data[symbols[i]]=alpha.dataToTable(dat) + end + end + return data +end +-- api.TIME_SERIES_DAILY +function alpha.timeSeriesDaily(symbols,outputsize) + return simpleparse("TIME_SERIES_DAILY",symbols,outputsize) +end +-- api.TIME_SERIES_DAILY_ADJUSTED +function alpha.timeSeriesDailyAdjusted(symbols,outputsize) + return simpleparse("TIME_SERIES_DAILY_ADJUSTED",symbols,outputsize) +end +-- api.TIME_SERIES_WEEKLY +function alpha.timeSeriesWeekly(symbols,outputsize) + return simpleparse("TIME_SERIES_WEEKLY",symbols,outputsize) +end +-- api.TIME_SERIES_WEEKLY_ADJUSTED +function alpha.timeSeriesWeeklyAdjusted(symbols,outputsize) + return simpleparse("TIME_SERIES_WEEKLY_ADJUSTED",symbols,outputsize) +end +-- api.TIME_SERIES_MONTHLY +function alpha.timeSeriesMonthly(symbols,outputsize) + return simpleparse("TIME_SERIES_MONTHLY",symbols,outputsize) +end +-- api.TIME_SERIES_MONTHLY_ADJUSTED +function alpha.timeSeriesMonthlyAdjusted(symbols,outputsize) + return simpleparse("TIME_SERIES_MONTHLY_ADJUSTED",symbols,outputsize) +end +-- api.TIME_SERIES_INTRADAY +local _interval = { + ["1min"]=true, + ["5min"]=true, + ["15min"]=true, + ["30min"]=true, + ["60min"]=true, + ["daily"]=true, + ["monthly"]=true, + ["weekly"]=true, +} +function alpha.timeSeriesIntraday(symbols,interval,outputsize) + interval = interval or "5min" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + return simpleparse("TIME_SERIES_INTRADAY",symbols,outputsize,interval) +end + +-- api.CURRENCY_EXCHANGE_RATE +function alpha.currencyExchangeRate(from,to) + local dat = https.request("https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency="..from.."&to_currency="..to.."&apikey="..alpha.APIKey) + if dat:find("Invalid API call") then + return nil, "Invalid API call" + else + local c = {} + local lines = dat:lines() + local var,val + for i = 3,#lines-2 do + var,val = lines[i]:match("%d-%. (.-)\": \"(.-)\"") + c[(var:gsub("Currency.",""))]=tonumber(val) or val + end + return c + end +end +local function simpleFXParse(cmd,from,to,interval,outputsize) + if outputsize then + outputsize = "&outputsize="..outputsize + end + interval = interval or "" + print("https://www.alphavantage.co/query?function="..cmd.."&from_symbol="..from.."&to_symbol="..to..interval.."&apikey="..alpha.APIKey.."&datatype=csv"..outputsize) + local dat = https.request("https://www.alphavantage.co/query?function="..cmd.."&from_symbol="..from.."&to_symbol="..to..interval.."&apikey="..alpha.APIKey.."&datatype=csv"..outputsize) + if dat:find("Invalid API call") then + return nil, "Invalid API call" + else + local data = alpha.dataToTable(dat) + data.From = from + data.To = to + return data + end +end +-- api.FX_INTRADAY +function alpha.currencyExchangeIntraday(from,to,interval,outputsize) + interval = interval or "5min" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + return simpleFXParse("FX_INTRADAY",from,to,"&interval="..interval,outputsize) +end +-- api.FX_DAILY +function alpha.currencyExchangeDaily(from,to,outputsize) + return simpleFXParse("FX_DAILY",from,to,nil,outputsize) +end +-- api.FX_WEEKLY +function alpha.currencyExchangeWeekly(from,to,outputsize) + return simpleFXParse("FX_WEEKLY",from,to) +end +-- api.FX_MONTHLY +function alpha.currencyExchangeMonthly(from,to,outputsize) + return simpleFXParse("FX_MONTHLY",from,to) +end +local function simpleDigitalParse(command,symbols,market) + local data = {} + if type(symbols)=="string" then + symbols = {symbols} + end + for i=1,#symbols do + dat = https.request("https://www.alphavantage.co/query?function="..command.."&symbol="..symbols[i].."&market="..market.."&datatype=csv&apikey="..alpha.APIKey) + if dat:find("Invalid API call") then + return nil, "Invalid API call" + else + data[symbols[i]]=alpha.dataToTable(dat) + end + end + return data +end +-- api.DIGITAL_CURRENCY_INTRADAY +function alpha.digitalCurrencyIntraday(symbols,market) + return simpleDigitalParse("DIGITAL_CURRENCY_INTRADAY",symbols,market) +end +-- api.DIGITAL_CURRENCY_DAILY +function alpha.digitalCurrencyDaily(symbols,market) + return simpleDigitalParse("DIGITAL_CURRENCY_DAILY",symbols,market) +end +-- api.DIGITAL_CURRENCY_WEEKLY +function alpha.digitalCurrencyWeekly(symbols,market) + return simpleDigitalParse("DIGITAL_CURRENCY_WEEKLY",symbols,market) +end +-- api.DIGITAL_CURRENCY_MONTHLY +function alpha.digitalCurrencyMonthly(symbols,market) + return simpleDigitalParse("DIGITAL_CURRENCY_MONTHLY",symbols,market) +end +alpha.Close = "close" +alpha.Open = "open" +alpha.High = "high" +alpha.Low = "low" +local function technicalParsers(cmd,symbol,interval,time_period,series_type,t) + local extras = "" + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + for i,v in pairs(t or {}) do + extras=extras.."&"..i.."="..v + end + local data = https.request("https://www.alphavantage.co/query?function="..cmd.."&datatype=csv&symbol="..symbol.."&interval="..interval.."&time_period="..time_period.."&series_type="..series_type.."&apikey="..alpha.APIKey..extras) + if data:find("Invalid API call") then + return nil, "Invalid API call" + end + return alpha.dataToTable(data) +end +local function technicalParsers2(cmd,symbol,t) + local extras = "" + for i,v in pairs(t or {}) do + extras=extras.."&"..i.."="..v + end + local c = "https://www.alphavantage.co/query?function="..cmd.."&datatype=csv&symbol="..symbol.."&apikey="..alpha.APIKey..extras + local data = https.request(c) + if data:find("Invalid API call") then + return nil, "Invalid API call" + end + return alpha.dataToTable(data) +end +-- api.SMA +function alpha.getSMA(symbol,interval,time_period,series_type) + return technicalParsers("SMA",symbol,interval,time_period,series_type) +end +-- api.EMA +function alpha.getEMA(symbol,interval,time_period,series_type) + return technicalParsers("EMA",symbol,interval,time_period,series_type) +end +-- api.WMA +function alpha.getWMA(symbol,interval,time_period,series_type) + return technicalParsers("WMA",symbol,interval,time_period,series_type) +end +-- api.DEMA +function alpha.getDEMA(symbol,interval,time_period,series_type) + return technicalParsers("DEMA",symbol,interval,time_period,series_type) +end +-- api.TEMA +function alpha.getTEMA(symbol,interval,time_period,series_type) + return technicalParsers("TEMA",symbol,interval,time_period,series_type) +end +-- api.TRIMA +function alpha.getTRIMA(symbol,interval,time_period,series_type) + return technicalParsers("TRIMA",symbol,interval,time_period,series_type) +end +-- api.KAMA +function alpha.getKAMA(symbol,interval,time_period,series_type) + return technicalParsers("KAMA",symbol,interval,time_period,series_type) +end +-- api.MAMA +function alpha.getMAMA(symbol,interval,time_period,series_type,fastlimit,slowlimit) + return technicalParsers("MAMA",symbol,interval,time_period,series_type,{ + fastlimit=fastlimit, + slowlimit=slowlimit + }) +end +-- api.T3 +function alpha.getT3(symbol,interval,time_period,series_type) + return technicalParsers("T3",symbol,interval,time_period,series_type) +end +-- api.MACD +--fastperiod,slowperiod,signalperiod +function alpha.getMACD(symbol,interval,time_period,series_type,t) + return technicalParsers("MACD",symbol,interval,time_period,series_type,t) +end +-- api.MACDEXT +--fastperiod,slowperiod,signalperiod,fastmatype,slowmatype,signalmatype +function alpha.getMACDEXT(symbol,interval,time_period,series_type,t) + return technicalParsers("MACDEXT",symbol,interval,time_period,series_type,t) +end +-- api.STOCH +--fastkperiod,slowkperiod,slowdperiod,slowkmatype,slowdmatype +function alpha.getSTOCH(symbol,t) + return technicalParsers2("STOCH",symbol,t) +end +-- api.STOCHF +function alpha.getSTOCHF(symbol,t) + return technicalParsers2("STOCHF",symbol,t) +end +-- api.RSI +function alpha.getRSI(symbol,interval,time_period,series_type) + return technicalParsers("RSI",symbol,interval,time_period,series_type) +end +-- api.STOCHRSI +function alpha.getSTOCHRSI(symbol,interval,time_period,series_type) + return technicalParsers("STOCHRSI",symbol,interval,time_period,series_type) +end +-- api.WILLR +function alpha.getWILLR(symbol,interval,time_period,t) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("WILLR",symbol,t) +end +-- api.ADX +function alpha.getADX(symbol,interval,time_period,t) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("ADX",symbol,t) +end +-- api.ADXR +function alpha.getADXR(symbol,interval,time_period,t) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("ADXR",symbol,t) +end +-- api.APO +function alpha.getAPO(symbol,interval,time_period,series_type,t) + return technicalParsers("APO",symbol,interval,time_period,series_type,t) +end +-- api.PPO +function alpha.getPPO(symbol,interval,time_period,series_type,t) + return technicalParsers("PPO",symbol,interval,time_period,series_type,t) +end +-- api.MOM +function alpha.getMOM(symbol,interval,time_period,series_type) + return technicalParsers("MOM",symbol,interval,time_period,series_type) +end +-- api.BOP +function alpha.getBOP(symbol,interval) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("BOP",symbol,t) +end +-- api.CCI +function alpha.getCCI(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("CCI",symbol,t) +end +-- api.CMO +function alpha.getCMO(symbol,interval,time_period,series_type) + return technicalParsers("CMO",symbol,interval,time_period,series_type) +end +-- api.ROC +function alpha.getROC(symbol,interval,time_period,series_type) + return technicalParsers("ROC",symbol,interval,time_period,series_type) +end +-- api.ROCR +function alpha.getROCR(symbol,interval,time_period,series_type) + return technicalParsers("ROCR",symbol,interval,time_period,series_type) +end +-- api.AROON +function alpha.getAROON(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("AROON",symbol,t) +end +-- api.AROONOSC +function alpha.getAROONOSC(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("AROONOSC",symbol,t) +end +-- api.MFI +function alpha.getMFI(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("MFI",symbol,t) +end +-- api.TRIX +function alpha.getTRIX(symbol,interval,time_period,series_type) + return technicalParsers("TRIX",symbol,interval,time_period,series_type) +end +-- api.ULTOSC +function alpha.getULTOSC(symbol,interval,t) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("ULTOSC",symbol,t) +end +-- api.DX +function alpha.getDX(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("DX",symbol,t) +end +-- api.MINUS_DI +function alpha.getMinusDI(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("MINUS_DI",symbol,t) +end +-- api.PLUS_DI +function alpha.getPlusDI(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("PLUS_DI",symbol,t) +end +-- api.MINUS_DM +function alpha.getMinusDM(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("MINUS_DM",symbol,t) +end +-- api.PLUS_DM +function alpha.getPlusDM(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("PLUS_DM",symbol,t) +end +-- api.BBANDS +function alpha.getBBands(symbol,interval,time_period,series_type,t) + return technicalParsers("BBANDS",symbol,interval,time_period,series_type,t) +end +-- api.MIDPOINT +function alpha.getMidpoint(symbol,interval,time_period,series_type) + return technicalParsers("MIDPOINT",symbol,interval,time_period,series_type) +end +-- api.MIDPRICE +function alpha.getMidprice(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("MIDPRICE",symbol,t) +end +-- api.SAR +function alpha.getSAR(symbol,interval,t) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("SAR",symbol,t) +end +-- api.TRANGE +function alpha.getTRange(symbol,interval) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("TRANGE",symbol,t) +end +-- api.ATR +function alpha.getATR(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("ATR",symbol,t) +end +-- api.NATR +function alpha.getNATR(symbol,interval,time_period) + t = t or {} + interval = interval or "monthly" + time_period=time_period or "60" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + t.time_period=time_period + return technicalParsers2("NATR",symbol,t) +end +-- api.AD +function alpha.getAD(symbol,interval) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("AD",symbol,t) +end +-- api.ADOSC +function alpha.getADOSC(symbol,interval) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("ADOSC",symbol,t) +end +-- api.OBV +function alpha.getOBV(symbol,interval) + t = t or {} + interval = interval or "monthly" + if not _interval[interval] then + return nil,interval.." is not a supported interval that can be used" + end + t.interval=interval + return technicalParsers2("OBV",symbol,t) +end +-- api.HT_TRENDLINE +function alpha.getHTTrendLine(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_TRENDLINE",symbol,interval,time_period,series_type,t) +end +-- api.HT_SINE +function alpha.getHTSine(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_SINE",symbol,interval,time_period,series_type,t) +end +-- api.HT_TRENDMODE +function alpha.getHTTrendMode(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_TRENDMODE",symbol,interval,time_period,series_type,t) +end +-- api.HT_DCPERIOD +function alpha.getHTDCPeriod(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_DCPERIOD",symbol,interval,time_period,series_type,t) +end +-- api.HT_DCPHASE +function alpha.getHTDCPhase(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_DCPHASE",symbol,interval,time_period,series_type,t) +end +-- api.HT_PHASOR +function alpha.getHTPhasor(symbol,interval,time_period,series_type,t) + return technicalParsers("HT_PHASOR",symbol,interval,time_period,series_type,t) +end +-- api.SECTOR +function alpha.getSectorPreformance() + local raw = https.request("https://www.alphavantage.co/query?function=SECTOR&apikey="..alpha.APIKey) + raw=raw:gsub(" ","") + local c = {} + for section,data in raw:gmatch([["(.-)": {.(.-).}]]) do + _section,desc = section:match("(.-): (.+)") + if _section then + _section=_section:gsub(" ","") + section = _section + c[section]={} + c[section].Desc = desc + else + c[section]={} + end + for var,val in data:gmatch([["(.-)": "(.-)",?]]) do + c[section][var]=val + end + end + return c +end +return alpha \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..b7ebcd1 --- /dev/null +++ b/readme.md @@ -0,0 +1,103 @@ +A Lua wrapper for the alpha vantage API + +Please refer to: https://www.alphavantage.co/documentation/ for what everything does. If you find any bugs feel free to contact me. + +This requires luasec to be installed. However, luajit request is also compatible with this. Would require a bit of changes but should be easy to do. + +Until a proper documentation is made refer to the site listed above. For each method all required arguments except "function" are the arguments needed for the command to work. All optional arguments can be passed as the last argument in the function call for example: + +```lua +alpha.getBBands("MSFT","1min","60","open",{ + nbdevup = 2, + nbdevdn = 2, + matype = 0 +}) +``` +All optional values work like this. This way one could refer to the official alpha vantage documentation and still be able to use this library. +*Note:* the optional type "datatype" and "apikey" are managed automatically where applicable + + +#Usage +```lua +alpha = require("alphavantage") +alpha.setAPIKey("your-api-key") +``` + +List of methods and arguments, again for details refer to the above link, it explains it in detail. I am only going over how I wraped things. + +##alpha.setAPIKey(string: key) +Sets the API key +##alpha.getPhysicalCurrencyList(boolean: force) +returns a list of Physical Currencies +##alpha.getDigitalCurrencyList(boolean: force) +returns a list of Digital Currencies +**Note:** The above 2 function have a table format of key: "currency code" val: "name of currency". Also these functions also cache a file containing a list of currencies. Setting force to true will force the function to request a list of currencies again. +##alpha.timeSeriesDaily(symbols, outputsize) +##alpha.timeSeriesDailyAdjusted(symbols,outputsize) +##alpha.timeSeriesWeekly(symbols,outputsize) +##alpha.timeSeriesWeeklyAdjusted(symbols,outputsize) +##alpha.timeSeriesMonthly(symbols,outputsize) +##alpha.timeSeriesMonthlyAdjusted(symbols,outputsize) +##alpha.timeSeriesIntraday(symbols,interval,outputsize) +##alpha.currencyExchangeRate(from,to) +##alpha.currencyExchangeIntraday(from,to,interval,outputsize) +##alpha.currencyExchangeDaily(from,to,outputsize) +##alpha.currencyExchangeWeekly(from,to,outputsize) +##alpha.currencyExchangeMonthly(from,to,outputsize) +##alpha.digitalCurrencyIntraday(symbols,market) +##alpha.digitalCurrencyDaily(symbols,market) +##alpha.digitalCurrencyWeekly(symbols,market) +##alpha.digitalCurrencyMonthly(symbols,market) +##alpha.getSMA(symbol,interval,time_period,series_type) +##alpha.getEMA(symbol,interval,time_period,series_type) +##alpha.getWMA(symbol,interval,time_period,series_type) +##alpha.getDEMA(symbol,interval,time_period,series_type) +##alpha.getTEMA(symbol,interval,time_period,series_type) +##alpha.getTRIMA(symbol,interval,time_period,series_type) +##alpha.getKAMA(symbol,interval,time_period,series_type) +##alpha.getMAMA(symbol,interval,time_period,series_type,fastlimit,slowlimit) +##alpha.getT3(symbol,interval,time_period,series_type) +##alpha.getMACD(symbol,interval,time_period,series_type,t) +##alpha.getMACDEXT(symbol,interval,time_period,series_type,t) +##alpha.getSTOCH(symbol,t) +##alpha.getSTOCHF(symbol,t) +##alpha.getRSI(symbol,interval,time_period,series_type) +##alpha.getSTOCHRSI(symbol,interval,time_period,series_type) +##alpha.getWILLR(symbol,interval,time_period,t) +##alpha.getADX(symbol,interval,time_period,t) +##alpha.getADXR(symbol,interval,time_period,t) +##alpha.getAPO(symbol,interval,time_period,series_type,t) +##alpha.getPPO(symbol,interval,time_period,series_type,t) +##alpha.getMOM(symbol,interval,time_period,series_type) +##alpha.getBOP(symbol,interval) +##alpha.getCCI(symbol,interval,time_period) +##alpha.getCMO(symbol,interval,time_period,series_type) +##alpha.getROC(symbol,interval,time_period,series_type) +##alpha.getROCR(symbol,interval,time_period,series_type) +##alpha.getAROON(symbol,interval,time_period) +##alpha.getAROONOSC(symbol,interval,time_period) +##alpha.getMFI(symbol,interval,time_period) +##alpha.getTRIX(symbol,interval,time_period,series_type) +##alpha.getULTOSC(symbol,interval,t) +##alpha.getDX(symbol,interval,time_period) +##alpha.getMinusDI(symbol,interval,time_period) +##alpha.getPlusDI(symbol,interval,time_period) +##alpha.getMinusDM(symbol,interval,time_period) +##alpha.getPlusDM(symbol,interval,time_period) +##alpha.getBBands(symbol,interval,time_period,series_type,t) +##alpha.getMidpoint(symbol,interval,time_period,series_type) +##alpha.getMidprice(symbol,interval,time_period) +##alpha.getSAR(symbol,interval,t) +##alpha.getTRange(symbol,interval) +##alpha.getATR(symbol,interval,time_period) +##alpha.getNATR(symbol,interval,time_period) +##alpha.getAD(symbol,interval) +##alpha.getADOSC(symbol,interval) +##alpha.getOBV(symbol,interval) +##alpha.getHTTrendLine(symbol,interval,time_period,series_type,t) +##alpha.getHTSine(symbol,interval,time_period,series_type,t) +##alpha.getHTTrendMode(symbol,interval,time_period,series_type,t) +##alpha.getHTDCPeriod(symbol,interval,time_period,series_type,t) +##alpha.getHTDCPhase(symbol,interval,time_period,series_type,t) +##alpha.getHTPhasor(symbol,interval,time_period,series_type,t) +##alpha.getSectorPreformance() \ No newline at end of file