From b9ec332126f7d7f32871acf01027d34e598acd08 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Tue, 27 Sep 2016 13:54:39 +0700 Subject: [PATCH] New type: Trade --- src/ATrade/Types.hs | 42 +++++++++++++++++++++++++++++++++++++++++- test/TestTypes.hs | 19 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/ATrade/Types.hs b/src/ATrade/Types.hs index 6fbd9b3..7ece555 100644 --- a/src/ATrade/Types.hs +++ b/src/ATrade/Types.hs @@ -9,7 +9,8 @@ module ATrade.Types ( OrderPrice(..), Operation(..), OrderState(..), - Order(..) + Order(..), + Trade(..) ) where import Control.Monad @@ -270,3 +271,42 @@ instance ToJSON Order where "signal-id" .= orderSignalId order ] ifMaybe :: (ToJSON a, KeyValue b) => Text -> (a -> Bool) -> a -> Maybe b ifMaybe name pred val = if pred val then Just (name .= val) else Nothing + +data Trade = Trade { + tradeOrderId :: OrderId, + tradePrice :: Decimal, + tradeQuantity :: Integer, + tradeVolume :: Decimal, + tradeVolumeCurrency :: String, + tradeOperation :: Operation, + tradeAccount :: String, + tradeSecurity :: String, + tradeTimestamp :: UTCTime, + tradeSignalId :: SignalId } + deriving (Show, Eq) + +instance FromJSON Trade where + parseJSON (Object trade) = Trade <$> + trade .: "order-id" <*> + trade .: "price" <*> + trade .: "quantity" <*> + trade .: "volume" <*> + trade .: "volume-currency" <*> + trade .: "operation" <*> + trade .: "account" <*> + trade .: "security" <*> + trade .: "execution-time" <*> + trade .: "signal-id" + parseJSON _ = fail "Should be object" + +instance ToJSON Trade where + toJSON trade = object [ "order-id" .= tradeOrderId trade, + "price" .= tradePrice trade, + "quantity" .= tradeQuantity trade, + "volume" .= tradeVolume trade, + "volume-currency" .= tradeVolumeCurrency trade, + "operation" .= tradeOperation trade, + "account" .= tradeAccount trade, + "security" .= tradeSecurity trade, + "execution-time" .= tradeTimestamp trade, + "signal-id" .= tradeSignalId trade] diff --git a/test/TestTypes.hs b/test/TestTypes.hs index 1cac414..6bcfdea 100644 --- a/test/TestTypes.hs +++ b/test/TestTypes.hs @@ -83,6 +83,19 @@ instance Arbitrary Order where arbitrary <*> arbitrary +instance Arbitrary Trade where + arbitrary = Trade <$> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary <*> + arbitrary + properties = testGroup "Types" [ testTickSerialization , testSignalIdSerialization @@ -90,6 +103,7 @@ properties = testGroup "Types" [ , testOperationSerialization , testOrderStateSerialization , testOrderSerialization + , testTradeSerialization ] testTickSerialization = QC.testProperty "Deserialize serialized tick" @@ -121,3 +135,8 @@ testOrderSerialization = QC.testProperty "Deserialize serialized Order" (\v -> case (decode . encode $ v :: Maybe Order) of Just s -> s == v Nothing -> False) + +testTradeSerialization = QC.testProperty "Deserialize serialized Trade" + (\v -> case (decode . encode $ v :: Maybe Trade) of + Just s -> s == v + Nothing -> False)