Commit Graph

3251 Commits (cf979e9ca2c7280bfc9a8e5185cd7ca777e9939c)

Author SHA1 Message Date
Tyler Goodlet cf979e9ca2 Return fast on bad range in `.default_view()` 2023-02-03 07:37:13 -05:00
Tyler Goodlet 5a08ccc6a3 Fix return type annot for `slice_from_time()` 2023-02-03 07:37:13 -05:00
Tyler Goodlet e0381e49a9 Fix `do_px_step` output for epoch step sizing 2023-02-03 07:37:13 -05:00
Tyler Goodlet 2aeddaa805 Support chart draw-api-kwargs-passthrough in lined plot meths 2023-02-03 07:37:13 -05:00
Tyler Goodlet 1b888d273f Use normal pen when last-datum color not provided 2023-02-03 07:37:13 -05:00
Tyler Goodlet f8a0c60889 Make profiler work when nested and not? 2023-02-03 07:37:13 -05:00
Tyler Goodlet d11b5da2b3 Add back `.prepareGeometryChange()`, seems faster? 2023-02-03 07:37:13 -05:00
Tyler Goodlet 28c0f80e6d Factor color and cache mode settings into `FlowGraphics`
Curve-path colouring and cache mode settings are used (and can thus be
factored out of) all child types; this moves them into the parent type's
`.__init__()` and adjusts all sub-types match:

- the bulk was moved out of the `Curve.__init__()` including all
  previous commentary around cache settings.
- adjust `BarItems` to use a `NoCache` mode and instead use the
  `last_step_pen: pg.Pen` and `._pen` inside it's `.pain()` instead of
  defining functionally duplicate vars.
- adjust all (transitive) calls to `BarItems` to use the new kwargs
  names.
2023-02-03 07:37:13 -05:00
Tyler Goodlet 426ae9e2ca Return `in_view: bool` from `Viz.update_graphics()`
Allows callers to know if they should care about a particular viz
rendering call by immediately knowing if the graphics are in view. This
turns out super useful particularly when doing dynamic y-ranging overlay
calcs.
2023-02-03 07:37:10 -05:00
Tyler Goodlet 5139a27327 Fix profiler f-strings 2023-02-02 17:10:06 -05:00
Tyler Goodlet f2125187f4 Disable coordinate caching on OHLC ds curves to avoid smearing 2023-02-02 17:10:06 -05:00
Tyler Goodlet 1f11f7e4bf Fix `Viz.draw_last()` to divide by `.flat_index_ratio` for uppx index lookback 2023-02-02 17:10:06 -05:00
Tyler Goodlet b24d5b61cc Drop masked `._maxmin()` override code from fsp stuff 2023-02-02 17:10:06 -05:00
Tyler Goodlet 7d92a8ed6c Document `Viz.incr_info()` outputs 2023-02-02 17:10:06 -05:00
Tyler Goodlet 47ffe60047 Rework display loop maxmin-ing with `Viz` pipelining
First, we rename what was `chart_maxmin()` -> `multi_maxmin()` and don't
`partial` it in to the `DisplayState`, just call it with correct `Viz`
ref inputs.

Second, as we've done with `ChartView.maybe_downsample_graphics()` use
the output from the main `Viz.update_graphics()` and feed it to the
`.maxmin()` calls for the ohlc and vlm chart but still deliver the same
output signature as prior. Also accept and use an optional profiler
input, drop `DisplayState.maxmin()` and add `.vlm_viz`.

Further perf related tweak to do with more efficient incremental
updates:
- only call `multi_maxmin()` if the main fast chart viz does a pixel
  column step.
- mask out hist viz and vlm viz and all linked fsp `._set_yrange()`
  calls for now until we figure out how to best optimize these updates
  when considering the new group-scaled-by-% style for multicharts.
- drop `.enable_auto_yrange()` calls during startup.
2023-02-02 16:22:39 -05:00
Tyler Goodlet e44b485bcb Adjust vlm fsp code to new `Viz.update_graphics()` output sig 2023-02-02 16:12:57 -05:00
Tyler Goodlet 7d404ed7ef Support read-slice input to `Viz.maxmin()`
Acts as short cut when pipe-lining from `Viz.update_graphics()` (which
now returns the needed in-view array-relative-read-slice as output) such
that `Viz.read()` and `.datums_range()` doesn't need to be called
internally multiple times. In this case where `i_read_range` is provided
we of course skip doing time index translations and consequently lookup
the appropriate (epoch-time) index indices for caching.
2023-02-02 16:12:57 -05:00
Tyler Goodlet b45c027db8 Backlink subchart views to "main chart" in `.add_plot()` 2023-02-02 16:12:57 -05:00
Tyler Goodlet 973902db43 Drop `ChartView._maxmin()` usage in `.ui._fsp`
Removes the multi-maxmin usage as well as ensures appropriate `Viz` refs
are passed into the view methods now requiring it. Also drops the "back
linking" of the vlm chart view to the source OHLC chart since we're
going to add this as a default to the charting API.
2023-02-02 16:12:57 -05:00
Tyler Goodlet 0ec1c8e85d Drop `ChartView._maxmin()` idea, use `Viz.maxmin()`
The max min for a given data range is defined on the lowest level
through the `Viz` api intermingling it with the view is a layering
issue. Instead make `._set_yrange()` call the appropriate view's viz
(since they should be one-to-one) directly and thus avoid any callback
monkey patching nonsense.

