Execution layer for algorithmic trading
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.6 KiB

4 years ago
{-# LANGUAGE OverloadedStrings #-}
module ATrade.Driver.Junction
(
junctionMain
) where
import ATrade.Driver.Junction.Types (StrategyDescriptor (..),
StrategyInstance (..),
StrategyInstanceDescriptor (..))
4 years ago
import ATrade.RoboCom.Types (Ticker (..))
import Data.Aeson (FromJSON (..), ToJSON (..),
decode, object, withObject, (.:),
(.=))
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import Data.IORef
import qualified Data.Map.Strict as M
4 years ago
import Data.Maybe (fromMaybe)
import qualified Data.Text as T
4 years ago
data BigConfig c = BigConfig {
confTickers :: [Ticker],
confStrategy :: c
}
instance (FromJSON c) => FromJSON (BigConfig c) where
parseJSON = withObject "object" (\obj -> BigConfig <$>
obj .: "tickers" <*>
obj .: "params")
instance (ToJSON c) => ToJSON (BigConfig c) where
toJSON conf = object ["tickers" .= confTickers conf,
"params" .= confStrategy conf ]
load :: T.Text -> IO (Maybe B.ByteString)
load = undefined
junctionMain :: M.Map T.Text StrategyDescriptor -> IO ()
junctionMain descriptors = do
parseOptions
instanceDescriptors <- undefined
strategies <- mkStrategies instanceDescriptors
start strategies
where
parseOptions = undefined
mkStrategies :: [StrategyInstanceDescriptor] -> IO [StrategyInstance]
mkStrategies = mapM mkStrategy
mkStrategy :: StrategyInstanceDescriptor -> IO StrategyInstance
mkStrategy desc = do
sState <- load (stateKey desc)
sCfg <- load (configKey desc)
case M.lookup (strategyId desc) descriptors of
4 years ago
Just (StrategyDescriptor _sName sCallback sDefState) ->
case (sCfg >>= decode . BL.fromStrict, fromMaybe sDefState (sState >>= decode . BL.fromStrict)) of
(Just bigConfig, pState) -> do
cfgRef <- newIORef (confStrategy bigConfig)
stateRef <- newIORef pState
return $ StrategyInstance
{
strategyInstanceId = strategyName desc,
strategyEventCallback = sCallback,
strategyState = stateRef,
strategyConfig = cfgRef
}
4 years ago
_ -> error "Can't read state and config"
_ -> error $ "Can't find strategy: " ++ T.unpack (strategyId desc)
4 years ago
start strategy = undefined