Browse Source

Bar aggregator: use incoming bars as is

stable
Denis Tereshkin 6 years ago
parent
commit
7f12ce1e64
  1. 46
      src/ATrade/BarAggregator.hs

46
src/ATrade/BarAggregator.hs

@ -186,56 +186,14 @@ updateTime tick = runState $ do
handleBar :: Bar -> BarAggregator -> (Maybe Bar, BarAggregator) handleBar :: Bar -> BarAggregator -> (Maybe Bar, BarAggregator)
handleBar bar = runState $ do handleBar bar = runState $ do
tws <- gets tickTimeWindows
mybars <- gets bars mybars <- gets bars
if (any (isInTimeInterval bar) tws)
then
case M.lookup (barSecurity bar) mybars of case M.lookup (barSecurity bar) mybars of
Just series -> case bsBars series of Just series -> case bsBars series of
(b:bs) -> do (b:bs) -> do
let currentBn = barNumber (barTimestamp b) (tfSeconds $ bsTimeframe series) lBars %= M.insert (barSecurity bar) series { bsBars = bar : b : bs }
if return . Just $ b
| 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 _ -> do
lBars %= M.insert (barSecurity bar) series { bsBars = [bar] } lBars %= M.insert (barSecurity bar) series { bsBars = [bar] }
return Nothing return Nothing
_ -> 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 }

Loading…
Cancel
Save