Requires that we now make `._set_yrange()` require either one of an
explicit `yrange: tuple[float, float]` min/max pair or the `Viz` ref (so
that maxmin can be called) as input. Adjust
`enable/disable_auto_yrange()` to bind in a new `._yranger()` partial
that's (solely) needed for signal reg/unreg which binds in the now
required input `Viz` to these methods.

Comment the `autoscale_overlays` block in `.maybe_downsample_graphics()`
for now until we figure out the most sane way to auto-range all linked
overlays and subplots (with their own overlays).
2023-02-02 16:12:57 -05:00
Tyler Goodlet 4866bdc460 More thoroughly profile the display loop 2023-02-02 16:12:57 -05:00
Tyler Goodlet 65434e2e67 Use `Viz.draw_last()` inside `.update_graphics()`
In an effort to ensure uniform and uppx-optimized last datum graphics
updates call this method directly instead of the equivalent graphics
object thus ensuring we only update the last pixel column according with
the appropriate max/min computed from the last uppx's worth of data.

Fixes / improvements to enable `.draw_last()` usage include,
- change `Viz._render_table` -> `._alt_r: tuple[Renderer, pg.GraphicsItem] | None`
  which holds an alternative (usually downsampled) render and graphics
  obj.
- extend the `.draw_last()` signature to include:
  - `last_read` to allow passing in the already read data from
    `.update_graphics()`, if it isn't passed then a manual read is done
    internally.
  - `reset_cache: bool` which is passed through to the graphics obj.
- use the new `Formatter.flat_index_ratio: float` when indexing into xy
  1d data to compute the max/min for that px column.

Other,
- drop `bars_range` input from `maxmin()` since it's unused.
2023-02-02 16:11:32 -05:00
Tyler Goodlet b762cf0456 Add cached refs to last 1d xy outputs
For the purposes of avoiding another full format call we can stash the
last rendered 1d xy pre-graphics formats as
`IncrementalFormatter.x/y_1d: np.ndarray`s and allow readers in the viz
and render machinery to use this data easily for things like "only
drawing the last uppx's worth of data as a line". Also add
a `.flat_index_ratio: float` which can be used similarly as a scalar
applied to indexes into the src array but instead when indexing
(flattened) 1d xy formatted outputs. Finally, this drops the way
overdone/noisy `.__repr__()` meth we had XD
2023-02-02 16:11:32 -05:00
Tyler Goodlet 3ec4c851cc Only draw up to 2nd last datum for OHLC bars paths 2023-02-02 16:11:32 -05:00
Tyler Goodlet 5ed4e5c945 Only update last datum graphic(s) on clear ticks
When a new tick comes in but no new time step / bar is yet needed (to be
appended) we can simply adjust **only** the last bar datum
lines-graphic(s) to avoid a redraw of the preceding `QPainterPath` on
every tick. Do this by calling `Viz.draw_last()` on the fast and slow
chart and adjusting the guards around calls to `Viz.update_graphics()`
(which *does* update paths) to only enter when there's a `do_px_step`
condition. We can stop calling `main_viz.plot.vb._set_yrange()` on view
treading cases since the range should have already been adjusted by the
clearing-tick processing mxmn updates.

Further this changes,
- the `chart_maxmin()` helper (which we should eventually just get rid
  of) to take bound in `Viz`s for the ohlc and vlm chart instead of the
  chart widget handles.
- extend the guard around hist viz yranging to only enter when not in
  "axis mode" - the same as for the fast viz.
2023-02-02 16:11:32 -05:00
Tyler Goodlet 84c48f17e2 Ensure full hist OHLC path is drawn on tread
Since we removed the `Viz.update_graphics()` call from the main rt loop
we have to be sure to call it in the history chart incr-loop to avoid
a gap between the  last bar and prior history since startup. We only
need to update on tread since that should be the only time a full redraw
is ever necessary, ow only the last datum is needed.

Further this moves the graphics cycle func's profiler init to the top in
an effort to get more correct latency measures.
2023-02-02 16:11:32 -05:00
Tyler Goodlet ee8e27f256 Use `Viz.update_graphics()` throughout remainder of graphics loop where possible 2023-02-02 16:11:32 -05:00
Tyler Goodlet e06a6c94eb Use `Viz` over charts where possible in display loop
Since `ChartPlotWidget.update_graphics_from_flow()` is more or less just
a call to `Viz.update_graphics()` try to call that directly where
possible.

Changes include:
- calling the viz in the display state specific `maxmin()`.
- passing a viz instance to each `ChartView._set_yrange()` call (in prep
  of explicit group auto-ranging); not that this input is unused in the
  method for now.
