Browse Source

junction: save timers

junction
Denis Tereshkin 4 years ago
parent
commit
e3adb5bafc
  1. 7
      src/ATrade/Driver/Junction.hs
  2. 5
      src/ATrade/Driver/Junction/RobotDriverThread.hs
  3. 4
      src/ATrade/Driver/Junction/Types.hs

7
src/ATrade/Driver/Junction.hs

@ -32,7 +32,8 @@ import ATrade.Driver.Junction.Types (StrategyDescriptor
StrategyInstance (strategyInstanceId), StrategyInstance (strategyInstanceId),
StrategyInstanceDescriptor (..), StrategyInstanceDescriptor (..),
confStrategy, confStrategy,
strategyState) strategyState,
strategyTimers)
import ATrade.Quotes.QHP (mkQHPHandle) import ATrade.Quotes.QHP (mkQHPHandle)
import ATrade.RoboCom.ConfigStorage (ConfigStorage (loadConfig)) import ATrade.RoboCom.ConfigStorage (ConfigStorage (loadConfig))
import ATrade.RoboCom.Persistence (MonadPersistence (loadState, saveState)) import ATrade.RoboCom.Persistence (MonadPersistence (loadState, saveState))
@ -171,6 +172,8 @@ junctionMain descriptors = do
saveRobotState handle = onStrategyInstance handle $ \inst -> do saveRobotState handle = onStrategyInstance handle $ \inst -> do
currentState <- liftIO $ readIORef (strategyState inst) currentState <- liftIO $ readIORef (strategyState inst)
saveState currentState (strategyInstanceId inst) saveState currentState (strategyInstanceId inst)
currentTimers <- liftIO $ readIORef (strategyTimers inst)
saveState currentTimers (strategyInstanceId inst <> ":timers")
startRobots cfg bro barsMap = forM_ (instances cfg) $ \inst -> startRobots cfg bro barsMap = forM_ (instances cfg) $ \inst ->
case M.lookup (strategyBaseName inst) descriptors of case M.lookup (strategyBaseName inst) descriptors of
@ -180,7 +183,7 @@ junctionMain descriptors = do
rState <- loadState (stateKey inst) >>= liftIO . newIORef rState <- loadState (stateKey inst) >>= liftIO . newIORef
rTimers <- loadState (stateKey inst <> ":timers") >>= liftIO . newIORef rTimers <- loadState (stateKey inst <> ":timers") >>= liftIO . newIORef
let robotEnv = RobotEnv rState rConf rTimers bro barsMap 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 robotsMap' <- asks peRobots
liftIO $ atomicModifyIORef' robotsMap' (\s -> (M.insert (strategyId inst) robot s, ())) liftIO $ atomicModifyIORef' robotsMap' (\s -> (M.insert (strategyId inst) robot s, ()))
Nothing -> error "Unknown strategy" Nothing -> error "Unknown strategy"

5
src/ATrade/Driver/Junction/RobotDriverThread.hs

@ -96,12 +96,13 @@ createRobotDriverThread :: (MonadIO m1,
-> BigConfig c -> BigConfig c
-> IORef c -> IORef c
-> IORef s -> IORef s
-> IORef [UTCTime]
-> m1 RobotDriverHandle -> m1 RobotDriverHandle
createRobotDriverThread instDesc strDesc runner bigConf rConf rState = do createRobotDriverThread instDesc strDesc runner bigConf rConf rState rTimers = do
eventQueue <- liftIO $ newBoundedChan 2000 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 quoteQueue <- liftIO $ newBoundedChan 2000
forM_ (confTickers bigConf) (\x -> addSubscription (QuoteSubscription (tickerId x) (timeframe x)) quoteQueue) forM_ (confTickers bigConf) (\x -> addSubscription (QuoteSubscription (tickerId x) (timeframe x)) quoteQueue)

4
src/ATrade/Driver/Junction/Types.hs

@ -20,6 +20,7 @@ import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Default (Default) import Data.Default (Default)
import Data.IORef (IORef) import Data.IORef (IORef)
import qualified Data.Text as T import qualified Data.Text as T
import Data.Time (UTCTime)
import Dhall (FromDhall) import Dhall (FromDhall)
import GHC.Generics (Generic) import GHC.Generics (Generic)
@ -68,7 +69,8 @@ data StrategyInstance c s =
strategyInstanceId :: T.Text, strategyInstanceId :: T.Text,
strategyEventCallback :: EventCallback c s, strategyEventCallback :: EventCallback c s,
strategyState :: IORef 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) data StrategyInstanceE = forall c s. (FromDhall c, Default s, FromJSON s, ToJSON s) => StrategyInstanceE (StrategyInstance c s)

Loading…
Cancel
Save