|
|
|
@ -186,51 +186,26 @@ 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) |
|
|
|
case M.lookup (barSecurity bar) mybars of |
|
|
|
then |
|
|
|
Just series -> case bsBars series of |
|
|
|
case M.lookup (barSecurity bar) mybars of |
|
|
|
(_:bs) -> do |
|
|
|
Just series -> case bsBars series of |
|
|
|
lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : bar : bs } |
|
|
|
(b:bs) -> do |
|
|
|
return . Just $ bar |
|
|
|
let currentBn = barNumber (barTimestamp b) (tfSeconds $ bsTimeframe series) |
|
|
|
_ -> do |
|
|
|
if |
|
|
|
lBars %= M.insert (barSecurity bar) series { bsBars = emptyBarFrom bar : [bar] } |
|
|
|
| currentBn == barNumber (barTimestamp bar) (tfSeconds $ bsTimeframe series) -> do |
|
|
|
return Nothing |
|
|
|
lBars %= M.insert (barSecurity bar) series { bsBars = updateBar b bar : bs } |
|
|
|
_ -> return Nothing |
|
|
|
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 |
|
|
|
|
|
|
|
where |
|
|
|
where |
|
|
|
isInTimeInterval bar' (a, b) = (utctDayTime . barTimestamp) bar' >= a && (utctDayTime . barTimestamp) bar' <= b |
|
|
|
emptyBarFrom bar' = newBar |
|
|
|
updateBar !bar' newbar = |
|
|
|
where |
|
|
|
let newHigh = max (barHigh bar') (barHigh newbar) |
|
|
|
newBar = Bar { |
|
|
|
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', |
|
|
|
barSecurity = barSecurity bar', |
|
|
|
barTimestamp = 0.000001 `addUTCTime` barTimestamp bar', |
|
|
|
barTimestamp = barTimestamp bar', |
|
|
|
barOpen = barClose bar', |
|
|
|
barOpen = barClose bar', |
|
|
|
barHigh = barClose bar', |
|
|
|
barHigh = barClose bar', |
|
|
|
barLow = barClose bar', |
|
|
|
barLow = barClose bar', |
|
|
|
barClose = barClose bar', |
|
|
|
barClose = barClose bar', |
|
|
|
barVolume = 0 } |
|
|
|
barVolume = 0 } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|