From 03d60a5ccd4a9f6160cb9f9fccfd487721db8cb5 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Tue, 28 Jan 2020 19:05:05 +0700 Subject: [PATCH] Merge commit 'a3464483ea429aafa5049b32886490f2373a6a5e' into stable --- robocom-zero.cabal | 2 + src/ATrade/BarAggregator.hs | 53 ++++++--------------- src/ATrade/Driver/Real/QuoteSourceThread.hs | 3 +- src/ATrade/RoboCom.hs | 26 ++++++++++ 4 files changed, 44 insertions(+), 40 deletions(-) create mode 100644 src/ATrade/RoboCom.hs diff --git a/robocom-zero.cabal b/robocom-zero.cabal index 3945aab..67586d1 100644 --- a/robocom-zero.cabal +++ b/robocom-zero.cabal @@ -28,6 +28,8 @@ library , ATrade.Driver.Real , ATrade.Driver.Backtest , ATrade.BarAggregator + , ATrade.RoboCom + other-modules: Paths_robocom_zero build-depends: base >= 4.7 && < 5 , libatrade >= 0.9.0.0 && < 0.10.0.0 , text diff --git a/src/ATrade/BarAggregator.hs b/src/ATrade/BarAggregator.hs index 55c54c0..7d09e68 100644 --- a/src/ATrade/BarAggregator.hs +++ b/src/ATrade/BarAggregator.hs @@ -186,51 +186,26 @@ updateTime tick = runState $ do handleBar :: Bar -> BarAggregator -> (Maybe Bar, BarAggregator) handleBar bar = runState $ do - tws <- gets tickTimeWindows mybars <- gets bars - if (any (isInTimeInterval bar) tws) - then - case M.lookup (barSecurity bar) mybars of - Just series -> case bsBars series of - (b:bs) -> do - let currentBn = barNumber (barTimestamp b) (tfSeconds $ bsTimeframe series) - if - | currentBn == barNumber (barTimestamp bar) (tfSeconds $ bsTimeframe series) -> do - lBars %= M.insert (barSecurity bar) series { bsBars = updateBar b bar : bs } - return Nothing - | currentBn < barNumber (barTimestamp bar) (tfSeconds $ bsTimeframe series) -> do - if barEndTime b (tfSeconds $ bsTimeframe series) == barTimestamp bar - then do - lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : (updateBar b bar : bs) } - return . Just $ updateBar b bar - else do - lBars %= M.insert (barSecurity bar) series { bsBars = bar : b : bs } - return . Just $ b - | otherwise -> return Nothing - _ -> do - lBars %= M.insert (barSecurity bar) series { bsBars = [bar] } - return Nothing - _ -> return Nothing - else - return Nothing + case M.lookup (barSecurity bar) mybars of + Just series -> case bsBars series of + (_:bs) -> do + lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : bar : bs } + return . Just $ bar + _ -> do + lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : [bar] } + return Nothing + _ -> return Nothing where - isInTimeInterval bar' (a, b) = (utctDayTime . barTimestamp) bar' >= a && (utctDayTime . barTimestamp) bar' <= b - updateBar !bar' newbar = - let newHigh = max (barHigh bar') (barHigh newbar) - newLow = min (barLow bar') (barLow newbar) in - bar' { - barTimestamp = barTimestamp newbar, - barHigh = newHigh, - barLow = newLow, - barClose = barClose newbar, - barVolume = barVolume bar' + (abs . barVolume $ newbar) } - - emptyBarFrom bar' = Bar { + emptyBarFrom bar' = newBar + where + newBar = Bar { barSecurity = barSecurity bar', - barTimestamp = 0.000001 `addUTCTime` barTimestamp bar', + barTimestamp = barTimestamp bar', barOpen = barClose bar', barHigh = barClose bar', barLow = barClose bar', barClose = barClose bar', barVolume = 0 } + diff --git a/src/ATrade/Driver/Real/QuoteSourceThread.hs b/src/ATrade/Driver/Real/QuoteSourceThread.hs index 51891df..9ad36b9 100644 --- a/src/ATrade/Driver/Real/QuoteSourceThread.hs +++ b/src/ATrade/Driver/Real/QuoteSourceThread.hs @@ -31,7 +31,7 @@ startQuoteSourceThread ctx qsEp strategy eventChan agg tickFilter maybeSourceTim bracket (startQuoteSourceClient tickChan tickersList ctx qsEp defaultClientSecurityParams) (\qs -> do stopQuoteSourceClient qs - debugM "Strategy" "Quotesource client: stop") + debugM "QSThread" "Quotesource client: stop") (\_ -> forever $ do qdata <- readChan tickChan case qdata of @@ -46,6 +46,7 @@ startQuoteSourceThread ctx qsEp strategy eventChan agg tickFilter maybeSourceTim Just _ -> return () QDBar (incomingTf, bar) -> do aggValue <- readIORef agg + -- debugM "QSThread" $ "Incoming bar: " ++ show incomingTf ++ ": " ++ show bar case maybeSourceTimeframe of Just tf -> when (tf == unBarTimeframe incomingTf) $ case handleBar bar aggValue of diff --git a/src/ATrade/RoboCom.hs b/src/ATrade/RoboCom.hs new file mode 100644 index 0000000..9d3a2bc --- /dev/null +++ b/src/ATrade/RoboCom.hs @@ -0,0 +1,26 @@ +{-# LANGUAGE TemplateHaskell #-} + +module ATrade.RoboCom +( + robocom_version +) where + +import Data.Version +import Paths_robocom_zero + +import Development.GitRev + +robocom_version :: Version +robocom_version = version + +robocom_gitrev :: String +robocom_gitrev = concat [ "robocom-zero-", + $(gitBranch), + "@", + $(gitHash), + dirty ] + where + dirty | $(gitDirty) = "+" + | otherwise = "" + +