From e3adb5bafc1e187f30abf7a95d24540c93dfdd7a Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Sun, 28 Nov 2021 10:42:31 +0700 Subject: [PATCH] junction: save timers --- src/ATrade/Driver/Junction.hs | 7 +++++-- src/ATrade/Driver/Junction/RobotDriverThread.hs | 5 +++-- src/ATrade/Driver/Junction/Types.hs | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ATrade/Driver/Junction.hs b/src/ATrade/Driver/Junction.hs index 0cd0f94..ac902a3 100644 --- a/src/ATrade/Driver/Junction.hs +++ b/src/ATrade/Driver/Junction.hs @@ -32,7 +32,8 @@ import ATrade.Driver.Junction.Types (StrategyDescriptor StrategyInstance (strategyInstanceId), StrategyInstanceDescriptor (..), confStrategy, - strategyState) + strategyState, + strategyTimers) import ATrade.Quotes.QHP (mkQHPHandle) import ATrade.RoboCom.ConfigStorage (ConfigStorage (loadConfig)) import ATrade.RoboCom.Persistence (MonadPersistence (loadState, saveState)) @@ -171,6 +172,8 @@ junctionMain descriptors = do saveRobotState handle = onStrategyInstance handle $ \inst -> do currentState <- liftIO $ readIORef (strategyState inst) saveState currentState (strategyInstanceId inst) + currentTimers <- liftIO $ readIORef (strategyTimers inst) + saveState currentTimers (strategyInstanceId inst <> ":timers") startRobots cfg bro barsMap = forM_ (instances cfg) $ \inst -> case M.lookup (strategyBaseName inst) descriptors of @@ -180,7 +183,7 @@ junctionMain descriptors = do rState <- loadState (stateKey inst) >>= liftIO . newIORef rTimers <- loadState (stateKey inst <> ":timers") >>= liftIO . newIORef let robotEnv = RobotEnv rState rConf rTimers bro barsMap - robot <- createRobotDriverThread inst desc (flip runReaderT robotEnv . unRobotM) bigConf rConf rState + robot <- createRobotDriverThread inst desc (flip runReaderT robotEnv . unRobotM) bigConf rConf rState rTimers robotsMap' <- asks peRobots liftIO $ atomicModifyIORef' robotsMap' (\s -> (M.insert (strategyId inst) robot s, ())) Nothing -> error "Unknown strategy" diff --git a/src/ATrade/Driver/Junction/RobotDriverThread.hs b/src/ATrade/Driver/Junction/RobotDriverThread.hs index d9093f1..1652f3f 100644 --- a/src/ATrade/Driver/Junction/RobotDriverThread.hs +++ b/src/ATrade/Driver/Junction/RobotDriverThread.hs @@ -96,12 +96,13 @@ createRobotDriverThread :: (MonadIO m1, -> BigConfig c -> IORef c -> IORef s + -> IORef [UTCTime] -> m1 RobotDriverHandle -createRobotDriverThread instDesc strDesc runner bigConf rConf rState = do +createRobotDriverThread instDesc strDesc runner bigConf rConf rState rTimers = do eventQueue <- liftIO $ newBoundedChan 2000 - let inst = StrategyInstance (strategyId instDesc) (eventCallback strDesc) rState rConf + let inst = StrategyInstance (strategyId instDesc) (eventCallback strDesc) rState rConf rTimers quoteQueue <- liftIO $ newBoundedChan 2000 forM_ (confTickers bigConf) (\x -> addSubscription (QuoteSubscription (tickerId x) (timeframe x)) quoteQueue) diff --git a/src/ATrade/Driver/Junction/Types.hs b/src/ATrade/Driver/Junction/Types.hs index ac175e2..8ff13e1 100644 --- a/src/ATrade/Driver/Junction/Types.hs +++ b/src/ATrade/Driver/Junction/Types.hs @@ -20,6 +20,7 @@ import Data.Aeson (FromJSON (..), ToJSON (..)) import Data.Default (Default) import Data.IORef (IORef) import qualified Data.Text as T +import Data.Time (UTCTime) import Dhall (FromDhall) import GHC.Generics (Generic) @@ -68,7 +69,8 @@ data StrategyInstance c s = strategyInstanceId :: T.Text, strategyEventCallback :: EventCallback c s, strategyState :: IORef s, - strategyConfig :: IORef c + strategyConfig :: IORef c, + strategyTimers :: IORef [UTCTime] } data StrategyInstanceE = forall c s. (FromDhall c, Default s, FromJSON s, ToJSON s) => StrategyInstanceE (StrategyInstance c s)