{-# LANGUAGE OverloadedStrings #-} module AllyInvest.TimeSales ( getTimeSales , Candle(..) ) where import AllyInvest.Credentials import AllyInvest.Error import AllyInvest.Internal import Data.Aeson import Data.Time import Data.List getTimeSales :: Credentials -> String -> Day -> IO (Either AllyInvestError [Candle]) getTimeSales cred sym day = fmap unCandleResult <$> fetchAndDecode cred url where url = intercalate "?" [ "https://api.tradeking.com/v1/market/timesales.json" , intercalate "&" . fmap (\(x,y) -> intercalate "=" [x, y]) $ [ ("symbols", sym) , ("startdate", show day) , ("enddate", show $ addDays 1 day) ] ] data Candle = Candle { tDate :: Day , tDateTime :: UTCTime , tLowPrice :: Double , tHighPrice :: Double , tOpenPrice :: Double , tLastPrice :: Double , tTradeVolume :: Int , tCumulativeTradeVolume :: Int } deriving Show instance FromJSON Candle where parseJSON (Object o) = Candle <$> (o .: "date") <*> (o .: "datetime") <*> (read <$> o .: "lo") <*> (read <$> o .: "hi") <*> (read <$> o .: "opn") <*> (read <$> o .: "last") <*> (read <$> o .: "incr_vl") <*> (read <$> o .: "vl") -------------------------------------------------------------------------------- -- private -------------------------------------------------------------------------------- data CandleResult = CandleResult { unCandleResult :: [Candle] } instance FromJSON CandleResult where parseJSON (Object o) = CandleResult <$> (o .: "response" >>= (.: "quotes") >>= (.: "quote"))