Commit Graph

3144 Commits (ef19604698c5d0e669de27a41f84d01736e17c13)

Author SHA1 Message Date
Tyler Goodlet ef19604698 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-10 12:42:26 -05:00
Tyler Goodlet b32cb7ecad 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-10 12:42:26 -05:00
Tyler Goodlet aabd46d707 Drop l1 labels attr from chart widget 2023-01-10 12:42:26 -05:00
Tyler Goodlet 23070e5fab TOSQUASH: bd78f17f (duplicate hist frames) 2023-01-10 12:42:26 -05:00
Tyler Goodlet 575e60bd1d Handle empty `indexes` input edge case.. 2023-01-10 12:42:26 -05:00
Tyler Goodlet 905b37e7ac TOSQUASH: 84f19308 (l1 rework) 2023-01-10 12:42:26 -05:00
Tyler Goodlet 2019db0fe7 TOSQUASH: b6fd8427 (kraken src fiat parsing) 2023-01-10 12:42:26 -05:00
Tyler Goodlet d0858236c1 Set cursor label color to "bracket" 2023-01-10 12:42:26 -05:00
Tyler Goodlet 46d6b1f6e4 Don't set y-axis label colors to curve's, use the default from global scheme 2023-01-10 12:42:26 -05:00
Tyler Goodlet c9104880c8 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-10 12:42:26 -05:00
Tyler Goodlet ac1f4571d9 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-10 12:42:26 -05:00
Tyler Goodlet cdc22e0807 Sync 1s (or less) sampler steps using rounded now-epoch 2023-01-10 12:42:26 -05:00
Tyler Goodlet 7649df1a24 Add commented append slice-len sanity check 2023-01-10 12:42:26 -05:00
Tyler Goodlet b2cff0af6f Always `.error()` log unknown queries for `marketstore` 2023-01-10 12:42:26 -05:00
Tyler Goodlet 9f37b33167 Only accept 6 tries for the same duplicate hist frame
When we see multiple history frames that are duplicate to the request
set, bail re-trying after a number of tries (6 just cuz) and return
early from the tsdb backfill loop; presume that this many duplicates
means we've hit the beginning of history. Use a `collections.Counter`
for the duplicate counts. Make sure and warn log in such cases.
2023-01-10 12:42:26 -05:00
Tyler Goodlet 7faca820bd Use `np.diff()` on last 16 samples instead of only last datum pair 2023-01-10 12:42:26 -05:00
Tyler Goodlet 983e495522 `kraken`: don't presume src fiat symbol size in pos predicate 2023-01-10 12:42:26 -05:00
Tyler Goodlet 03300549c2 Drop symbol token size =6 check 2023-01-10 12:42:26 -05:00
Tyler Goodlet aaf8754776 Use recon set on stack closing during reconnect
Hopefully resolves https://github.com/pikers/piker/issues/434
2023-01-10 12:42:26 -05:00
Tyler Goodlet 4b5b4f96a9 Enable the experimental `QPrivatePath` functionality from latest `pyqtgraph` 2023-01-10 12:42:26 -05:00
Tyler Goodlet d14435fa59 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-10 12:42:26 -05:00
Tyler Goodlet 99e100cd6b Make `.increment_view()` take in a `datums: int` and always scale it by sample step size 2023-01-10 12:42:26 -05:00
Tyler Goodlet 8e300a3aed Make `Viz.incr_info()` do treading with time-index, and appending with array-index 2023-01-10 12:42:26 -05:00
Tyler Goodlet 89352a3b3b Rename `reset` -> `reset_cache` 2023-01-10 12:42:26 -05:00
Tyler Goodlet d4c2aeb4e0 Fix gap detection on RHS; always bin-search on overshot time range 2023-01-10 12:42:26 -05:00
Tyler Goodlet ddf8fa7b7a Add type annots to vars inside `Render.render()` 2023-01-10 12:42:26 -05:00
Tyler Goodlet abac60a0f4 Drop coordinate cacheing from `BarItems`, causes weird jitter on pan 2023-01-10 12:42:26 -05:00
Tyler Goodlet 6e6c6484fc Fix f-str in duplicate frame msg print 2023-01-10 12:42:26 -05:00
Tyler Goodlet 134b8129b5 `ib`: fix position log msg 2023-01-10 12:42:26 -05:00
Tyler Goodlet f7cfb848c5 Add `ChartPlotWidget.main_viz: Viz` convenience `@property` 2023-01-10 12:42:26 -05:00
Tyler Goodlet fd02a60ab0 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-10 12:42:26 -05:00
Tyler Goodlet de585d2dc1 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-10 12:42:26 -05:00
Tyler Goodlet 4b76f9ec9a Align step curves the same as OHLC bars 2023-01-10 12:42:26 -05:00
Tyler Goodlet 28d9c781e8 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-10 12:42:26 -05:00
Tyler Goodlet 6756ca5931 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-10 12:42:26 -05:00
Tyler Goodlet ef6a1167b0 `Viz._index_field` a `typing.Literal[str]` 2023-01-10 12:42:25 -05:00
Tyler Goodlet 325fe1ca67 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-10 12:42:25 -05:00
Tyler Goodlet 0316304e3d Ugh, use `bool` flag to determine index field.. 2023-01-10 12:42:25 -05:00
Tyler Goodlet 72c6b5f646 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-10 12:42:25 -05:00
Tyler Goodlet 1f356b6e10 `ib`: Add treasury yield futs to adhoc fqsn set 2023-01-10 12:42:25 -05:00
Tyler Goodlet 1059520212 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-10 12:42:25 -05:00
Tyler Goodlet 2a4fafcf21 Move `DisplayState.incr_info()` -> `Viz` 2023-01-10 12:42:25 -05:00
Tyler Goodlet e363f102a3 Drop `tractor` assert bug note 2023-01-10 12:42:25 -05:00
Tyler Goodlet d2b7cb7b35 Move `Viz` layer to new `.ui` mod 2023-01-10 12:42:25 -05:00
Tyler Goodlet 81d6d1d80b Fix line -> bars on 6x UPPX
Read the `Viz.index_step()` directly to avoid always reading 1 on the
slow chart; this was completely broken before and resulting in not
rendering the bars graphic on the slow chart until at a true uppx of
1 which obviously doesn't work for 60 width bars XD

