3 changed files with 114 additions and 0 deletions
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
|
||||
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 |
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
{-# LANGUAGE ExistentialQuantification #-} |
||||
{-# LANGUAGE RankNTypes #-} |
||||
|
||||
module ATrade.Driver.Junction.Types |
||||
( |
||||
StrategyDescriptor(..), |
||||
TickerConfig(..), |
||||
StrategyInstanceDescriptor(..), |
||||
StrategyInstance(..) |
||||
) where |
||||
|
||||
import ATrade.RoboCom.Monad (EventCallback) |
||||
import ATrade.Types (BarTimeframe, TickerId) |
||||
import Data.Aeson (FromJSON (..), ToJSON (..)) |
||||
import qualified Data.ByteString as B |
||||
import Data.IORef |
||||
import qualified Data.Text as T |
||||
|
||||
data StrategyDescriptor = |
||||
forall c s. (FromJSON s, ToJSON s, FromJSON c) => |
||||
StrategyDescriptor |
||||
{ |
||||
baseStrategyName :: T.Text, |
||||
eventCallback :: EventCallback c s, |
||||
defaultState :: s |
||||
} |
||||
|
||||
data TickerConfig = |
||||
TickerConfig |
||||
{ |
||||
tickerId :: TickerId, |
||||
timeframe :: BarTimeframe |
||||
} |
||||
|
||||
data StrategyInstanceDescriptor = |
||||
StrategyInstanceDescriptor |
||||
{ |
||||
strategyId :: T.Text, |
||||
strategyName :: T.Text, |
||||
configKey :: T.Text, |
||||
stateKey :: T.Text, |
||||
logPath :: T.Text, |
||||
tickers :: [TickerConfig] |
||||
} |
||||
|
||||
data StrategyInstance = |
||||
forall c s. (FromJSON s, ToJSON s, FromJSON c) => |
||||
StrategyInstance |
||||
{ |
||||
strategyInstanceId :: T.Text, |
||||
strategyEventCallback :: EventCallback c s, |
||||
strategyState :: IORef s, |
||||
strategyConfig :: IORef c |
||||
} |
||||
Loading…
Reference in new issue