Commit Graph

3238 Commits (9da93478df5c364ebcb117635b5fd80f952b0c85)

Author SHA1 Message Date
Tyler Goodlet 9da93478df 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-01-30 11:49:36 -05:00
Tyler Goodlet a66be2592a More thoroughly profile the display loop 2023-01-30 11:49:36 -05:00
Tyler Goodlet 5dda0ca287 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-01-30 11:49:36 -05:00
Tyler Goodlet 88133792ea 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-01-30 11:49:36 -05:00
Tyler Goodlet f3468e6d28 Only draw up to 2nd last datum for OHLC bars paths 2023-01-30 11:49:36 -05:00
Tyler Goodlet 5b6ee10e6b 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-01-30 11:49:36 -05:00
Tyler Goodlet 3b9bada561 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-01-30 11:49:36 -05:00
Tyler Goodlet caee0130df Use `Viz.update_graphics()` throughout remainder of graphics loop where possible 2023-01-30 11:49:36 -05:00
Tyler Goodlet 58d1bdc873 Use latest `asks` 2023-01-30 11:49:36 -05:00
Tyler Goodlet 81ccc14c98 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-01-30 11:49:36 -05:00
Tyler Goodlet fad518a61a 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-01-30 11:49:36 -05:00
Tyler Goodlet 6c68c0771e Always cache `read_slc` alongside y-mnmx values 2023-01-30 11:49:36 -05:00
Tyler Goodlet 53e3909924 Add first-draft `PlotItemOverlay.group_maxmin()`
Computes the maxmin values for each underlying plot's in-view range as
well as the max up/down swing (in percentage terms) from the plot with
most dispersion and returns a all these values plus a `dict` of plots to
their ranges as part of output.
2023-01-30 11:49:36 -05:00
Tyler Goodlet 79706fe628 Add back coord-caching to ohlc graphic 2023-01-30 11:49:36 -05:00
Tyler Goodlet c8c5a234e8 Use (modern) literal type annots in view code 2023-01-30 11:49:36 -05:00
Tyler Goodlet 29f4b562bd 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-01-30 11:49:36 -05:00
Tyler Goodlet 1919f2d3a2 Drop multi mxmn from display mod 2023-01-30 11:49:36 -05:00
Tyler Goodlet e6d38d4f94 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-01-30 11:49:34 -05:00
Tyler Goodlet 22ff509b01 Passthrough `tractor` kwargs directly 2023-01-30 11:49:06 -05:00
Tyler Goodlet a518840382 Fix `open_trade_ledger()` enter value type annot 2023-01-30 11:49:06 -05:00
Tyler Goodlet 4830059592 Fix history array name 2023-01-30 11:49:06 -05:00
Tyler Goodlet 9169f86948 Comment bad x-range bp for now 2023-01-30 11:49:06 -05:00
Tyler Goodlet e1f58ad7c4 Provide `datetime`-sorted clears table iteration
Likely pertains to helping with stuff in issues #345 and #373 and just
generally is handy to have when processing ledgers / clearing event
tables.

Adds the following helper methods:
- `iter_by_dt()` to iter-sort an arbitrary `Transaction`-like table of
  clear entries.
- `Position.iter_clears()` as a convenience wrapper for the above.
2023-01-30 11:49:06 -05:00
Tyler Goodlet aadadc53c3 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-01-30 11:49:06 -05:00
Tyler Goodlet 744268aea0 Downthrottle to 16Hz on multi-feed charts 2023-01-30 11:49:06 -05:00
Tyler Goodlet 78d98f54ae Round spread (slap) offset to min tick digits 2023-01-30 11:49:06 -05:00
Tyler Goodlet cf95252e33 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-01-30 11:49:06 -05:00
Tyler Goodlet b2b1e036cb Lol, pull hist chart from the display state 2023-01-30 11:49:06 -05:00
Tyler Goodlet 92060fa6d3 Make (cache) search-results a `set` and avoid overlay duplicate entries 2023-01-30 11:49:06 -05:00
Tyler Goodlet 6dc09a5709 Take outer-interval values in `Viz.datums_range()` 2023-01-30 11:49:06 -05:00
Tyler Goodlet 6b4970df1d Clean a buncha cruft from render mod 2023-01-30 11:49:06 -05:00
Tyler Goodlet 5c4e1b3fd6 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-01-30 11:49:06 -05:00
Tyler Goodlet a3747f7457 Drop bp blocks from formatters mod 2023-01-30 11:49:06 -05:00
Tyler Goodlet cf3e1a0687 Fix query-mode cursor labels to work with epoch-indexing 2023-01-30 11:49:06 -05:00
Tyler Goodlet 7eca1aa9c5 Use `open_sample_stream()` in display loop 2023-01-30 11:49:06 -05:00
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