Further cleanups to `._render` module:
- drop `array` output from `Renderer.render()`, `read_from_key` input
  and fix type annot.
- drop `should_line`, `changed_to_line` and `render_kwargs` from
  `render_baritems()` outputs and instead calc `should_redraw` logic
  inside the func body and return as output.
2023-01-10 12:42:25 -05:00
Tyler Goodlet 57264f87c6 Drop unused `read_src_from_key: bool` to `.format_to_1d()` 2023-01-10 12:42:25 -05:00
Tyler Goodlet cd7d36d2d8 Right, do index lookup for int-index as well.. 2023-01-10 12:42:25 -05:00
Tyler Goodlet 30b9130be6 Fix formatter xy ndarray first prepend case
First allocation vs. first "prepend" of source data to an xy `ndarray`
format **must be mutex** in order to avoid a double prepend.

Previously when both blocks were executed we'd end up with
a `.xy_nd_start` that was decremented (at least) twice as much as it
should be on the first `.format_to_1d()` call which is obviously
incorrect (and causes problems for m4 downsampling as discussed below).
Further, since the underlying `ShmArray` buffer indexing is managed
(i.e. write-updated) completely independently from the incremental
formatter updates and internal xy indexing, we can't use
`ShmArray._first.value` and instead need to use the particular `.diff()`
output's prepend length value to decrement the `.xy_nd_start` on updates
after initial alloc.

Problems this resolves with m4:
- m4 uses a x-domain diff to calculate the number of "frames" to
  downsample to, this is normally based on the ratio of pixel columns on
  screen vs. the size of the input xy data.
- previously using an int-index (not epoch time) the max diff between
  first and last index would be the size of the input buffer and thus
  would never cause a large mem allocation issue (though it may have
  been inefficient in terms of needed size).
- with an epoch time index this max diff could explode if you had some
  near-now epoch time stamp **minus** an x-allocation value: generally
  some value in `[0.5, -0.5]` which would result in a massive frames and
  thus internal `np.ndarray()` allocation causing either a crash in
  `numba` code or actual system mem over allocation.

Further, put in some more x value checks that trigger breakpoints if we
detect values that caused this issue - we'll remove em after this has
been tested enough.
2023-01-10 12:42:25 -05:00
Tyler Goodlet abf3b08328 Handle time-indexing for fill arrows
Call into a reworked `Flume.get_index()` for both the slow and fast
chart and do time index clipping to last datum where necessary.
2023-01-10 12:42:25 -05:00
Tyler Goodlet 95b9ae66b2 Restore coord-cache resetting
Turns out we can't seem to avoid the artefacts when click-drag-scrolling
(results in weird repeated "smeared" curve segments) so just go back to
the original code.
2023-01-10 12:42:25 -05:00