Commit Graph

3203 Commits (17007e32059ac2a1ad005f4236d646d8948451a9)

Author SHA1 Message Date
Tyler Goodlet 17007e3205 Drop `Flume.index_stream()`, `._sampling.open_sample_stream()` replaces it 2023-01-30 11:49:06 -05:00
Tyler Goodlet 20df710525 Add back another panes resize during startup 2023-01-30 11:49:06 -05:00
Tyler Goodlet 9ca6cad345 Always zero-on-step $vlm 2023-01-30 11:49:06 -05:00
Tyler Goodlet 089fb01ec6 Do full marker width after line 2023-01-30 11:49:06 -05:00
Tyler Goodlet 63909af072 Fix indent level 2023-01-30 11:49:06 -05:00
Tyler Goodlet 3ef222c4ad Make $vlm axis color same as clears 2023-01-30 11:49:06 -05:00
Tyler Goodlet 73f48d6336 Correctly load order mode for first fqsn in overlay set 2023-01-30 11:49:06 -05:00
Tyler Goodlet 4984be182f Move $vlm y-axis to LHS 2023-01-30 11:49:06 -05:00
Tyler Goodlet d68393bfab Better index step value scanning by checking with our expected set 2023-01-30 11:49:06 -05:00
Tyler Goodlet 01eadd7a4c Repair auto-y-ranging to always include L1 spread
Goes back to always adjusting the y-axis range to include the L1 spread
and clearing label in view whenever the last datum is also in view,
previously this was broken after reworking the display loop for
multi-feeds.

Drops a bunch of old commented tick looping cruft from before we started
using tick-type framing. Also adds more stringent guards for ignoring
but error logging quote values that are more then 25% out of range; it
seems particularly our `ib` feed has some issues with strange `price`
values that are way off here and there?
2023-01-30 11:49:06 -05:00
Tyler Goodlet 814462d3f0 Mouse interaction tweaks
- adjust zoom focal to be min of the view-right coord or the right-most
  point on the flow graphic in view and drop all the legacy l1-in-view
  focal point cruft.
- flip to not auto-scaling overlays by default.
- change the `._set_yrange()` margin to `0.09`.
- drop `use_vr: bool` usage.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 6e48cbb0d4 Modernize optional path variable type annots 2023-01-30 11:49:06 -05:00
Tyler Goodlet e4db20f55d Drop `._index_step` from formatters and instead defer to `Viz.index_step()` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 2dc4aa8a2e Further fixes `Viz.default_view()` and `.index_step()`
Use proper uppx scaling when either of scaling the data to the x-domain
index-range or when the uppx is < 1 (now that we support it) such that
both the fast and slow chart always appropriately scale and offset to
the y-axis with the last datum graphic just adjacent to the order line
arrow markers.

Further this fixes the `.index_step()` calc to use the "earliest" 16
values to compute the expected sample step diff since the last set often
contained gaps due to start up race conditions and generated
unexpected/incorrect output.

Further this drops the `.curve_width_pxs()` method and replaces it with
`.px_width()`, taken from the graphics object API and instead returns
the pixel account for the whole view width instead of the
x-domain-data-range within the view.
2023-01-30 11:49:06 -05:00
Tyler Goodlet b371abc14b Make `FlowGraphic.x_last()` be optionally `None`
In the case where the last-datum-graphic hasn't been created yet, simply
return a `None` from this method so the caller can choose to ignore the
output. Further, drop `.px_width()` since it makes more sense defined on
`Viz` as well as the previously commented `BarItems.x_uppx()` method.
Also, don't round the `.x_uppx()` output since it can then be used when
< 1 to do x-domain scaling during high zoom usage.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 23a4561b06 Drop edge case from `slice_from_time()`
Doesn't seem like we really need to handle the situation where the start
or stop input time stamps are outside the index range of the data since
the new binary search handling via `numpy.searchsorted()` covers this
case at minimal runtime cost and with an equally correct output. Allows
us to drop some other indexing endpoint internal variables as well.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 971eef3a22 Use left-style index search on RHS scan as well 2023-01-30 11:49:06 -05:00
Tyler Goodlet 29613a62a8 Use static `L1Label._x_br_offset` as l1 label length 2023-01-30 11:49:06 -05:00
Tyler Goodlet 0615e618a2 Add a parent-type for graphics: `FlowGraphic`
Factor some common methods into the parent type:
- `.x_uppx()` for reading the horizontal units-per-pixel.
- `.x_last()` for reading the "closest to y-axis" last datum coordinate
  for zooming "around" during mouse interaction.
- `.px_width()` for computing the max width of any curve in view in
  pixels.

