@ -1,6 +1,7 @@
@@ -1,6 +1,7 @@
{- # LANGUAGE BangPatterns # -}
{- # LANGUAGE DuplicateRecordFields # -}
{- # LANGUAGE FlexibleContexts # -}
{- # LANGUAGE GADTs # -}
{- # LANGUAGE MultiParamTypeClasses # -}
{- # LANGUAGE ScopedTypeVariables # -}
@ -32,7 +33,7 @@ import Control.Concurrent.STM (TVar, atomically, modifyTVar',
@@ -32,7 +33,7 @@ import Control.Concurrent.STM (TVar, atomically, modifyTVar',
import Control.Concurrent.STM.TBQueue ( TBQueue , flushTBQueue ,
readTBQueue , writeTBQueue )
import Control.Exception
import Control.Monad ( forM_ , void , when )
import Control.Monad ( forM_ , unless , void , when )
import Control.Monad.Extra ( whileM )
import qualified Data.Bimap as BM
import Data.Maybe ( catMaybes , fromMaybe )
@ -104,6 +105,7 @@ import Control.Monad.IO.Class (MonadIO (liftIO))
@@ -104,6 +105,7 @@ import Control.Monad.IO.Class (MonadIO (liftIO))
import Control.Monad.Reader.Class ( MonadReader , asks )
import Data.Int ( Int64 )
import qualified Data.Map.Strict as M
import qualified Data.Set as S
import Data.Time.Clock ( UTCTime , diffUTCTime ,
getCurrentTime )
import FSM ( FSMCallback ( .. ) ,
@ -141,6 +143,7 @@ data Env =
@@ -141,6 +143,7 @@ data Env =
, brokerState :: BrokerState
, runVar :: TMVar ()
, timerVar :: TMVar ()
, processedTrades :: TVar ( S . Set Int64 )
}
data MainQueueData =
@ -297,19 +300,31 @@ handleTransaqData transaqData = do
@@ -297,19 +300,31 @@ handleTransaqData transaqData = do
trIdMap <- liftIO $ readTVarIO ( bsOrderTransactionIdMap brState )
maybeCb <- liftIO $ readTVarIO ( bsNotificationCallback brState )
orderMap <- liftIO $ readTVarIO ( bsOrderMap brState )
case maybeCb of
Just cb -> case BM . lookupR ( ExchangeOrderId ( tOrderNo transaqTrade ) ) trIdMap of
Just oid -> case M . lookup oid orderMap of
Just order -> do
tisH <- asks tisHandle
let tickerId' = tBoard transaqTrade <> " # " <> tSecCode transaqTrade
maybeTickerInfo <- liftIO $ getTickerInfo tickerId' tisH
let notif = BackendTradeNotification ( fromTransaqTrade transaqTrade order maybeTickerInfo )
log Debug " TXMLConnector.WorkThread " $ " Sending trade notification: " <> ( T . pack . show ) notif
liftIO $ cb notif
_ -> log Warning " TXMLConnector.WorkThread " $ " Unable to find order for trade: " <> ( T . pack . show ) transaqTrade
_ -> log Warning " TXMLConnector.WorkThread " $ " Unable to find order in ordermap: " <> ( T . pack . show ) transaqTrade
Nothing -> log Warning " TXMLConnector.WorkThread " " No callback for trade notification! "
isAlreadyProcessed <- checkIfTradeIsAlreadyProcessed transaqTrade
unless isAlreadyProcessed $
case maybeCb of
Just cb -> case BM . lookupR ( ExchangeOrderId ( tOrderNo transaqTrade ) ) trIdMap of
Just oid -> case M . lookup oid orderMap of
Just order -> do
tisH <- asks tisHandle
let tickerId' = tBoard transaqTrade <> " # " <> tSecCode transaqTrade
maybeTickerInfo <- liftIO $ getTickerInfo tickerId' tisH
let notif = BackendTradeNotification ( fromTransaqTrade transaqTrade order maybeTickerInfo )
log Debug " TXMLConnector.WorkThread " $ " Sending trade notification: " <> ( T . pack . show ) notif
liftIO $ cb notif
addTradeToProcessed transaqTrade
_ -> log Warning " TXMLConnector.WorkThread " $ " Unable to find order for trade: " <> ( T . pack . show ) transaqTrade
_ -> log Warning " TXMLConnector.WorkThread " $ " Unable to find order in ordermap: " <> ( T . pack . show ) transaqTrade
Nothing -> log Warning " TXMLConnector.WorkThread " " No callback for trade notification! "
checkIfTradeIsAlreadyProcessed trade = do
trades <- asks processedTrades
set <- liftIO $ readTVarIO trades
pure $ S . member ( tTradeNo trade ) set
addTradeToProcessed trade = do
trades <- asks processedTrades
liftIO $ atomically $ modifyTVar' trades ( S . insert $ tTradeNo trade )
fromTransaqTrade :: TradeNotification -> Order -> Maybe TickerInfo -> Trade