schedule function offsets

Makes `AfterOpen` an offset from the actual market open, not from the first bar of data for a day.

Prevents offsets of 0 from being passed to `AfterOpen` or `BeforeClose`.
Looking back at it, it seemed really strange that I wasn't caching the value for the duration of a day. Because this happens in the trading simulation, I figured it would be simple enough to fix it.