Adjust all previous derived `pg.GraphicsObject` child types to now
inherit from this new parent and in particular enable proper `.x_uppx()`
support to `BarItems`.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 4291707a32 Just-offset-from-arrow-marker on slow chart
We want the fast and slow chart to behave the same on calls to
`Viz.default_view()` so adjust the offset calc to make both work:
- just offset by the line len regardless of step / uppx
- add back the `should_line: bool` output from `render_bar_items()` (and
  use it to set a new `ds_allowed: bool` guard variable) so that we can
  bypass calling the m4 downsampler unless the bars have been switched
  to the interpolation line graphic (which we normally required before
  any downsampling of OHLC graphics data).

Further, this drops use of the `use_vr: bool` flag from all rendering
since we pretty much always use it by default.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 0b37b3c107 Drop l1 labels attr from chart widget 2023-01-30 11:49:06 -05:00
Tyler Goodlet 1d612efebf Handle empty `indexes` input edge case.. 2023-01-30 11:49:06 -05:00
Tyler Goodlet 9367badea6 TOSQUASH: 84f19308 (l1 rework) 2023-01-30 11:49:06 -05:00
Tyler Goodlet faa4206907 Set cursor label color to "bracket" 2023-01-30 11:49:06 -05:00
Tyler Goodlet 83012d618f Don't set y-axis label colors to curve's, use the default from global scheme 2023-01-30 11:49:06 -05:00
Tyler Goodlet a9963ef4ee Simplify L1 labels for multicharts
Instead of having the l1 lines be inside the view space, move them to be
inside their respective axis (with only a 16 unit portion inside the
view) such that the clear price label can overlay with them nicely
without obscuring; this is much better suited to multiple adjacent
y-axes and in general is simpler and less noisy.

Further `L1Labels` + `LevelLabel` style tweaks:
- adjust `.rect` positioning to be "right" (i.e. inside the parent
  y-axis) with a slight 16 unit shift toward the viewbox (using the new
  `._x_br_offset`) to allow seeing each level label's line even when the
  clearing price label is positioned at that same level.
- add a newline's worth of vertical space to each of the bid/ask labels
  so that L1 labels' text content isn't ever obscured by the clear price
  label.
- set a low (10) z-value to ensure l1 labels are always placed
  underneath the clear price label.
- always fill the label rect with the chosen background color.
- make labels fully opaque so as to always make them hide the parent
  axes' `.tickStrings()` contents.
- make default color the "default" from the global scheme.
- drop the "price" part from the l1 label text contents, just show the
  book-queue's amount (in dst asset's units, aka the potential clearing vlm).
2023-01-30 11:49:06 -05:00
Tyler Goodlet 49451a7c24 Fix x-axis labelling when using an epoch domain
Previously with array-int indexing we had to map the input x-domain
"indexes" passed to `DynamicDateAxis._indexes_to_timestr()`. In the
epoch-time indexing case we obviously don't need to lookup time stamps
from the underlying shm array and can instead just cast to `int` and
relay the values verbatim.

Further, this patch includes some style adjustments to `AxisLabel` to
better enable multi-feed chart overlays by avoiding L1 label clutter
when multiple y-axes are stacked adjacent:
- adjust the `Axis` typical max string to include a couple spaces suffix
 providing for a bit more margin between side-by-side y-axes.
- make the default label (fill) color the "default" from the global
 color scheme and drop it's opacity to .9
- add some new label placement options and use them in the
 `.boundingRect()` method:
 * `._x/y_br_offset` for relatively shifting the overall label relative
   to it's parent axis.
 * `._y_txt_h_scaling` for increasing the bounding rect's height
   without including more whitespace in the label's text content.
- ensure labels have a high z-value such that by default they are always
 placed "on top" such that when we adjust the l1 labels they can be set
 to a lower value and thus never obscure the last-price label.
