Market Data Storage Server
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.1 KiB

8 years ago
{-# LANGUAGE MultiWayIf #-}
module ATrade.MDS.Protocol (
8 years ago
QHPRequest(..),
HAPRequest(..),
Period(..),
periodSeconds
) where
8 years ago
-- import ATrade.Types
import Data.Aeson
8 years ago
import Data.Aeson.Types
import Data.Time.Clock
8 years ago
import qualified Data.Text as T
data Period =
Period1Min |
Period5Min |
Period15Min |
Period30Min |
PeriodHour |
PeriodDay |
PeriodWeek |
PeriodMonth
deriving (Eq)
instance Show Period where
show Period1Min = "M1"
show Period5Min = "M5"
show Period15Min = "M15"
show Period30Min = "M30"
show PeriodHour = "H1"
show PeriodDay = "D"
show PeriodWeek = "W"
show PeriodMonth = "MN"
periodSeconds :: Period -> Int
periodSeconds Period1Min = 60
periodSeconds Period5Min = 60 * 5
periodSeconds Period15Min = 60 * 15
periodSeconds Period30Min = 60 * 30
periodSeconds PeriodHour = 3600
periodSeconds PeriodDay = 86400
periodSeconds PeriodWeek = 86400 * 7
periodSeconds PeriodMonth = 86400 * 7 * 4
8 years ago
data QHPRequest =
QHPRequest {
rqTicker :: T.Text,
rqStartTime :: UTCTime,
rqEndTime :: UTCTime,
rqPeriod :: Period
} deriving (Show, Eq)
instance FromJSON QHPRequest where
parseJSON = withObject "Request" $ \v -> QHPRequest <$>
v .: "ticker" <*>
v .: "from" <*>
v .: "to" <*>
(v .: "timeframe" >>= parseTf)
where
parseTf :: T.Text -> Parser Period
parseTf t = if
| t == "M1" -> return Period1Min
| t == "M5" -> return Period5Min
| t == "M15" -> return Period15Min
| t == "M30" -> return Period30Min
| t == "H1" -> return PeriodHour
| t == "D" -> return PeriodDay
| t == "W" -> return PeriodWeek
| t == "MN" -> return PeriodMonth
| otherwise -> fail "Invalid period specified"
8 years ago
data HAPRequest =
HAPRequest {
hapTicker :: T.Text,
hapStartTime :: UTCTime,
hapEndTime :: UTCTime,
hapTimeframeSec :: Int
} deriving (Show, Eq)
8 years ago
instance FromJSON HAPRequest where
parseJSON = withObject "Request" $ \v -> HAPRequest <$>
v .: "ticker" <*>
v .: "start_time" <*>
v .: "end_time" <*>
v .: "timeframe_sec"