- drop `bars_range` var passing since we don't use it.
2023-02-02 16:11:32 -05:00
Tyler Goodlet fdda0c6f77 Set a `PlotItem.viz` for interaction lookup
Inside `._interaction` routines we need access to `Viz` instances.
Instead of doing `CharPlotWidget._vizs: dict` lookups this ensures each
plot can lookup it's (parent) viz without error.

Also, adjusts `Viz.maxmin()` output parsing to new signature.
2023-02-02 16:11:32 -05:00
Tyler Goodlet c9f7083b79 Always cache `read_slc` alongside y-mnmx values 2023-02-02 16:11:32 -05:00
Tyler Goodlet a91664e154 Add back coord-caching to ohlc graphic 2023-02-02 16:11:32 -05:00
Tyler Goodlet 3b773c667b Use (modern) literal type annots in view code 2023-02-02 16:11:32 -05:00
Tyler Goodlet aa4a48cb98 Drop x-range query from `ChartPlotWidget.maxmin()`
Move the `Viz.datums_range()` call into `Viz.maxmin()` itself thus
minimizing the chart `.maxmin()` method to an ultra light wrapper around
the viz call. Also move all profiling into the `Viz` method.

Adjust `Viz.maxmin()` to return both the (rounded) x-range values which
correspond to the range containing the y-domain min and max so that
it can be used for up and coming overlay group maxmin calcs.
2023-02-02 16:11:32 -05:00
Tyler Goodlet cec5ef1d26 Drop multi mxmn from display mod 2023-02-02 16:11:32 -05:00
Tyler Goodlet 1f6ec98790 Only handle hist discrepancies when market is open
We obviously don't want to be debugging a sample-index issue if/when the
market for the asset is closed (since we'll be guaranteed to have
a mismatch, lul). Pass in the `feed_is_live: trio.Event` throughout the
backfilling routines to allow first checking for the live feed being active
so as to avoid breakpointing on false +ves. Also, add a detailed warning
log message for when *actually* investigating a mismatch.
2023-02-02 16:11:31 -05:00
Tyler Goodlet 702a13a278 Passthrough `tractor` kwargs directly 2023-02-02 16:11:31 -05:00
Tyler Goodlet 1aa7b937b9 Fix `open_trade_ledger()` enter value type annot 2023-02-02 16:11:31 -05:00
Tyler Goodlet 81b6cb17de Comment bad x-range bp for now 2023-02-02 16:11:31 -05:00
Tyler Goodlet 36f1edead0 Breakpoint bad (-ve or too large) x-ranges to m4
This should never really happen but when it does it appears to be a race
with writing startup pre-graphics-formatter array data where we get
`x_end` epoch value subtracting some really small offset value (like
`-/+0.5`) or the opposite where the `x_start` is epoch and `x_end` is
small.

This adds a warning msg and `breakpoint()` as well as guards around the
entire code downsampling code path so that when resumed the downsampling
cycle should just be skipped and avoid a crash.
2023-02-02 16:11:31 -05:00
Tyler Goodlet e1e52e9130 Downthrottle to 16Hz on multi-feed charts 2023-02-02 16:11:31 -05:00
Tyler Goodlet 3b15e76285 Attempt to keep selected item highlighted
This attempt was unsuccessful since trying to (re)select the last
highlighted item on both an "enter" or "click" of that item causes
a hang and then segfault in `Qt`; no clue why..

Adds a `keep_current_item_selected: bool` flag to
`CompleterView.show_cache_entries()` but using it seems to always cause
a hang and crash; we keep all potential use spots commented for now
obviously to avoid this. Also included is a bunch of tidying to logic
blocks in the kb-control loop for readability.
2023-02-02 16:11:31 -05:00
Tyler Goodlet c15a2babc1 Lol, pull hist chart from the display state 2023-02-02 16:11:31 -05:00
Tyler Goodlet 171e5da9f9 Make (cache) search-results a `set` and avoid overlay duplicate entries 2023-02-02 16:11:31 -05:00
Tyler Goodlet 92a609275b Take outer-interval values in `Viz.datums_range()` 2023-02-02 16:11:31 -05:00
Tyler Goodlet 07ee244ca9 Clean a buncha cruft from render mod 2023-02-02 16:11:31 -05:00
Tyler Goodlet 2122c7cbd9 Handle last-in-view time slicing edge case
Whenever the last datum is in view `slice_from_time()` need to always
spec the final array index (i.e. the len - 1 value we set as
`read_i_max`) to avoid a uniform-step arithmetic error where gaps in the
underlying time series causes an index that's too low to be returned.
2023-02-02 16:11:31 -05:00
Tyler Goodlet 888ae26d82 Drop bp blocks from formatters mod 2023-02-02 16:11:31 -05:00
Tyler Goodlet 61d1dd3306 Fix query-mode cursor labels to work with epoch-indexing 2023-02-02 16:11:31 -05:00
Tyler Goodlet 73f1e362bc Use `open_sample_stream()` in display loop 2023-02-02 16:11:31 -05:00
Tyler Goodlet 7208b3a2d2 Drop `Flume.index_stream()`, `._sampling.open_sample_stream()` replaces it 2023-02-02 16:11:31 -05:00