From 7f12ce1e644a9f6c22cf9a55206430c7a8f36176 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Sun, 29 Sep 2019 17:19:53 +0700 Subject: [PATCH] Bar aggregator: use incoming bars as is --- src/ATrade/BarAggregator.hs | 60 ++++++------------------------------- 1 file changed, 9 insertions(+), 51 deletions(-) diff --git a/src/ATrade/BarAggregator.hs b/src/ATrade/BarAggregator.hs index 0829274..7389745 100644 --- a/src/ATrade/BarAggregator.hs +++ b/src/ATrade/BarAggregator.hs @@ -186,56 +186,14 @@ 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 - if barVolume b > 0 - then do - lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : bar : b : bs } - return . Just $ bar - else do - lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : bar : bs } - return . Just $ bar - | otherwise -> return Nothing - _ -> do - lBars %= M.insert (barSecurity bar) series { bsBars = [bar] } - return Nothing - _ -> return Nothing - else - 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 { - barSecurity = barSecurity bar', - barTimestamp = 0.000001 `addUTCTime` barTimestamp bar', - barOpen = barClose bar', - barHigh = barClose bar', - barLow = barClose bar', - barClose = barClose bar', - barVolume = 0 } + case M.lookup (barSecurity bar) mybars of + Just series -> case bsBars series of + (b:bs) -> do + lBars %= M.insert (barSecurity bar) series { bsBars = bar : b : bs } + return . Just $ b + _ -> do + lBars %= M.insert (barSecurity bar) series { bsBars = [bar] } + return Nothing + _ -> return Nothing