stocks 0.1.0.0 → 0.2.0.0
raw patch · 27 files changed
+1115/−110 lines, 27 filesdep +HUnitdep +containersdep +stocksdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: HUnit, containers, stocks, unordered-containers
Dependency ranges changed: base
API changes (from Hackage documentation)
- Net.Stocks: Financials :: String -> Int -> Int -> Int -> Financials
- Net.Stocks: FinancialsList :: NonEmpty Financials -> FinancialsList
- Net.Stocks: QueryFinancials :: QueryType
- Net.Stocks: QueryPeers :: QueryType
- Net.Stocks: QueryPrice :: QueryType
- Net.Stocks: QueryStocks :: QueryType
- Net.Stocks: Stock :: String -> Float -> String -> Float -> Stock
- Net.Stocks: [cashFlow] :: Financials -> Int
- Net.Stocks: [changePercent] :: Stock -> Float
- Net.Stocks: [costOfRevenue] :: Financials -> Int
- Net.Stocks: [financialsList] :: FinancialsList -> NonEmpty Financials
- Net.Stocks: [grossProfit] :: Financials -> Int
- Net.Stocks: [latestPrice] :: Stock -> Float
- Net.Stocks: [latestTime] :: Stock -> String
- Net.Stocks: [reportDate] :: Financials -> String
- Net.Stocks: data Financials
- Net.Stocks: data QueryType
- Net.Stocks: data Stock
- Net.Stocks: financialsQuery :: Company -> String
- Net.Stocks: getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)
- Net.Stocks: getNonJSONData :: String -> QueryType -> IO ByteString
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Financials
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.FinancialsList
- Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Stock
- Net.Stocks: instance GHC.Show.Show Net.Stocks.Financials
- Net.Stocks: instance GHC.Show.Show Net.Stocks.Stock
- Net.Stocks: newtype FinancialsList
- Net.Stocks: peersQuery :: Company -> String
- Net.Stocks: priceQuery :: Company -> String
- Net.Stocks: stocksQuery :: Company -> String
- Net.Stocks: type Company = String
+ Net.IEX.Book: Book :: Quote -> Maybe [Trade] -> Maybe [Trade] -> [Trade] -> Book
+ Net.IEX.Book: [asks] :: Book -> Maybe [Trade]
+ Net.IEX.Book: [bids] :: Book -> Maybe [Trade]
+ Net.IEX.Book: [quote] :: Book -> Quote
+ Net.IEX.Book: [trades] :: Book -> [Trade]
+ Net.IEX.Book: data Book
+ Net.IEX.Book: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Book.Book
+ Net.IEX.Book: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Book.Trade
+ Net.IEX.Book: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Book.Book
+ Net.IEX.Book: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Classes.Eq Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Classes.Eq Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Generics.Generic Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Generics.Generic Net.IEX.Book.Trade
+ Net.IEX.Book: instance GHC.Show.Show Net.IEX.Book.Book
+ Net.IEX.Book: instance GHC.Show.Show Net.IEX.Book.Trade
+ Net.IEX.Chart: Chart :: Maybe String -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe [Integer] -> Double -> Double -> Integer -> String -> Double -> Maybe String -> Maybe Double -> Maybe Double -> Maybe Integer -> Maybe Double -> Maybe Double -> Maybe Double -> Chart
+ Net.IEX.Chart: [average] :: Chart -> Maybe Double
+ Net.IEX.Chart: [changeOverTime] :: Chart -> Double
+ Net.IEX.Chart: [changePercent] :: Chart -> Maybe Double
+ Net.IEX.Chart: [change] :: Chart -> Maybe Double
+ Net.IEX.Chart: [close] :: Chart -> Maybe Double
+ Net.IEX.Chart: [date] :: Chart -> Maybe String
+ Net.IEX.Chart: [high] :: Chart -> Double
+ Net.IEX.Chart: [label] :: Chart -> String
+ Net.IEX.Chart: [low] :: Chart -> Double
+ Net.IEX.Chart: [marketAverage] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketChangeOverTime] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketHigh] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketLow] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketNotional] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketNumberOfTrades] :: Chart -> Maybe Double
+ Net.IEX.Chart: [marketVolume] :: Chart -> Maybe Double
+ Net.IEX.Chart: [minute] :: Chart -> Maybe String
+ Net.IEX.Chart: [notional] :: Chart -> Maybe Double
+ Net.IEX.Chart: [numberOfTrades] :: Chart -> Maybe Double
+ Net.IEX.Chart: [open] :: Chart -> Maybe Double
+ Net.IEX.Chart: [simplifyFactor] :: Chart -> Maybe [Integer]
+ Net.IEX.Chart: [unadjustedVolume] :: Chart -> Maybe Integer
+ Net.IEX.Chart: [volume] :: Chart -> Integer
+ Net.IEX.Chart: [vwap] :: Chart -> Maybe Double
+ Net.IEX.Chart: data Chart
+ Net.IEX.Chart: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Classes.Eq Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Generics.Generic Net.IEX.Chart.Chart
+ Net.IEX.Chart: instance GHC.Show.Show Net.IEX.Chart.Chart
+ Net.IEX.Company: Company :: String -> String -> String -> String -> String -> String -> String -> String -> String -> Company
+ Net.IEX.Company: [ceo] :: Company -> String
+ Net.IEX.Company: [companyName] :: Company -> String
+ Net.IEX.Company: [description] :: Company -> String
+ Net.IEX.Company: [exchange] :: Company -> String
+ Net.IEX.Company: [industry] :: Company -> String
+ Net.IEX.Company: [issueType] :: Company -> String
+ Net.IEX.Company: [sector] :: Company -> String
+ Net.IEX.Company: [symbol] :: Company -> String
+ Net.IEX.Company: [website] :: Company -> String
+ Net.IEX.Company: data Company
+ Net.IEX.Company: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Company.Company
+ Net.IEX.Company: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Classes.Eq Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Generics.Generic Net.IEX.Company.Company
+ Net.IEX.Company: instance GHC.Show.Show Net.IEX.Company.Company
+ Net.IEX.DelayedQuote: DelayedQuote :: String -> Double -> Double -> Double -> Double -> Integer -> Integer -> DelayedQuote
+ Net.IEX.DelayedQuote: [delayedPriceTime] :: DelayedQuote -> Integer
+ Net.IEX.DelayedQuote: [delayedPrice] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [delayedSize] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [high] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [low] :: DelayedQuote -> Double
+ Net.IEX.DelayedQuote: [processedTime] :: DelayedQuote -> Integer
+ Net.IEX.DelayedQuote: [symbol] :: DelayedQuote -> String
+ Net.IEX.DelayedQuote: data DelayedQuote
+ Net.IEX.DelayedQuote: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Classes.Eq Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Generics.Generic Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.DelayedQuote: instance GHC.Show.Show Net.IEX.DelayedQuote.DelayedQuote
+ Net.IEX.Dividend: Dividend :: String -> String -> String -> String -> Double -> String -> String -> String -> String -> Dividend
+ Net.IEX.Dividend: [amount] :: Dividend -> Double
+ Net.IEX.Dividend: [declaredDate] :: Dividend -> String
+ Net.IEX.Dividend: [dtype] :: Dividend -> String
+ Net.IEX.Dividend: [exDate] :: Dividend -> String
+ Net.IEX.Dividend: [flag] :: Dividend -> String
+ Net.IEX.Dividend: [indicated] :: Dividend -> String
+ Net.IEX.Dividend: [paymentDate] :: Dividend -> String
+ Net.IEX.Dividend: [qualified] :: Dividend -> String
+ Net.IEX.Dividend: [recordDate] :: Dividend -> String
+ Net.IEX.Dividend: data Dividend
+ Net.IEX.Dividend: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Classes.Eq Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Generics.Generic Net.IEX.Dividend.Dividend
+ Net.IEX.Dividend: instance GHC.Show.Show Net.IEX.Dividend.Dividend
+ Net.IEX.Earnings: Earning :: Double -> Double -> Double -> String -> Integer -> Double -> String -> String -> String -> Earning
+ Net.IEX.Earnings: Earnings :: String -> [Earning] -> Earnings
+ Net.IEX.Earnings: [actualEPS] :: Earning -> Double
+ Net.IEX.Earnings: [announceTime] :: Earning -> String
+ Net.IEX.Earnings: [consensusEPS] :: Earning -> Double
+ Net.IEX.Earnings: [earnings] :: Earnings -> [Earning]
+ Net.IEX.Earnings: [epsReportDate] :: Earning -> String
+ Net.IEX.Earnings: [epsSurpriseDollar] :: Earning -> Double
+ Net.IEX.Earnings: [estimatedEPS] :: Earning -> Double
+ Net.IEX.Earnings: [fiscalEndDate] :: Earning -> String
+ Net.IEX.Earnings: [fiscalPeriod] :: Earning -> String
+ Net.IEX.Earnings: [numberOfEstimates] :: Earning -> Integer
+ Net.IEX.Earnings: [symbol] :: Earnings -> String
+ Net.IEX.Earnings: data Earning
+ Net.IEX.Earnings: data Earnings
+ Net.IEX.Earnings: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Classes.Eq Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Classes.Eq Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Generics.Generic Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Generics.Generic Net.IEX.Earnings.Earnings
+ Net.IEX.Earnings: instance GHC.Show.Show Net.IEX.Earnings.Earning
+ Net.IEX.Earnings: instance GHC.Show.Show Net.IEX.Earnings.Earnings
+ Net.IEX.EffectiveSpread: EffectiveSpread :: Integer -> String -> String -> Double -> Double -> Double -> EffectiveSpread
+ Net.IEX.EffectiveSpread: [effectiveQuoted] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [effectiveSpread] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [priceImprovement] :: EffectiveSpread -> Double
+ Net.IEX.EffectiveSpread: [venueName] :: EffectiveSpread -> String
+ Net.IEX.EffectiveSpread: [venue] :: EffectiveSpread -> String
+ Net.IEX.EffectiveSpread: [volume] :: EffectiveSpread -> Integer
+ Net.IEX.EffectiveSpread: data EffectiveSpread
+ Net.IEX.EffectiveSpread: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Classes.Eq Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Generics.Generic Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.EffectiveSpread: instance GHC.Show.Show Net.IEX.EffectiveSpread.EffectiveSpread
+ Net.IEX.Financials: Financial :: String -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Maybe Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Maybe String -> Financial
+ Net.IEX.Financials: Financials :: String -> [Financial] -> Financials
+ Net.IEX.Financials: [cashChange] :: Financial -> Integer
+ Net.IEX.Financials: [cashFlow] :: Financial -> Integer
+ Net.IEX.Financials: [costOfRevenue] :: Financial -> Integer
+ Net.IEX.Financials: [currentAssets] :: Financial -> Integer
+ Net.IEX.Financials: [currentCash] :: Financial -> Integer
+ Net.IEX.Financials: [currentDebt] :: Financial -> Integer
+ Net.IEX.Financials: [financials] :: Financials -> [Financial]
+ Net.IEX.Financials: [grossProfit] :: Financial -> Integer
+ Net.IEX.Financials: [netIncome] :: Financial -> Integer
+ Net.IEX.Financials: [operatingExpense] :: Financial -> Integer
+ Net.IEX.Financials: [operatingGainsLosses] :: Financial -> Maybe String
+ Net.IEX.Financials: [operatingIncome] :: Financial -> Integer
+ Net.IEX.Financials: [operatingRevenue] :: Financial -> Integer
+ Net.IEX.Financials: [reportDate] :: Financial -> String
+ Net.IEX.Financials: [researchAndDevelopment] :: Financial -> Integer
+ Net.IEX.Financials: [shareholderEquity] :: Financial -> Integer
+ Net.IEX.Financials: [symbol] :: Financials -> String
+ Net.IEX.Financials: [totalAssets] :: Financial -> Integer
+ Net.IEX.Financials: [totalCash] :: Financial -> Integer
+ Net.IEX.Financials: [totalDebt] :: Financial -> Integer
+ Net.IEX.Financials: [totalLiabilities] :: Financial -> Maybe Integer
+ Net.IEX.Financials: [totalRevenue] :: Financial -> Integer
+ Net.IEX.Financials: data Financial
+ Net.IEX.Financials: data Financials
+ Net.IEX.Financials: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Classes.Eq Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Classes.Eq Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Generics.Generic Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Generics.Generic Net.IEX.Financials.Financials
+ Net.IEX.Financials: instance GHC.Show.Show Net.IEX.Financials.Financial
+ Net.IEX.Financials: instance GHC.Show.Show Net.IEX.Financials.Financials
+ Net.IEX.IntraDayStats: IntraDayStats :: IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDaySub -> IntraDayStats
+ Net.IEX.IntraDayStats: IntraDaySub :: Maybe Double -> Integer -> IntraDaySub
+ Net.IEX.IntraDayStats: [lastUpdated] :: IntraDaySub -> Integer
+ Net.IEX.IntraDayStats: [marketShare] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [notional] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [routedVolume] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [symbolsTraded] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: [value] :: IntraDaySub -> Maybe Double
+ Net.IEX.IntraDayStats: [volume] :: IntraDayStats -> IntraDaySub
+ Net.IEX.IntraDayStats: data IntraDayStats
+ Net.IEX.IntraDayStats: data IntraDaySub
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Classes.Eq Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Classes.Eq Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Generics.Generic Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Generics.Generic Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.IntraDayStats: instance GHC.Show.Show Net.IEX.IntraDayStats.IntraDayStats
+ Net.IEX.IntraDayStats: instance GHC.Show.Show Net.IEX.IntraDayStats.IntraDaySub
+ Net.IEX.Market: Market :: String -> String -> String -> Integer -> Integer -> Integer -> Integer -> Double -> Integer -> Market
+ Net.IEX.Market: [lastUpdated] :: Market -> Integer
+ Net.IEX.Market: [marketPercent] :: Market -> Double
+ Net.IEX.Market: [mic] :: Market -> String
+ Net.IEX.Market: [tapeA] :: Market -> Integer
+ Net.IEX.Market: [tapeB] :: Market -> Integer
+ Net.IEX.Market: [tapeC] :: Market -> Integer
+ Net.IEX.Market: [tapeId] :: Market -> String
+ Net.IEX.Market: [venueName] :: Market -> String
+ Net.IEX.Market: [volume] :: Market -> Integer
+ Net.IEX.Market: data Market
+ Net.IEX.Market: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Market.Market
+ Net.IEX.Market: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Classes.Eq Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Generics.Generic Net.IEX.Market.Market
+ Net.IEX.Market: instance GHC.Show.Show Net.IEX.Market.Market
+ Net.IEX.NewsItem: NewsItem :: String -> String -> String -> String -> String -> String -> NewsItem
+ Net.IEX.NewsItem: [datetime] :: NewsItem -> String
+ Net.IEX.NewsItem: [headline] :: NewsItem -> String
+ Net.IEX.NewsItem: [related] :: NewsItem -> String
+ Net.IEX.NewsItem: [source] :: NewsItem -> String
+ Net.IEX.NewsItem: [summary] :: NewsItem -> String
+ Net.IEX.NewsItem: [url] :: NewsItem -> String
+ Net.IEX.NewsItem: data NewsItem
+ Net.IEX.NewsItem: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Classes.Eq Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Generics.Generic Net.IEX.NewsItem.NewsItem
+ Net.IEX.NewsItem: instance GHC.Show.Show Net.IEX.NewsItem.NewsItem
+ Net.IEX.OHLC: OHLC :: PriceTime -> PriceTime -> Double -> Double -> OHLC
+ Net.IEX.OHLC: [close] :: OHLC -> PriceTime
+ Net.IEX.OHLC: [high] :: OHLC -> Double
+ Net.IEX.OHLC: [low] :: OHLC -> Double
+ Net.IEX.OHLC: [open] :: OHLC -> PriceTime
+ Net.IEX.OHLC: data OHLC
+ Net.IEX.OHLC: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Classes.Eq Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Generics.Generic Net.IEX.OHLC.OHLC
+ Net.IEX.OHLC: instance GHC.Show.Show Net.IEX.OHLC.OHLC
+ Net.IEX.Previous: Previous :: String -> String -> Double -> Double -> Double -> Double -> Integer -> Integer -> Double -> Double -> Double -> Previous
+ Net.IEX.Previous: [changePercent] :: Previous -> Double
+ Net.IEX.Previous: [change] :: Previous -> Double
+ Net.IEX.Previous: [close] :: Previous -> Double
+ Net.IEX.Previous: [date] :: Previous -> String
+ Net.IEX.Previous: [high] :: Previous -> Double
+ Net.IEX.Previous: [low] :: Previous -> Double
+ Net.IEX.Previous: [open] :: Previous -> Double
+ Net.IEX.Previous: [symbol] :: Previous -> String
+ Net.IEX.Previous: [unadjustedVolume] :: Previous -> Integer
+ Net.IEX.Previous: [volume] :: Previous -> Integer
+ Net.IEX.Previous: [vwap] :: Previous -> Double
+ Net.IEX.Previous: data Previous
+ Net.IEX.Previous: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Classes.Eq Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Generics.Generic Net.IEX.Previous.Previous
+ Net.IEX.Previous: instance GHC.Show.Show Net.IEX.Previous.Previous
+ Net.IEX.PriceTime: PriceTime :: Double -> Integer -> PriceTime
+ Net.IEX.PriceTime: [price] :: PriceTime -> Double
+ Net.IEX.PriceTime: [time] :: PriceTime -> Integer
+ Net.IEX.PriceTime: data PriceTime
+ Net.IEX.PriceTime: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Classes.Eq Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Generics.Generic Net.IEX.PriceTime.PriceTime
+ Net.IEX.PriceTime: instance GHC.Show.Show Net.IEX.PriceTime.PriceTime
+ Net.IEX.Quote: Quote :: String -> String -> String -> String -> String -> Double -> Integer -> Double -> Integer -> Double -> Double -> Double -> String -> String -> Integer -> Integer -> Maybe Double -> Maybe Integer -> Maybe Integer -> Double -> Integer -> Double -> Double -> Double -> Maybe Double -> Maybe Integer -> Integer -> Maybe Double -> Maybe Integer -> Maybe Double -> Maybe Integer -> Integer -> Double -> Double -> Double -> Double -> Quote
+ Net.IEX.Quote: [avgTotalVolume] :: Quote -> Integer
+ Net.IEX.Quote: [calculationPrice] :: Quote -> String
+ Net.IEX.Quote: [changePercent] :: Quote -> Double
+ Net.IEX.Quote: [change] :: Quote -> Double
+ Net.IEX.Quote: [closeTime] :: Quote -> Integer
+ Net.IEX.Quote: [close] :: Quote -> Double
+ Net.IEX.Quote: [companyName] :: Quote -> String
+ Net.IEX.Quote: [delayedPriceTime] :: Quote -> Integer
+ Net.IEX.Quote: [delayedPrice] :: Quote -> Double
+ Net.IEX.Quote: [high] :: Quote -> Double
+ Net.IEX.Quote: [iexAskPrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexAskSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexBidPrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexBidSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexLastUpdated] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexMarketPercent] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexRealtimePrice] :: Quote -> Maybe Double
+ Net.IEX.Quote: [iexRealtimeSize] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [iexVolume] :: Quote -> Maybe Integer
+ Net.IEX.Quote: [latestPrice] :: Quote -> Double
+ Net.IEX.Quote: [latestSource] :: Quote -> String
+ Net.IEX.Quote: [latestTime] :: Quote -> String
+ Net.IEX.Quote: [latestUpdate] :: Quote -> Integer
+ Net.IEX.Quote: [latestVolume] :: Quote -> Integer
+ Net.IEX.Quote: [low] :: Quote -> Double
+ Net.IEX.Quote: [marketCap] :: Quote -> Integer
+ Net.IEX.Quote: [openTime] :: Quote -> Integer
+ Net.IEX.Quote: [open] :: Quote -> Double
+ Net.IEX.Quote: [peRatio] :: Quote -> Double
+ Net.IEX.Quote: [previousClose] :: Quote -> Double
+ Net.IEX.Quote: [primaryExchange] :: Quote -> String
+ Net.IEX.Quote: [sector] :: Quote -> String
+ Net.IEX.Quote: [symbol] :: Quote -> String
+ Net.IEX.Quote: [week52High] :: Quote -> Double
+ Net.IEX.Quote: [week52Low] :: Quote -> Double
+ Net.IEX.Quote: [ytdChange] :: Quote -> Double
+ Net.IEX.Quote: data Quote
+ Net.IEX.Quote: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Classes.Eq Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Generics.Generic Net.IEX.Quote.Quote
+ Net.IEX.Quote: instance GHC.Show.Show Net.IEX.Quote.Quote
+ Net.IEX.RecentStats: RecentStats :: String -> Integer -> Integer -> Double -> Bool -> Integer -> RecentStats
+ Net.IEX.RecentStats: [date] :: RecentStats -> String
+ Net.IEX.RecentStats: [isHalfday] :: RecentStats -> Bool
+ Net.IEX.RecentStats: [litVolume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: [marketShare] :: RecentStats -> Double
+ Net.IEX.RecentStats: [routedVolume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: [volume] :: RecentStats -> Integer
+ Net.IEX.RecentStats: data RecentStats
+ Net.IEX.RecentStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Classes.Eq Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Generics.Generic Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecentStats: instance GHC.Show.Show Net.IEX.RecentStats.RecentStats
+ Net.IEX.RecordStats: RecordStats :: RecordStatsSub -> RecordStatsSub -> RecordStatsSub -> RecordStatsSub -> RecordStats
+ Net.IEX.RecordStats: RecordStatsSub :: Double -> String -> Double -> Double -> RecordStatsSub
+ Net.IEX.RecordStats: [avg30Value] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [notional] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [previousDayValue] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [recordDate] :: RecordStatsSub -> String
+ Net.IEX.RecordStats: [recordValue] :: RecordStatsSub -> Double
+ Net.IEX.RecordStats: [routedVolume] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [symbolsTraded] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: [volume] :: RecordStats -> RecordStatsSub
+ Net.IEX.RecordStats: data RecordStats
+ Net.IEX.RecordStats: data RecordStatsSub
+ Net.IEX.RecordStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Classes.Eq Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Classes.Eq Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Generics.Generic Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Generics.Generic Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.RecordStats: instance GHC.Show.Show Net.IEX.RecordStats.RecordStats
+ Net.IEX.RecordStats: instance GHC.Show.Show Net.IEX.RecordStats.RecordStatsSub
+ Net.IEX.Relevant: Relevant :: Bool -> [String] -> Relevant
+ Net.IEX.Relevant: [peers] :: Relevant -> Bool
+ Net.IEX.Relevant: [symbols] :: Relevant -> [String]
+ Net.IEX.Relevant: data Relevant
+ Net.IEX.Relevant: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Classes.Eq Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Generics.Generic Net.IEX.Relevant.Relevant
+ Net.IEX.Relevant: instance GHC.Show.Show Net.IEX.Relevant.Relevant
+ Net.IEX.Split: Split :: String -> String -> String -> String -> Double -> Integer -> Integer -> Split
+ Net.IEX.Split: [declaredDate] :: Split -> String
+ Net.IEX.Split: [exDate] :: Split -> String
+ Net.IEX.Split: [forFactor] :: Split -> Integer
+ Net.IEX.Split: [paymentDate] :: Split -> String
+ Net.IEX.Split: [ratio] :: Split -> Double
+ Net.IEX.Split: [recordDate] :: Split -> String
+ Net.IEX.Split: [toFactor] :: Split -> Integer
+ Net.IEX.Split: data Split
+ Net.IEX.Split: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Split.Split
+ Net.IEX.Split: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Classes.Eq Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Generics.Generic Net.IEX.Split.Split
+ Net.IEX.Split: instance GHC.Show.Show Net.IEX.Split.Split
+ Net.IEX.Stats: Stats :: String -> Integer -> Double -> Double -> Double -> Double -> Integer -> String -> Double -> Double -> String -> Double -> String -> Integer -> Integer -> Double -> Double -> Integer -> Maybe Double -> Maybe Double -> String -> Integer -> Integer -> Integer -> Integer -> Integer -> Double -> Integer -> Integer -> Double -> Double -> Double -> Maybe Double -> Double -> Double -> Double -> Double -> Double -> Double -> Maybe Double -> Maybe Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> Stats
+ Net.IEX.Stats: [beta] :: Stats -> Double
+ Net.IEX.Stats: [cash] :: Stats -> Integer
+ Net.IEX.Stats: [companyName] :: Stats -> String
+ Net.IEX.Stats: [consensusEPS] :: Stats -> Double
+ Net.IEX.Stats: [day200MovingAvg] :: Stats -> Double
+ Net.IEX.Stats: [day30ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [day50MovingAvg] :: Stats -> Double
+ Net.IEX.Stats: [day5ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [debt] :: Stats -> Integer
+ Net.IEX.Stats: [dividendRate] :: Stats -> Double
+ Net.IEX.Stats: [dividendYield] :: Stats -> Double
+ Net.IEX.Stats: [ebitda] :: Stats -> Integer
+ Net.IEX.Stats: [epsSurpriseDollar] :: Stats -> Maybe Double
+ Net.IEX.Stats: [epsSurprisePercent] :: Stats -> Maybe Double
+ Net.IEX.Stats: [exDividendDate] :: Stats -> String
+ Net.IEX.Stats: [float] :: Stats -> Integer
+ Net.IEX.Stats: [grossProfit] :: Stats -> Integer
+ Net.IEX.Stats: [insiderPercent] :: Stats -> Maybe Double
+ Net.IEX.Stats: [institutionPercent] :: Stats -> Double
+ Net.IEX.Stats: [latestEPSDate] :: Stats -> String
+ Net.IEX.Stats: [latestEPS] :: Stats -> Double
+ Net.IEX.Stats: [marketcap] :: Stats -> Integer
+ Net.IEX.Stats: [month1ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [month3ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [month6ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [numberOfEstimates] :: Stats -> Integer
+ Net.IEX.Stats: [peRatioHigh] :: Stats -> Double
+ Net.IEX.Stats: [peRatioLow] :: Stats -> Double
+ Net.IEX.Stats: [priceToBook] :: Stats -> Double
+ Net.IEX.Stats: [priceToSales] :: Stats -> Double
+ Net.IEX.Stats: [profitMargin] :: Stats -> Double
+ Net.IEX.Stats: [returnOnAssets] :: Stats -> Double
+ Net.IEX.Stats: [returnOnCapital] :: Stats -> Maybe Double
+ Net.IEX.Stats: [returnOnEquity] :: Stats -> Double
+ Net.IEX.Stats: [revenuePerEmployee] :: Stats -> Integer
+ Net.IEX.Stats: [revenuePerShare] :: Stats -> Integer
+ Net.IEX.Stats: [revenue] :: Stats -> Integer
+ Net.IEX.Stats: [sharesOutstanding] :: Stats -> Integer
+ Net.IEX.Stats: [shortDate] :: Stats -> String
+ Net.IEX.Stats: [shortInterest] :: Stats -> Integer
+ Net.IEX.Stats: [shortRatio] :: Stats -> Maybe Double
+ Net.IEX.Stats: [symbol] :: Stats -> String
+ Net.IEX.Stats: [ttmEPS] :: Stats -> Double
+ Net.IEX.Stats: [week52change] :: Stats -> Double
+ Net.IEX.Stats: [week52high] :: Stats -> Double
+ Net.IEX.Stats: [week52low] :: Stats -> Double
+ Net.IEX.Stats: [year1ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [year2ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [year5ChangePercent] :: Stats -> Double
+ Net.IEX.Stats: [ytdChangePercent] :: Stats -> Double
+ Net.IEX.Stats: data Stats
+ Net.IEX.Stats: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Classes.Eq Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Generics.Generic Net.IEX.Stats.Stats
+ Net.IEX.Stats: instance GHC.Show.Show Net.IEX.Stats.Stats
+ Net.IEX.TimeSeries: TimeSeries :: String -> Double -> Double -> Double -> Double -> Integer -> Integer -> Double -> Double -> Double -> String -> Double -> TimeSeries
+ Net.IEX.TimeSeries: [changeOverTime] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [changePercent] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [change] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [close] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [date] :: TimeSeries -> String
+ Net.IEX.TimeSeries: [high] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [label] :: TimeSeries -> String
+ Net.IEX.TimeSeries: [low] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [open] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: [unadjustedVolume] :: TimeSeries -> Integer
+ Net.IEX.TimeSeries: [volume] :: TimeSeries -> Integer
+ Net.IEX.TimeSeries: [vwap] :: TimeSeries -> Double
+ Net.IEX.TimeSeries: data TimeSeries
+ Net.IEX.TimeSeries: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Classes.Eq Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Generics.Generic Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.TimeSeries: instance GHC.Show.Show Net.IEX.TimeSeries.TimeSeries
+ Net.IEX.VolumeByVenue: VolumeByVenue :: Integer -> String -> String -> Maybe String -> Double -> Double -> VolumeByVenue
+ Net.IEX.VolumeByVenue: [avgMarketPercent] :: VolumeByVenue -> Double
+ Net.IEX.VolumeByVenue: [date] :: VolumeByVenue -> Maybe String
+ Net.IEX.VolumeByVenue: [marketPercent] :: VolumeByVenue -> Double
+ Net.IEX.VolumeByVenue: [venueName] :: VolumeByVenue -> String
+ Net.IEX.VolumeByVenue: [venue] :: VolumeByVenue -> String
+ Net.IEX.VolumeByVenue: [volume] :: VolumeByVenue -> Integer
+ Net.IEX.VolumeByVenue: data VolumeByVenue
+ Net.IEX.VolumeByVenue: instance Data.Aeson.Types.FromJSON.FromJSON Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance Data.Aeson.Types.ToJSON.ToJSON Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Classes.Eq Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Generics.Generic Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.IEX.VolumeByVenue: instance GHC.Show.Show Net.IEX.VolumeByVenue.VolumeByVenue
+ Net.Stocks: Batch :: Maybe [NewsItem] -> Maybe [Chart] -> Maybe Company -> Maybe DelayedQuote -> Maybe [Dividend] -> Maybe Earnings -> Maybe [EffectiveSpread] -> Maybe Financials -> Maybe Stats -> Maybe OHLC -> Maybe Integer -> Maybe Previous -> Maybe Quote -> Maybe [Split] -> Maybe [VolumeByVenue] -> Batch
+ Net.Stocks: ChartQuery :: BatchQuery
+ Net.Stocks: CompanyQuery :: BatchQuery
+ Net.Stocks: DelayedQuoteQuery :: BatchQuery
+ Net.Stocks: DividendQuery :: BatchQuery
+ Net.Stocks: EarningsQuery :: BatchQuery
+ Net.Stocks: EffectiveSpreadQuery :: BatchQuery
+ Net.Stocks: FinancialsQuery :: BatchQuery
+ Net.Stocks: NewsQuery :: BatchQuery
+ Net.Stocks: OHLCQuery :: BatchQuery
+ Net.Stocks: PreviousQuery :: BatchQuery
+ Net.Stocks: PriceTimeQuery :: BatchQuery
+ Net.Stocks: QuoteQuery :: BatchQuery
+ Net.Stocks: SplitQuery :: BatchQuery
+ Net.Stocks: StatsQuery :: BatchQuery
+ Net.Stocks: VolumeByVenueQuery :: BatchQuery
+ Net.Stocks: [chart] :: Batch -> Maybe [Chart]
+ Net.Stocks: [delayedQuote] :: Batch -> Maybe DelayedQuote
+ Net.Stocks: [dividend] :: Batch -> Maybe [Dividend]
+ Net.Stocks: [earnings] :: Batch -> Maybe Earnings
+ Net.Stocks: [effectiveSpread] :: Batch -> Maybe [EffectiveSpread]
+ Net.Stocks: [financials] :: Batch -> Maybe Financials
+ Net.Stocks: [news] :: Batch -> Maybe [NewsItem]
+ Net.Stocks: [ohlc] :: Batch -> Maybe OHLC
+ Net.Stocks: [previous] :: Batch -> Maybe Previous
+ Net.Stocks: [priceTime] :: Batch -> Maybe Integer
+ Net.Stocks: [quote] :: Batch -> Maybe Quote
+ Net.Stocks: [split] :: Batch -> Maybe [Split]
+ Net.Stocks: [stats] :: Batch -> Maybe Stats
+ Net.Stocks: [volumeByVenue] :: Batch -> Maybe [VolumeByVenue]
+ Net.Stocks: data Batch
+ Net.Stocks: data BatchQuery
+ Net.Stocks: getBatch :: [Symbol] -> [BatchQuery] -> IO (Maybe (Map String Batch))
+ Net.Stocks: getBatchCompany :: Symbol -> [BatchQuery] -> IO (Maybe Batch)
+ Net.Stocks: getBook :: Symbol -> IO (Maybe Book)
+ Net.Stocks: getChart :: Symbol -> IO (Maybe [Chart])
+ Net.Stocks: getCompany :: Symbol -> IO (Maybe Company)
+ Net.Stocks: getDelayedDividend :: Symbol -> IO (Maybe [Dividend])
+ Net.Stocks: getDelayedQuote :: Symbol -> IO (Maybe DelayedQuote)
+ Net.Stocks: getEarnings :: Symbol -> IO (Maybe Earnings)
+ Net.Stocks: getEffectiveSpread :: Symbol -> IO (Maybe [EffectiveSpread])
+ Net.Stocks: getFinancials :: Symbol -> IO (Maybe Financials)
+ Net.Stocks: getHistoricalStats :: IO (Maybe [RecentStats])
+ Net.Stocks: getIntraDayStats :: IO (Maybe IntraDayStats)
+ Net.Stocks: getMarket :: IO (Maybe [Market])
+ Net.Stocks: getNewsItem :: Symbol -> IO (Maybe [NewsItem])
+ Net.Stocks: getOHLC :: Symbol -> IO (Maybe OHLC)
+ Net.Stocks: getPeers :: Symbol -> IO ByteString
+ Net.Stocks: getPrevious :: Symbol -> IO (Maybe Previous)
+ Net.Stocks: getPrice :: Symbol -> IO (Maybe Double)
+ Net.Stocks: getQuote :: Symbol -> IO (Maybe Quote)
+ Net.Stocks: getRecentStats :: IO (Maybe [RecentStats])
+ Net.Stocks: getRecordStats :: IO (Maybe RecordStats)
+ Net.Stocks: getRelevant :: Symbol -> IO (Maybe Relevant)
+ Net.Stocks: getSplit :: Symbol -> IO (Maybe [Split])
+ Net.Stocks: getStats :: Symbol -> IO (Maybe Stats)
+ Net.Stocks: getTS :: Symbol -> IO (Maybe [TimeSeries])
+ Net.Stocks: getVolumeByVenue :: Symbol -> IO (Maybe [VolumeByVenue])
+ Net.Stocks: instance Data.Aeson.Types.FromJSON.FromJSON Net.Stocks.Batch
+ Net.Stocks: instance Data.Aeson.Types.ToJSON.ToJSON Net.Stocks.Batch
+ Net.Stocks: instance GHC.Classes.Eq Net.Stocks.Batch
+ Net.Stocks: instance GHC.Generics.Generic Net.Stocks.Batch
+ Net.Stocks: instance GHC.Show.Show Net.Stocks.Batch
+ Net.Stocks: typeQuery :: [BatchQuery] -> String
- Net.Stocks: [company] :: Stock -> String
+ Net.Stocks: [company] :: Batch -> Maybe Company
Files
- LICENSE +1/−1
- README.md +26/−17
- Tests/Main.hs +124/−0
- src/Net/IEX/Book.hs +32/−0
- src/Net/IEX/Chart.hs +66/−0
- src/Net/IEX/Company.hs +30/−0
- src/Net/IEX/DelayedQuote.hs +20/−0
- src/Net/IEX/Dividend.hs +30/−0
- src/Net/IEX/Earnings.hs +39/−0
- src/Net/IEX/EffectiveSpread.hs +19/−0
- src/Net/IEX/Financials.hs +41/−0
- src/Net/IEX/IntraDayStats.hs +26/−0
- src/Net/IEX/Market.hs +22/−0
- src/Net/IEX/NewsItem.hs +19/−0
- src/Net/IEX/OHLC.hs +19/−0
- src/Net/IEX/Previous.hs +24/−0
- src/Net/IEX/PriceTime.hs +15/−0
- src/Net/IEX/Quote.hs +49/−0
- src/Net/IEX/RecentStats.hs +20/−0
- src/Net/IEX/RecordStats.hs +27/−0
- src/Net/IEX/Relevant.hs +15/−0
- src/Net/IEX/Split.hs +20/−0
- src/Net/IEX/Stats.hs +73/−0
- src/Net/IEX/TimeSeries.hs +25/−0
- src/Net/IEX/VolumeByVenue.hs +19/−0
- src/Net/Stocks.hs +284/−81
- stocks.cabal +30/−11
LICENSE view
@@ -1,4 +1,4 @@-Copyright David Bouchare (c) 2018+Copyright David Bouchare, Kristian Sällberg (c) 2018 All rights reserved.
README.md view
@@ -1,34 +1,43 @@-# stocks +# stocks Haskell library for the IEX trading API. -Example: +Example: ```haskell-{-# LANGUAGE RecordWildCards #-}+stack build && stack ghci -import Net.Stocks+> getCompany "aapl" -comp :: String-comp = "AAPL"+Just (Company {symbol = "AAPL",+ companyName = "Apple Inc.",+ exchange = "Nasdaq Global Select",+ industry = "Computer Hardware",+ website = "http://www.apple.com",+ description = "Apple Inc is designs ...",+ ceo = "Timothy D. Cook",+ issueType = "cs",+ sector = "Technology"}) -main :: IO ()-main = do- resp <- getData comp QueryStocks- case resp of- Nothing -> putStrLn "No data for that company"- Just (Stock{..}) -> do- putStrLn $ "Stock value: " ++ show latestPrice+> getPrice "dps"++Just 120.36 ``` -Which should show: +Please see the HUnit test for a complete example+of all API calls. +## How to run test suite ```-Stock value: <the_actual_stock_value>+stack test ``` -### Attribution +## Contribute++For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/dabcoder/stocks/issues).++### Attribution If you redistribute our API data: -* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).” +* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).” * Provide a link to https://iextrading.com/api-exhibit-a in your terms of service.
+ Tests/Main.hs view
@@ -0,0 +1,124 @@+module Main where++import Net.IEX.Previous+import Test.HUnit+import Net.Stocks++import qualified Data.ByteString.Lazy.Char8 as L8+import qualified Net.IEX.Stats as XS++main :: IO Counts+main = runTestTT tests++tests = TestList [TestLabel "" testChart,+ TestLabel "" testCompany,+ TestLabel "" testDelayedQuote,+ TestLabel "" testDelayedDividend,+ TestLabel "" testEarnings,+ TestLabel "" testEffectiveSpread,+ TestLabel "" testFinancials,+ TestLabel "" testStats,+ TestLabel "" testNewsItem,+ TestLabel "" testOHLC,+ TestLabel "" testPeers,+ TestLabel "" testPrevious,+ TestLabel "" testPrice,+ TestLabel "" testQuote,+ TestLabel "" testRelevant,+ TestLabel "" testSplit,+ TestLabel "" testVolumeByVenue,+ TestLabel "" testTypeQuery1,+ TestLabel "" testBatch,+ TestLabel "" testMultiBatch1,+ TestLabel "" testMultiBatch2,+ TestLabel "" testCorrectCompanyName,+ TestLabel "" testMarket,+ TestLabel "" testIntraDayStats,+ TestLabel "" testRecentStats,+ TestLabel "" testRecordStats,+ -- TestLabel "" testHistDailyStats+ TestLabel "" testBook,+ TestLabel "" testTS+ ]++testChart = TestCase (do result <- getChart "aapl"+ assertBool "desc" (result /= Nothing))+testCompany = TestCase (do result <- getCompany "aapl"+ assertBool "desc" (result /= Nothing))+testDelayedQuote = TestCase (do result <- getDelayedQuote "aapl"+ assertBool "desc" (result /= Nothing))+testDelayedDividend = TestCase (do result <- getDelayedDividend "aapl"+ assertBool "desc" (result /= Nothing))+testEarnings = TestCase (do result <- getEarnings "aapl"+ assertBool "desc" (result /= Nothing))+testEffectiveSpread = TestCase (do result <- getEffectiveSpread "aapl"+ assertBool "desc" (result /= Nothing))+testFinancials = TestCase (do result <- getFinancials "aapl"+ assertBool "desc" (result /= Nothing))+testStats = TestCase (do result <- getStats "aapl"+ assertBool "desc" (result /= Nothing))+testNewsItem = TestCase (do result <- getNewsItem "aapl"+ assertBool "desc" (result /= Nothing))+testOHLC = TestCase (do result <- getOHLC "aapl"+ assertBool "desc" (result /= Nothing))+testPeers = TestCase+ (do result <- getPeers "aapl"+ assertEqual "get the correct peers for AAPL" result+ (L8.pack "[\"MSFT\",\"NOK\",\"IBM\",\"HPQ\",\"GOOGL\",\"BB\",\"XLK\"]"))+testPrevious = TestCase (do result <- getPrevious "aapl"+ assertBool "desc" (result /= Nothing))+testPrice = TestCase (do result <- getPrice "aapl"+ assertBool "" (result /= Nothing))+testQuote = TestCase (do result <- getQuote "aapl"+ assertBool "desc" (result /= Nothing))+testRelevant = TestCase (do result <- getRelevant "aapl"+ assertBool "desc" (result /= Nothing))+testSplit = TestCase (do result <- getSplit "aapl"+ assertBool "desc" (result /= Nothing))+testVolumeByVenue = TestCase (do result <- getVolumeByVenue "aapl"+ assertBool "desc" (result /= Nothing))+testTypeQuery1 = TestCase (assertEqual "" "types=news,ohlc"+ (typeQuery [NewsQuery, OHLCQuery]))+testBatch = TestCase+ (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]+ assertBool "" (result /= Nothing))++testMultiBatch1 = TestCase+ (do result <- getBatch ["fb"] [OHLCQuery]+ assertBool "" (result /= Nothing))++testMultiBatch2 = TestCase+ (do result <- getBatch ["dps", "fb"] [OHLCQuery, CompanyQuery]+ assertBool "" (result /= Nothing))++-- fail+testCorrectCompanyName = TestCase+ (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]+ assertEqual "" (pickCompanyName result) "Apple Inc.")++pickCompanyName :: Maybe Batch -> String+pickCompanyName (Just (Batch {stats = st})) = pickCompanyName' st++pickCompanyName' :: Maybe XS.Stats -> String+pickCompanyName' (Just (XS.Stats {XS.companyName = cname})) = cname++testMarket = TestCase (do result <- getMarket+ assertBool "" (result /= Nothing))++testIntraDayStats = TestCase (do result <- getIntraDayStats+ assertBool "" (result /= Nothing))++testRecentStats = TestCase (do result <- getRecentStats+ assertBool "" (result /= Nothing))++testRecordStats = TestCase (do result <- getRecordStats+ assertBool "" (result /= Nothing))++testBook = TestCase (do result <- getBook "aapl"+ assertBool "" (result /= Nothing))++testTS = TestCase (do result <- getTS "aapl"+ assertBool "" (result /= Nothing))++-- testHistDailyStats = TestCase (do result <- getHistoricalDailyStats+-- assertBool "" (result /= Nothing))
+ src/Net/IEX/Book.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Book (Book(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics+import Net.IEX.Quote (Quote)++data Book = Book {+ quote :: Quote,+ bids :: Maybe [Trade], -- FIXME: not sure of this type+ asks :: Maybe [Trade], -- FIXME: not sure of this type+ trades :: [Trade]+} deriving (Generic, Show, Eq)++data Trade = Trade {+ price :: Double,+ size :: Integer,+ tradeId :: Integer,+ isISO :: Bool,+ isOddLot :: Bool,+ isOutsideRegularHours :: Bool,+ isSinglePriceCross :: Bool,+ isTradeThroughExempt :: Bool,+ timestamp :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Book+instance ToJSON Trade+instance FromJSON Book+instance FromJSON Trade
+ src/Net/IEX/Chart.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Chart (Chart(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Chart = Chart {+ -- is only available on 1d chart.+ minute :: Maybe String,+ -- is only available on 1d chart. 15 minute delayed+ marketAverage :: Maybe Double,+ -- is only available on 1d chart. 15 minute delayed+ marketNotional :: Maybe Double,+ -- is only available on 1d chart. 15 minute delayed+ marketNumberOfTrades :: Maybe Double,+ -- is only available on 1d chart. 15 minute delayed+ marketHigh :: Maybe Double,+ -- is only available on 1d chart. 15 minute delayed+ marketLow :: Maybe Double,+ -- is only available on 1d chart. 15 minute delayed+ marketVolume :: Maybe Double,+ -- is only available on 1d chart. Percent change+ -- of each interval relative to first value. 15 minute delayed+ marketChangeOverTime :: Maybe Double,+ -- is only available on 1d chart.+ average :: Maybe Double,+ -- is only available on 1d chart.+ notional :: Maybe Double,+ -- is only available on 1d chart.+ numberOfTrades :: Maybe Double,+ -- is only available on 1d chart, and only when chartSimplify is true.+ -- The first element is the original number of points.+ -- Second element is how many remain after simplification.+ simplifyFactor :: Maybe [Integer],+ -- is available on all charts.+ high :: Double,+ -- is available on all charts.+ low :: Double,+ -- is available on all charts.+ volume :: Integer,+ -- is available on all charts. A variable formatted version of+ -- the date depending on the range. Optional convienience field.+ label :: String,+ -- is available on all charts. Percent change of each interval+ -- relative to first value. Useful for comparing multiple stocks.+ changeOverTime :: Double,+ -- is not available on 1d chart.+ date :: Maybe String,+ -- is not available on 1d chart.+ open :: Maybe Double,+ -- is not available on 1d chart.+ close :: Maybe Double,+ -- is not available on 1d chart.+ unadjustedVolume :: Maybe Integer,+ -- is not available on 1d chart.+ change :: Maybe Double,+ -- is not available on 1d chart.+ changePercent :: Maybe Double,+ -- is not available on 1d chart.+ vwap :: Maybe Double+} deriving (Generic, Show, Eq)++instance ToJSON Chart+instance FromJSON Chart
+ src/Net/IEX/Company.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Company (Company(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Company = Company {+ symbol :: String,+ companyName :: String,+ exchange :: String,+ industry :: String,+ website :: String,+ description :: String,+ ceo :: String,+ issueType :: String,+ sector :: String+} deriving (Generic, Show, Eq)++customOptionsCompany =+ defaultOptions {+ fieldLabelModifier = let f "ceo" = "CEO"+ f other = other+ in f+ }++instance ToJSON Company+instance FromJSON Company where+ parseJSON = genericParseJSON customOptionsCompany
+ src/Net/IEX/DelayedQuote.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.DelayedQuote (DelayedQuote(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data DelayedQuote = DelayedQuote {+ symbol :: String,+ delayedPrice :: Double,+ high :: Double,+ low :: Double,+ delayedSize :: Double,+ delayedPriceTime :: Integer,+ processedTime :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON DelayedQuote+instance FromJSON DelayedQuote
+ src/Net/IEX/Dividend.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Dividend (Dividend(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Dividend = Dividend {+ exDate :: String,+ paymentDate :: String,+ recordDate :: String,+ declaredDate :: String,+ amount :: Double,+ flag :: String,+ dtype :: String,+ qualified :: String,+ indicated :: String+} deriving (Generic, Show, Eq)++customOptionsDividend =+ defaultOptions {+ fieldLabelModifier = let f "dtype" = "type"+ f other = other+ in f+ }++instance ToJSON Dividend+instance FromJSON Dividend where+ parseJSON = genericParseJSON customOptionsDividend
+ src/Net/IEX/Earnings.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Earnings (Earning(..),+ Earnings(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Earning = Earning {+ actualEPS :: Double,+ consensusEPS :: Double,+ estimatedEPS :: Double,+ announceTime :: String,+ numberOfEstimates :: Integer,+ epsSurpriseDollar :: Double,+ epsReportDate :: String,+ fiscalPeriod :: String,+ fiscalEndDate :: String+} deriving (Generic, Show, Eq)++data Earnings = Earnings {+ symbol :: String,+ earnings :: [Earning]+} deriving (Generic, Show, Eq)++customOptionsEarning =+ defaultOptions {+ fieldLabelModifier = let f "epsSurpriseDollar" = "EPSSurpriseDollar"+ f "epsReportDate" = "EPSReportDate"+ f other = other+ in f+ }++instance ToJSON Earnings+instance ToJSON Earning+instance FromJSON Earnings+instance FromJSON Earning where+ parseJSON = genericParseJSON customOptionsEarning
+ src/Net/IEX/EffectiveSpread.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.EffectiveSpread (EffectiveSpread(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data EffectiveSpread = EffectiveSpread {+ volume :: Integer,+ venue :: String,+ venueName :: String,+ effectiveSpread :: Double,+ effectiveQuoted :: Double,+ priceImprovement :: Double+} deriving (Generic, Show, Eq)++instance ToJSON EffectiveSpread+instance FromJSON EffectiveSpread
+ src/Net/IEX/Financials.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Financials (Financials(..),+ Financial(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Financial = Financial {+ reportDate :: String,+ grossProfit :: Integer,+ costOfRevenue :: Integer,+ operatingRevenue :: Integer,+ totalRevenue :: Integer,+ operatingIncome :: Integer,+ netIncome :: Integer,+ researchAndDevelopment :: Integer,+ operatingExpense :: Integer,+ currentAssets :: Integer,+ totalAssets :: Integer,+ totalLiabilities :: Maybe Integer,+ currentCash :: Integer,+ currentDebt :: Integer,+ totalCash :: Integer,+ totalDebt :: Integer,+ shareholderEquity :: Integer,+ cashChange :: Integer,+ cashFlow :: Integer,+ operatingGainsLosses :: Maybe String+} deriving (Generic, Show, Eq)++data Financials = Financials {+ symbol :: String,+ financials :: [Financial]+} deriving (Generic, Show, Eq)++instance ToJSON Financial+instance ToJSON Financials+instance FromJSON Financial+instance FromJSON Financials
+ src/Net/IEX/IntraDayStats.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.IntraDayStats (IntraDayStats(..),+ IntraDaySub(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data IntraDayStats = IntraDayStats {+ volume :: IntraDaySub,+ symbolsTraded :: IntraDaySub,+ routedVolume :: IntraDaySub,+ notional :: IntraDaySub,+ marketShare :: IntraDaySub+} deriving (Generic, Show, Eq)++data IntraDaySub = IntraDaySub {+ value :: Maybe Double,+ lastUpdated :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON IntraDayStats+instance ToJSON IntraDaySub+instance FromJSON IntraDayStats+instance FromJSON IntraDaySub
+ src/Net/IEX/Market.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Market (Market(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Market = Market {+ mic :: String,+ tapeId :: String,+ venueName :: String,+ volume :: Integer,+ tapeA :: Integer,+ tapeB :: Integer,+ tapeC :: Integer,+ marketPercent :: Double,+ lastUpdated :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Market+instance FromJSON Market
+ src/Net/IEX/NewsItem.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.NewsItem (NewsItem(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data NewsItem = NewsItem {+ datetime :: String,+ headline :: String,+ source :: String,+ url :: String,+ summary :: String,+ related :: String+} deriving (Generic, Show, Eq)++instance ToJSON NewsItem+instance FromJSON NewsItem
+ src/Net/IEX/OHLC.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.OHLC (OHLC(..)) where++import Net.IEX.PriceTime++import Data.Maybe+import Data.Aeson+import GHC.Generics++data OHLC = OHLC {+ open :: PriceTime,+ close :: PriceTime,+ high :: Double,+ low :: Double+} deriving (Generic, Show, Eq)++instance ToJSON OHLC+instance FromJSON OHLC
+ src/Net/IEX/Previous.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Previous (Previous(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Previous = Previous {+ symbol :: String,+ date :: String,+ open :: Double,+ high :: Double,+ low :: Double,+ close :: Double,+ volume :: Integer,+ unadjustedVolume :: Integer,+ change :: Double,+ changePercent :: Double,+ vwap :: Double+} deriving (Generic, Show, Eq)++instance ToJSON Previous+instance FromJSON Previous
+ src/Net/IEX/PriceTime.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.PriceTime (PriceTime(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data PriceTime = PriceTime {+ price :: Double,+ time :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON PriceTime+instance FromJSON PriceTime
+ src/Net/IEX/Quote.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Quote (Quote(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Quote = Quote {+ symbol :: String,+ companyName :: String,+ primaryExchange :: String,+ sector :: String,+ calculationPrice :: String,+ open :: Double,+ openTime :: Integer,+ close :: Double,+ closeTime :: Integer,+ high :: Double,+ low :: Double,+ latestPrice :: Double,+ latestSource :: String,+ latestTime :: String,+ latestUpdate :: Integer,+ latestVolume :: Integer,+ iexRealtimePrice :: Maybe Double,+ iexRealtimeSize :: Maybe Integer,+ iexLastUpdated :: Maybe Integer,+ delayedPrice :: Double,+ delayedPriceTime :: Integer,+ previousClose :: Double,+ change :: Double,+ changePercent :: Double,+ iexMarketPercent :: Maybe Double,+ iexVolume :: Maybe Integer,+ avgTotalVolume :: Integer,+ iexBidPrice :: Maybe Double,+ iexBidSize :: Maybe Integer,+ iexAskPrice :: Maybe Double,+ iexAskSize :: Maybe Integer,+ marketCap :: Integer,+ peRatio :: Double,+ week52High :: Double,+ week52Low :: Double,+ ytdChange :: Double+} deriving (Generic, Show, Eq)++instance ToJSON Quote+instance FromJSON Quote
+ src/Net/IEX/RecentStats.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.RecentStats (RecentStats(..)) where++import Data.Either+import Data.Maybe+import Data.Aeson+import GHC.Generics++data RecentStats = RecentStats {+ date :: String,+ volume :: Integer,+ routedVolume :: Integer,+ marketShare :: Double,+ isHalfday :: Bool,+ litVolume :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON RecentStats+instance FromJSON RecentStats
+ src/Net/IEX/RecordStats.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.RecordStats (RecordStats(..),+ RecordStatsSub(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data RecordStats = RecordStats {+ volume :: RecordStatsSub,+ symbolsTraded :: RecordStatsSub,+ routedVolume :: RecordStatsSub,+ notional :: RecordStatsSub+} deriving (Generic, Show, Eq)++data RecordStatsSub = RecordStatsSub {+ recordValue :: Double,+ recordDate :: String,+ previousDayValue :: Double,+ avg30Value :: Double+} deriving (Generic, Show, Eq)++instance ToJSON RecordStats+instance ToJSON RecordStatsSub+instance FromJSON RecordStats+instance FromJSON RecordStatsSub
+ src/Net/IEX/Relevant.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Relevant (Relevant(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Relevant = Relevant {+ peers :: Bool,+ symbols :: [String]+} deriving (Generic, Show, Eq)++instance ToJSON Relevant+instance FromJSON Relevant
+ src/Net/IEX/Split.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Split (Split(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Split = Split {+ exDate :: String,+ declaredDate :: String,+ recordDate :: String,+ paymentDate :: String,+ ratio :: Double,+ toFactor :: Integer,+ forFactor :: Integer+} deriving (Generic, Show, Eq)++instance ToJSON Split+instance FromJSON Split
+ src/Net/IEX/Stats.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.Stats (Stats (..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data Stats = Stats {+ companyName :: String,+ marketcap :: Integer,+ beta :: Double,+ week52high :: Double,+ week52low :: Double,+ week52change :: Double,+ shortInterest :: Integer,+ shortDate :: String,+ dividendRate :: Double,+ dividendYield :: Double,+ exDividendDate :: String,+ latestEPS :: Double,+ latestEPSDate :: String,+ sharesOutstanding :: Integer,+ float :: Integer,+ returnOnEquity :: Double,+ consensusEPS :: Double,+ numberOfEstimates :: Integer,+ epsSurpriseDollar :: Maybe Double,+ epsSurprisePercent :: Maybe Double,+ symbol :: String,+ ebitda :: Integer,+ revenue :: Integer,+ grossProfit :: Integer,+ cash :: Integer,+ debt :: Integer,+ ttmEPS :: Double,+ revenuePerShare :: Integer,+ revenuePerEmployee :: Integer,+ peRatioHigh :: Double,+ peRatioLow :: Double,+ returnOnAssets :: Double,+ returnOnCapital :: Maybe Double,+ profitMargin :: Double,+ priceToSales :: Double,+ priceToBook :: Double,+ day200MovingAvg :: Double,+ day50MovingAvg :: Double,+ institutionPercent :: Double,+ insiderPercent :: Maybe Double,+ shortRatio :: Maybe Double,+ year5ChangePercent :: Double,+ year2ChangePercent :: Double,+ year1ChangePercent :: Double,+ ytdChangePercent :: Double,+ month6ChangePercent :: Double,+ month3ChangePercent :: Double,+ month1ChangePercent :: Double,+ day5ChangePercent :: Double,+ day30ChangePercent :: Double+} deriving (Generic, Show, Eq)++customOptionsStats =+ defaultOptions {+ fieldLabelModifier = let f "epsSurpriseDollar" = "EPSSurpriseDollar"+ f "epsSurprisePercent" = "EPSSurprisePercent"+ f "ebitda" = "EBITDA"+ f other = other+ in f+ }++instance ToJSON Stats+instance FromJSON Stats where+ parseJSON = genericParseJSON customOptionsStats
+ src/Net/IEX/TimeSeries.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.TimeSeries (TimeSeries(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data TimeSeries = TimeSeries {+ date :: String,+ open :: Double,+ high :: Double,+ low :: Double,+ close :: Double,+ volume :: Integer,+ unadjustedVolume :: Integer,+ change :: Double,+ changePercent :: Double,+ vwap :: Double,+ label :: String,+ changeOverTime :: Double+} deriving (Generic, Show, Eq)++instance ToJSON TimeSeries+instance FromJSON TimeSeries
+ src/Net/IEX/VolumeByVenue.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveGeneric #-}++module Net.IEX.VolumeByVenue (VolumeByVenue(..)) where++import Data.Maybe+import Data.Aeson+import GHC.Generics++data VolumeByVenue = VolumeByVenue {+ volume :: Integer,+ venue :: String,+ venueName :: String,+ date :: Maybe String,+ marketPercent :: Double,+ avgMarketPercent :: Double+} deriving (Generic, Show, Eq)++instance ToJSON VolumeByVenue+instance FromJSON VolumeByVenue
src/Net/Stocks.hs view
@@ -1,106 +1,309 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE TemplateHaskell #-} module Net.Stocks- ( Stock(..)- , Financials(..)- , FinancialsList(..)- , QueryType(..)- , Company- , stocksQuery- , financialsQuery- , peersQuery- , priceQuery- , getData- , getNonJSONData- ) where- -import Control.Monad-import Control.Applicative-import Data.Char+ (+ getChart,+ getCompany,+ getBook,+ getDelayedQuote,+ getDelayedDividend,+ getEarnings,+ getEffectiveSpread,+ getFinancials,+ getStats,+ getNewsItem,+ getOHLC,+ getPrevious,+ getPeers,+ getPrice,+ getQuote,+ getRelevant,+ getSplit,+ getVolumeByVenue,+ getTS,+ getBatch,+ getBatchCompany,+ getMarket,+ getIntraDayStats,+ getRecentStats,+ getRecordStats,+ getHistoricalStats,+ -- getHistoricalDailyStats,+ typeQuery,+ Batch (..),+ BatchQuery (..)+ ) where++import System.IO+import GHC.Generics import Data.Aeson-import Data.List.NonEmpty-import Data.ByteString.Lazy.Char8+import Data.Char+import Data.HashMap.Strict+import Data.Maybe import Network.HTTP.Conduit --- | Stock data-data Stock =- Stock { company :: String -- ^ The company's name- , latestPrice :: Float -- ^ Latest stock price- , latestTime :: String -- ^ Timeframe- , changePercent :: Float -- ^ Percentage change- } deriving (Show)+import qualified Data.ByteString.Lazy.Char8 as L8+import qualified Data.List as DL+import qualified Data.Map as DM -instance FromJSON Stock where- parseJSON = withObject "Stock" $ \v -> Stock- <$> v .: "companyName"- <*> v .: "latestPrice"- <*> v .: "latestTime"- <*> v .: "changePercent"+import qualified Net.IEX.Chart as IEXChart+import qualified Net.IEX.Company as IEXCompany+import qualified Net.IEX.Stats as IEXStats+import qualified Net.IEX.Earnings as IEXEarnings+import qualified Net.IEX.NewsItem as IEXNewsItem+import qualified Net.IEX.DelayedQuote as IEXDelayedQuote+import qualified Net.IEX.Dividend as IEXDividend+import qualified Net.IEX.EffectiveSpread as IEXEffectiveSpread+import qualified Net.IEX.Financials as IEXFinancials+import qualified Net.IEX.OHLC as IEXOHLC+import qualified Net.IEX.PriceTime as IEXPriceTime+import qualified Net.IEX.Previous as IEXPrevious+import qualified Net.IEX.Quote as IEXQuote+import qualified Net.IEX.Split as IEXSplit+import qualified Net.IEX.VolumeByVenue as IEXVolumeByVenue+import qualified Net.IEX.Relevant as IEXRelevant+import qualified Net.IEX.Market as IEXMarket+import qualified Net.IEX.IntraDayStats as IEXIntraDayStats+import qualified Net.IEX.RecentStats as IEXRecentStats+import qualified Net.IEX.RecordStats as IEXRecordStats+import qualified Net.IEX.Book as IEXBook+import qualified Net.IEX.TimeSeries as IEXTimeSeries -newtype FinancialsList = FinancialsList { financialsList :: NonEmpty Financials}+type Symbol = String -instance FromJSON FinancialsList where- parseJSON = withObject "FinancialsList" $ \v -> FinancialsList - <$> v .: "financials"+data BatchQuery = NewsQuery |+ ChartQuery |+ CompanyQuery |+ DelayedQuoteQuery |+ DividendQuery |+ EarningsQuery |+ EffectiveSpreadQuery |+ FinancialsQuery |+ StatsQuery |+ OHLCQuery |+ PriceTimeQuery |+ PreviousQuery |+ QuoteQuery |+ SplitQuery |+ VolumeByVenueQuery --- | Financials data-data Financials = - Financials { reportDate :: String -- ^ The report's date- , grossProfit :: Int -- ^ Gross Profit- , costOfRevenue :: Int -- ^ Cost of revenue- , cashFlow :: Int -- ^ Cash flow- } deriving (Show)+batchQueryToStr :: BatchQuery -> String+batchQueryToStr NewsQuery = "news"+batchQueryToStr ChartQuery = "chart"+batchQueryToStr CompanyQuery = "company"+batchQueryToStr DelayedQuoteQuery = "delayedquote"+batchQueryToStr DividendQuery = "dividends"+batchQueryToStr EarningsQuery = "earnings"+batchQueryToStr EffectiveSpreadQuery = "effectivespread"+batchQueryToStr FinancialsQuery = "financials"+batchQueryToStr StatsQuery = "stats"+batchQueryToStr OHLCQuery = "ohlc"+batchQueryToStr PriceTimeQuery = "price"+batchQueryToStr QuoteQuery = "quote"+batchQueryToStr SplitQuery = "split"+batchQueryToStr VolumeByVenueQuery = "volumebyvenue" -instance FromJSON Financials where- parseJSON = withObject "Financials" $ \v -> Financials- <$> v .: "reportDate"- <*> v .: "grossProfit"- <*> v .: "costOfRevenue"- <*> v .: "cashFlow"+data Batch = Batch {+ news :: Maybe [IEXNewsItem.NewsItem],+ chart :: Maybe [IEXChart.Chart],+ company :: Maybe IEXCompany.Company,+ delayedQuote :: Maybe IEXDelayedQuote.DelayedQuote,+ dividend :: Maybe [IEXDividend.Dividend],+ earnings :: Maybe IEXEarnings.Earnings,+ effectiveSpread :: Maybe [IEXEffectiveSpread.EffectiveSpread],+ financials :: Maybe IEXFinancials.Financials,+ stats :: Maybe IEXStats.Stats,+ ohlc :: Maybe IEXOHLC.OHLC,+ priceTime :: Maybe Integer,+ previous :: Maybe IEXPrevious.Previous,+ quote :: Maybe IEXQuote.Quote,+ split :: Maybe [IEXSplit.Split],+ volumeByVenue :: Maybe [IEXVolumeByVenue.VolumeByVenue]+} deriving (Generic, Show, Eq) -type Company = String+-- ToJSON means taking a haskell data structure and making a JSON string+instance ToJSON Batch -lowerString :: Company -> String-lowerString str = Prelude.map toLower str+-- FromJSON means parsing the text into a haskell data structure+instance FromJSON Batch baseURL :: String baseURL = "https://api.iextrading.com/1.0/stock/" -data QueryType = QueryStocks- | QueryFinancials- | QueryPeers- | QueryPrice+marketURL :: String+marketURL = "https://api.iextrading.com/1.0/market" --- builds the URL: /stock/{symbol}/quote-stocksQuery :: Company -> String-stocksQuery company = baseURL ++ lowerString company ++ "/quote"+intraDayURL :: String+intraDayURL = "https://api.iextrading.com/1.0/stats/intraday" --- builds the URL: /stock/{symbol}/financials-financialsQuery :: Company -> String-financialsQuery company = baseURL ++ lowerString company ++ "/financials"+statsURL :: String+statsURL = "https://api.iextrading.com/1.0/stats/" --- builds the URL: /stock/{symbol}/peers-peersQuery :: Company -> String-peersQuery company = baseURL ++ lowerString company ++ "/peers"+lowerString :: Symbol -> String+lowerString = DL.map toLower --- builds the URL: /stock/{symbol}/price-priceQuery :: Company -> String-priceQuery company = baseURL ++ lowerString company ++ "/price"+getChart :: Symbol -> IO (Maybe [IEXChart.Chart])+getChart symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/chart")+ return $ decode obj --- get JSON data -getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)-getData company qt = do- obj <- simpleHttp (query qt company)+getCompany :: Symbol -> IO (Maybe IEXCompany.Company)+getCompany symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/company")+ return $ decode obj++getBook :: Symbol -> IO (Maybe IEXBook.Book)+getBook symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/book")+ return $ decode obj++getDelayedQuote :: Symbol -> IO (Maybe IEXDelayedQuote.DelayedQuote)+getDelayedQuote symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/delayed-quote")+ return $ decode obj++getDelayedDividend :: Symbol -> IO (Maybe [IEXDividend.Dividend])+getDelayedDividend symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/dividends/5y")+ return $ decode obj++getEarnings :: Symbol -> IO (Maybe IEXEarnings.Earnings)+getEarnings symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/earnings")+ return $ decode obj++getEffectiveSpread :: Symbol -> IO (Maybe [IEXEffectiveSpread.EffectiveSpread])+getEffectiveSpread symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/effective-spread")+ return $ decode obj++getFinancials :: Symbol -> IO (Maybe IEXFinancials.Financials)+getFinancials symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/financials")+ return $ decode obj++getStats :: Symbol -> IO (Maybe IEXStats.Stats)+getStats symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/stats")+ return $ decode obj++getNewsItem :: Symbol -> IO (Maybe [IEXNewsItem.NewsItem])+getNewsItem symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/news/last/1")+ return $ decode obj++getOHLC :: Symbol -> IO (Maybe IEXOHLC.OHLC)+getOHLC symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/ohlc")+ return $ decode obj++getPeers :: Symbol -> IO L8.ByteString+getPeers symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/peers")+ return $ obj++getPrevious :: Symbol -> IO (Maybe IEXPrevious.Previous)+getPrevious symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/previous")+ return $ decode obj++-- FIXME: do not json parse an int+getPrice :: Symbol -> IO (Maybe Double)+getPrice symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/price")+ return $ decode obj++getQuote :: Symbol -> IO (Maybe IEXQuote.Quote)+getQuote symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/quote")+ return $ decode obj++getRelevant :: Symbol -> IO (Maybe IEXRelevant.Relevant)+getRelevant symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/relevant")+ return $ decode obj++getSplit :: Symbol -> IO (Maybe [IEXSplit.Split])+getSplit symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/splits/5y")+ return $ decode obj++getVolumeByVenue :: Symbol -> IO (Maybe [IEXVolumeByVenue.VolumeByVenue])+getVolumeByVenue symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/volume-by-venue")+ return $ decode obj++getTS :: Symbol -> IO (Maybe [IEXTimeSeries.TimeSeries])+getTS symb = do+ obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/time-series")+ return $ decode obj++-- get a list of parts we want in a batch request, and translate that+-- to HTTP parameters to provide to the API call+typeQuery :: [BatchQuery] -> String+typeQuery [] = ""+typeQuery inp =+ "types=" ++ (concat $ DL.intersperse "," (fmap batchQueryToStr inp))++symbolQuery :: [Symbol] -> String+symbolQuery [] = ""+symbolQuery inp = "symbols=" ++ (concat $ DL.intersperse "," inp)++questionMark :: [BatchQuery] -> String+questionMark [] = ""+questionMark _ = "?"++getBatch :: [Symbol] -> [BatchQuery] -> IO (Maybe (DM.Map String Batch))+getBatch symbs queryParams =+ let urlPt = baseURL ++ "market/batch?"+ fullQuery = urlPt ++ symbolQuery symbs ++ "&" ++ typeQuery queryParams+ in do+ obj <- getNonJSONData fullQuery return $ decode obj- where- query QueryStocks = stocksQuery- query QueryFinancials = financialsQuery --- Get non JSON data-getNonJSONData :: String -> QueryType -> IO ByteString-getNonJSONData company qt = do- obj <- simpleHttp (query qt company)+-- batch query of a *single* company+getBatchCompany :: Symbol -> [BatchQuery] -> IO (Maybe Batch)+getBatchCompany symb queryParams =+ let urlPt = (baseURL ++ lowerString symb ++ "/batch/")+ fullQuery = urlPt ++ (questionMark queryParams) ++ (typeQuery queryParams)+ in do+ obj <- getNonJSONData fullQuery+ return $ decode obj++getMarket :: IO (Maybe [IEXMarket.Market])+getMarket = do+ obj <- getNonJSONData marketURL+ return $ decode obj++getIntraDayStats :: IO (Maybe IEXIntraDayStats.IntraDayStats)+getIntraDayStats = do+ obj <- getNonJSONData intraDayURL+ return $ decode obj++getRecentStats :: IO (Maybe [IEXRecentStats.RecentStats])+getRecentStats = do+ obj <- getNonJSONData (statsURL ++ "recent")+ return $ decode obj++getRecordStats :: IO (Maybe IEXRecordStats.RecordStats)+getRecordStats = do+ obj <- getNonJSONData (statsURL ++ "records")+ return $ decode obj++getHistoricalStats :: IO (Maybe [IEXRecentStats.RecentStats])+getHistoricalStats = undefined++-- currently does not work due to inconsitency in+-- IEX API. isHalfDay is Bool in one API call and Int in another++-- getHistoricalDailyStats :: IO (Maybe [IEXRecentStats.RecentStats])+-- getHistoricalDailyStats = do+-- obj <- getNonJSONData (statsURL ++ "historical/daily")+-- return $ decode obj++getNonJSONData :: String -> IO L8.ByteString+getNonJSONData query = do+ obj <- simpleHttp query return obj- where- query QueryPeers = peersQuery- query QueryPrice = priceQuery
stocks.cabal view
@@ -1,30 +1,49 @@ name: stocks-version: 0.1.0.0+version: 0.2.0.0 synopsis: Library for the IEX Trading API description: Simple library for interacting with the IEX Trading API-homepage: https://github.com/dabcoder/stocks#readme+homepage: https://github.com/dabcoder/stocks license: BSD3 license-file: LICENSE-author: David Bouchare-maintainer: David Bouchare-copyright: 2018 David Bouchare+author: David Bouchare, Kristian Sällberg+maintainer: David Bouchare, Kristian Sällberg+copyright: 2018 David Bouchare, Kristian Sällberg category: Net build-type: Simple cabal-version: >=1.10 extra-source-files: README.md- + library- exposed-modules: Net.Stocks- -- other-modules:- -- other-extensions:+ exposed-modules: Net.Stocks, Net.IEX.Stats,+ Net.IEX.Chart, Net.IEX.Company,+ Net.IEX.Earnings, Net.IEX.DelayedQuote,+ Net.IEX.Dividend, Net.IEX.EffectiveSpread,+ Net.IEX.Financials, Net.IEX.NewsItem,+ Net.IEX.OHLC, Net.IEX.Previous,+ Net.IEX.PriceTime, Net.IEX.Quote,+ Net.IEX.Relevant, Net.IEX.Split,+ Net.IEX.VolumeByVenue, Net.IEX.Market,+ Net.IEX.IntraDayStats, Net.IEX.RecentStats,+ Net.IEX.RecordStats, Net.IEX.Book, Net.IEX.TimeSeries build-depends: base == 4.* , http-conduit , aeson >= 0.8.0 , bytestring+ , containers+ , unordered-containers , semigroups >= 0.18- hs-source-dirs: src- default-language: Haskell2010+ hs-source-dirs: src+ default-language: Haskell2010 source-repository head type: git location: https://github.com/dabcoder/stocks.git++Test-Suite test-hspec+ type: exitcode-stdio-1.0+ main-is: Tests/Main.hs+ build-depends: base,+ stocks,+ bytestring,+ HUnit+ default-language: Haskell2010