Browse Source

Various fixes

master
Denis Tereshkin 9 years ago
parent
commit
f22dd216b8
  1. 5
      src/ATrade/QuoteSource/Client.hs
  2. 12
      src/ATrade/QuoteSource/Server.hs
  3. 11
      src/ATrade/Types.hs

5
src/ATrade/QuoteSource/Client.hs

@ -43,6 +43,8 @@ startQuoteSourceClient chan tickers ctx endpoint = do @@ -43,6 +43,8 @@ startQuoteSourceClient chan tickers ctx endpoint = do
mapM_ (\t -> subscribe sock $ encodeUtf8 t) tickers
subscribe sock $ B8.pack "SYSTEM#HEARTBEAT"
now <- getCurrentTime
writeIORef lastHeartbeat now
whileM_ (notTimeout lastHeartbeat) $ do
evs <- poll 200 [Sock sock [In] Nothing]
when ((L.length . L.head) evs > 0) $ do
@ -53,7 +55,8 @@ startQuoteSourceClient chan tickers ctx endpoint = do @@ -53,7 +55,8 @@ startQuoteSourceClient chan tickers ctx endpoint = do
then writeIORef lastHeartbeat now
else case deserializeTick rawTick of
Just tick -> writeChan chan tick
Nothing -> warningM "QuoteSource.Client" "Error: can't deserialize tick")
Nothing -> warningM "QuoteSource.Client" "Error: can't deserialize tick"
debugM "QuoteSource.Client" "Heartbeat timeout")
notTimeout ts = do
now <- getCurrentTime

12
src/ATrade/QuoteSource/Server.hs

@ -22,7 +22,8 @@ data QuoteSourceServer = QuoteSourceServerState { @@ -22,7 +22,8 @@ data QuoteSourceServer = QuoteSourceServerState {
outSocket :: Socket Pub,
tickChannel :: BoundedChan QuoteSourceServerData,
completionMvar :: MVar (),
serverThreadId :: ThreadId
serverThreadId :: ThreadId,
heartbeatThreadId :: ThreadId
}
data QuoteSourceServerData = QSSTick Tick | QSSHeartbeat | QSSKill
@ -53,17 +54,22 @@ startQuoteSourceServer chan c ep = do @@ -53,17 +54,22 @@ startQuoteSourceServer chan c ep = do
sock <- socket c Pub
bind sock $ T.unpack ep
tid <- myThreadId
hbTid <- forkIO $ forever $ do
threadDelay 1000000
writeChan chan QSSHeartbeat
mv <- newEmptyMVar
let state = QuoteSourceServerState {
ctx = c,
outSocket = sock,
tickChannel = chan,
completionMvar = mv,
serverThreadId = tid
serverThreadId = tid,
heartbeatThreadId = hbTid
}
stid <- forkIO $ serverThread state
return $ state { serverThreadId = stid }
stopQuoteSourceServer :: QuoteSourceServer -> IO ()
stopQuoteSourceServer server = writeChan (tickChannel server) QSSKill >> readMVar (completionMvar server)
stopQuoteSourceServer server = killThread (heartbeatThreadId server) >> writeChan (tickChannel server) QSSKill >> readMVar (completionMvar server)

11
src/ATrade/Types.hs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
module ATrade.Types (
TickerId,
Tick(..),
Bar(..),
DataType(..),
serializeTick,
deserializeTick,
@ -136,6 +137,16 @@ deserializeTick (header:rawData:_) = case runGetOrFail parseTick rawData of @@ -136,6 +137,16 @@ deserializeTick (header:rawData:_) = case runGetOrFail parseTick rawData of
deserializeTick _ = Nothing
data Bar = Bar {
barSecurity :: !T.Text,
barTimestamp :: !UTCTime,
barOpen :: !Decimal,
barHigh :: !Decimal,
barLow :: !Decimal,
barClose :: !Decimal,
barVolume :: !Integer
} deriving (Show, Eq)
data SignalId = SignalId {
strategyId :: T.Text,
signalName :: T.Text,

Loading…
Cancel
Save