Browse Source

New type: Trade

master
Denis Tereshkin 9 years ago
parent
commit
b9ec332126
  1. 42
      src/ATrade/Types.hs
  2. 19
      test/TestTypes.hs

42
src/ATrade/Types.hs

@ -9,7 +9,8 @@ module ATrade.Types ( @@ -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 @@ -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]

19
test/TestTypes.hs

@ -83,6 +83,19 @@ instance Arbitrary Order where @@ -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" [ @@ -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" @@ -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)

Loading…
Cancel
Save