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.
58 lines
1.8 KiB
58 lines
1.8 KiB
|
|
module ATrade.Driver.Junction |
|
( |
|
junctionMain |
|
) where |
|
|
|
import ATrade.Driver.Junction.Types (StrategyDescriptor (..), |
|
StrategyInstance (..), |
|
StrategyInstanceDescriptor (..)) |
|
import Data.Aeson (decode) |
|
import qualified Data.ByteString as B |
|
import qualified Data.ByteString.Lazy as BL |
|
import Data.IORef |
|
import qualified Data.Map.Strict as M |
|
import qualified Data.Text as T |
|
|
|
load :: T.Text -> IO 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 |
|
Just (StrategyDescriptor _sName sCallback _sDefState) -> |
|
case (decode $ BL.fromStrict sCfg, decode $ BL.fromStrict sState) of |
|
(Just pCfg, Just pState) -> do |
|
cfgRef <- newIORef pCfg |
|
stateRef <- newIORef pState |
|
return $ StrategyInstance |
|
{ |
|
strategyInstanceId = strategyName desc, |
|
strategyEventCallback = sCallback, |
|
strategyState = stateRef, |
|
strategyConfig = cfgRef |
|
} |
|
_ -> undefined |
|
_ -> undefined |
|
|
|
start = undefined |
|
|
|
|
|
|
|
|
|
|