2023-01-30 11:49:06 -05:00
Tyler Goodlet ecbca1089b Add commented append slice-len sanity check 2023-01-30 11:49:06 -05:00
Tyler Goodlet 95fd7c3c91 Use `np.diff()` on last 16 samples instead of only last datum pair 2023-01-30 11:49:06 -05:00
Tyler Goodlet 96b5dfdc3e Enable the experimental `QPrivatePath` functionality from latest `pyqtgraph` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 2a76dd81cd Fix overlayed slow chart "treading"
Turns out we were updating the wrong ``Viz``/``DisplayState`` inside the
closure style `increment_history_view()`` (probably due to looping
through the flumes and dynamically closing in that task-func).. Instead
define the history incrementer at module level and pass in the
`DisplayState` explicitly. Further rework the `DisplayState` attrs to be
more focused around the `Viz` associated with the fast and slow chart
and be sure to adjust output from each `Viz.incr_info()` call to latest
update. Oh, and just tweaked the line palette for the moment.

FYI "treading" here is referring to  the x-shifting of the curve when
the last datum is in view such that on new sampled appends the "last"
datum is kept in the same x-location in UI terms.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 53dd4ebf42 Make `.increment_view()` take in a `datums: int` and always scale it by sample step size 2023-01-30 11:49:06 -05:00
Tyler Goodlet 46925b72ad Make `Viz.incr_info()` do treading with time-index, and appending with array-index 2023-01-30 11:49:06 -05:00
Tyler Goodlet dbd5857a7e Rename `reset` -> `reset_cache` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 827a0a8536 Fix gap detection on RHS; always bin-search on overshot time range 2023-01-30 11:49:06 -05:00
Tyler Goodlet 42502f3c60 Add type annots to vars inside `Render.render()` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 6b805a8497 Drop coordinate cacheing from `BarItems`, causes weird jitter on pan 2023-01-30 11:49:06 -05:00
Tyler Goodlet b565080d55 Add `ChartPlotWidget.main_viz: Viz` convenience `@property` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 8f764542d5 Make `Viz.incr_info()` sample rate agnostic
Mainly it was the global (should we )increment logic that needs to be
independent for the fast vs. slow chart such that the slow isn't
update-shifted by the fast and vice versa. We do this using a new
`'i_last_slow'` key in the `DisplayState.globalz: dict` which is
singleton for each sample-rate-specific chart and works for both time
and array indexing.

Also, we drop some old commented `graphics.draw_last_datum()` code that
never ended up being needed again inside the coordinate cache reset
bloc.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 5892c79737 Use array-`int`-indexing on single feed
Might as well since it makes the chart look less gappy and we can easily
flip the index switch now B)

Also adds a new `'i_slow_last'` key to `DisplayState` for a singleton
across all slow charts and thus no more need for special case logic in
`viz.incr_info()`.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 95e7c8648c Align step curves the same as OHLC bars 2023-01-30 11:49:06 -05:00
Tyler Goodlet 1b258d1bd6 Add `IncrementalFormatter.x_offset: np.ndarray`
Define the x-domain coords "offset" (determining the curve graphics
per-datum placement) for each formatter such that there's only on place
to change it when needed. Obviously each graphics type has it's own
dimensionality and this is reflected by the array shapes on each
subtype.
2023-01-30 11:49:06 -05:00
Tyler Goodlet f79efd4ca9 Adjust OHLC bar x-offsets to be time span matched
Previously we were drawing with the middle of the bar on each index with
arms to either side: +/- some arm length. Instead this changes so that
each bar is drawn *after* each index/timestamp such that in graphics
coords the bar span more correctly matches the time span in the
x-domain. This makes the linked region between slow and fast chart
directly match (without any transform) for epoch-time indexing such that
the last x-coord in view on the fast chart is no more then the
next time step in (downsampled) slow view.

Deats:
- adjust in `._pathops.path_arrays_from_ohlc()` and take an `bar_w` bar
  width input (normally taken from the data step size).
- change `.ui._ohlc.bar_from_ohlc_row()` and
  `BarItems.draw_last_datum()` to match.
2023-01-30 11:49:06 -05:00
Tyler Goodlet 6412b4ab5a `Viz._index_field` a `typing.Literal[str]` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 045a1a6acc Set `path_arrays_from_ohlc(use_time_index=True)` on epoch indexing
Allows easily switching between normal array `int` indexing and time
indexing by just flipping the `Viz._index_field: str`.

Also, guard all the x-data audit breakpoints with a time indexing
condition.
2023-01-30 11:49:06 -05:00
Tyler Goodlet da3f74e28e Ugh, use `bool` flag to determine index field.. 2023-01-30 11:49:06 -05:00
Tyler Goodlet 9dd4945580 Make `LinearRegion` link using epoch-time index
Turned out to be super simple to get the first draft to work since the
fast and slow chart now use the same domain, however, it seems like
maybe there's an offset issue still where the fast may be a couple
minutes ahead of the slow?

Need to dig in a bit..
2023-01-30 11:49:06 -05:00
Tyler Goodlet cb78f0921c Add global `i_step` per overlay to `DisplayState`
Using a global "last index step" (via module var) obviously has problems
when working with multiple feed sets in a single global app instance:
any separate feed-set will be incremented according to an app-global
index-step and thus won't correctly calc per-feed-set-step update info.

Impl deatz:
- drop `DisplayState.incr_info()` (since previously moved to `Viz`) and
  call that method on each appropriate `Viz` instance where necessary;
  further ensure the appropriate `DisplayState` instance is passed in to
  each call and make sure to pass a `state: DisplayState`.
- add `DisplayState.hist_vars: dict` for history chart (sets) to
  determine the per-feed (not set) current slow chart (time) step.
- add `DisplayState.globalz: dict` to house a common per-feed-set state
  and use it inside the new `Viz.incr_info()` such that
  a `should_increment: bool` can be returned and used by the display
  loop to determine whether to x-shift the current chart.
2023-01-30 11:49:06 -05:00
Tyler Goodlet bd23d254da Move `DisplayState.incr_info()` -> `Viz` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 89b6fde1ef Move `Viz` layer to new `.ui` mod 2023-01-30 11:49:06 -05:00