Browse Source

More real driver refactoring

stable
Denis Tereshkin 5 years ago
parent
commit
9d5cb7f076
  1. 4
      src/ATrade/Driver/Backtest.hs
  2. 31
      src/ATrade/Driver/Real.hs
  3. 4
      src/ATrade/Driver/Types.hs

4
src/ATrade/Driver/Backtest.hs

@ -102,10 +102,6 @@ backtestMain _dataDownloadDelta defaultState initCallback callback = do @@ -102,10 +102,6 @@ backtestMain _dataDownloadDelta defaultState initCallback callback = do
strategyAccount = "foo",
strategyVolume = 1,
tickers = tickerList,
strategyQuotesourceEp = "",
strategyBrokerEp = "",
strategyHistoryProviderType = "",
strategyHistoryProvider = "",
strategyQTISEp = T.pack <$> qtisEndpoint params}
updatedConfig <- case initCallback of

31
src/ATrade/Driver/Real.hs

@ -223,10 +223,6 @@ robotMain dataDownloadDelta defaultState initCallback callback = do @@ -223,10 +223,6 @@ robotMain dataDownloadDelta defaultState initCallback callback = do
strategyAccount = T.pack . accountId $ params,
strategyVolume = volumeFactor params,
tickers = tickerList,
strategyQuotesourceEp = T.pack . quotesourceEp $ params,
strategyBrokerEp = T.pack . brokerEp $ params,
strategyHistoryProviderType = T.pack $ fromMaybe "finam" $ historyProviderType params,
strategyHistoryProvider = T.pack $ fromMaybe "" $ historyProvider params,
strategyQTISEp = T.pack <$> qtisSocket params}
updatedConfig <- case initCallback of
@ -261,11 +257,19 @@ robotMain dataDownloadDelta defaultState initCallback callback = do @@ -261,11 +257,19 @@ robotMain dataDownloadDelta defaultState initCallback callback = do
debugM "main" "Starting strategy driver"
withContext (\ctx -> do
let qsEp = T.pack $ quotesourceEp params
let brEp = T.pack $ brokerEp params
agg <- newIORef $ mkAggregatorFromBars M.empty [(hmsToDiffTime 3 50 0, hmsToDiffTime 21 10 0)]
bracket (startQuoteSourceThread ctx qsEp strategy eventChan agg tickFilter (sourceBarTimeframe params)) killThread $ \_ -> do
debugM "Strategy" "QuoteSource thread forked"
bracket (startBrokerClientThread (strategyInstanceId . strategyInstanceParams $ strategy) ctx brEp brokerChan eventChan shutdownMv) killThread $ \_ -> do
debugM "Strategy" "Broker thread forked"
now <- getCurrentTime >>= newIORef
let env = Env {
envHistorySource = mkQHPHandle ctx (strategyHistoryProvider . strategyInstanceParams $ strategy),
envHistorySource = mkQHPHandle ctx (T.pack . fromMaybe "" . historyProvider $ params),
envStrategyInstanceParams = instanceParams,
envStrategyEnvironment = straEnv,
envConfigRef = configRef,
@ -276,7 +280,7 @@ robotMain dataDownloadDelta defaultState initCallback callback = do @@ -276,7 +280,7 @@ robotMain dataDownloadDelta defaultState initCallback callback = do
envAggregator = agg,
envLastTimestamp = now
}
runReaderT (barStrategyDriver ctx (sourceBarTimeframe params) tickFilter strategy shutdownMv) env `finally` killThread stateSavingThread)
runReaderT (barStrategyDriver strategy shutdownMv) env `finally` killThread stateSavingThread)
where
tickFilter :: Tick -> Bool
tickFilter tick =
@ -378,8 +382,8 @@ mkBarStrategy instanceParams dd params initialState cb = BarStrategy { @@ -378,8 +382,8 @@ mkBarStrategy instanceParams dd params initialState cb = BarStrategy {
-- | Main function which handles incoming events (ticks/orders), passes them to strategy callback
-- and executes returned strategy actions
barStrategyDriver :: (MonadHistory (App hs c s)) => Context -> Maybe Int -> (Tick -> Bool) -> Strategy c s -> MVar () -> App hs c s ()
barStrategyDriver ctx mbSourceTimeframe tickFilter strategy shutdownVar = do
barStrategyDriver :: (MonadHistory (App hs c s)) => Strategy c s -> MVar () -> App hs c s ()
barStrategyDriver strategy shutdownVar = do
now <- liftIO getCurrentTime
history <- M.fromList <$> mapM (loadTickerHistory now) (tickers . strategyInstanceParams $ strategy)
eventChan <- asks envEventChan
@ -387,11 +391,6 @@ barStrategyDriver ctx mbSourceTimeframe tickFilter strategy shutdownVar = do @@ -387,11 +391,6 @@ barStrategyDriver ctx mbSourceTimeframe tickFilter strategy shutdownVar = do
agg <- asks envAggregator
liftIO $ atomicModifyIORef' agg (\s -> (replaceHistory s history, ()))
bracket (lift $ startQuoteSourceThread ctx qsEp strategy eventChan agg tickFilter mbSourceTimeframe) (lift . killThread) (\_ -> do
lift $ debugM "Strategy" "QuoteSource thread forked"
bracket (lift $ startBrokerClientThread (strategyInstanceId . strategyInstanceParams $ strategy) ctx brEp brokerChan eventChan shutdownVar) (lift . killThread) (\_ -> do
lift $ debugM "Strategy" "Broker thread forked"
wakeupTid <- lift . forkIO $ forever $ do
maybeShutdown <- tryTakeMVar shutdownVar
if isJust maybeShutdown
@ -403,13 +402,9 @@ barStrategyDriver ctx mbSourceTimeframe tickFilter strategy shutdownVar = do @@ -403,13 +402,9 @@ barStrategyDriver ctx mbSourceTimeframe tickFilter strategy shutdownVar = do
readAndHandleEvents agg strategy
lift $ debugM "Strategy" "Stopping strategy driver"
lift $ killThread wakeupTid))
lift $ debugM "Strategy" "Strategy done"
lift $ killThread wakeupTid
where
qsEp = strategyQuotesourceEp . strategyInstanceParams $ strategy
brEp = strategyBrokerEp . strategyInstanceParams $ strategy
loadTickerHistory now t = do
history <- getHistory (code t) (BarTimeframe (fromInteger . timeframeSeconds $ t))

4
src/ATrade/Driver/Types.hs

@ -30,10 +30,6 @@ data StrategyInstanceParams = StrategyInstanceParams { @@ -30,10 +30,6 @@ data StrategyInstanceParams = StrategyInstanceParams {
strategyAccount :: T.Text, -- ^ Account string to use for this strategy instance. Broker-dependent
strategyVolume :: Int, -- ^ Volume to use for this instance (in lots/contracts)
tickers :: [Ticker], -- ^ List of tickers which is used by this strategy
strategyQuotesourceEp :: T.Text, -- ^ QuoteSource server endpoint
strategyBrokerEp :: T.Text, -- ^ Broker server endpoint
strategyHistoryProviderType :: T.Text,
strategyHistoryProvider :: T.Text,
strategyQTISEp :: Maybe T.Text
}

Loading…
Cancel
Save