Commit Graph

3167 Commits (3328822e44ca34e393edaecef66f555ace4ce4a6)

Author SHA1 Message Date
Tyler Goodlet 3328822e44 Port feed layer to use new `samplerd` APIs
Always use `open_sample_stream()` to register fast and slow quote feed
buffers and get a sampler stream which we use to trigger
`Sampler.broadcast_all()` calls on the service side after backfill
events.
2023-01-10 12:42:26 -05:00
Tyler Goodlet 8ed48add18 Drop `Flume.index_stream()`, `._sampling.open_sample_stream()` replaces it 2023-01-10 12:42:26 -05:00
Tyler Goodlet c531f8a69a Implement a `samplerd` singleton actor service
Now spawned under the `pikerd` tree as a singleton-daemon-actor we offer
a slew of new routines in support of this micro-service:

- `maybe_open_samplerd()` and `spawn_samplerd()` which provide the
  `._daemon.Services` integration to conduct service spawning.
- `open_sample_stream()` which is a client-side endpoint which does all
  the work of (lazily) starting the `samplerd` service (if dne) and
  registers shm buffers for update as well as connect a sample-index
  stream for iterator by the caller.
- `register_with_sampler()` which is the `samplerd`-side service task
  endpoint implementing all the shm buffer and index-stream registry
  details as well as logic to ensure a lone service task runs
  `Services.increment_ohlc_buffer()`; it increments at the shortest period
  registered which, for now, is the default 1s duration.

Further impl notes:
- fixes to `Services.broadcast()` to ensure broken streams get discarded
  gracefully.
- we use a `pikerd` side singleton mutex `trio.Lock()` to ensure
  one-and-only-one `samplerd` is ever spawned per `pikerd` actor tree.
2023-01-10 12:42:26 -05:00
Tyler Goodlet 09b53b133b Make `._daemon.Services` for use as singleton
Drop the `_services` module level ref and adjust all client code to
match. Drop struct inheritance and convert all methods to class level.
Move `Brokerd.locks` -> `Services.locks` and add sampling mod to pikerd
enabled set.
2023-01-10 12:42:26 -05:00
Tyler Goodlet 33e7e204d8 Begin formalizing `Sampler` singleton API
We're moving toward a single actor managing sampler work and distributed
independently of `brokerd` services such that a user can run samplers on
different hosts then real-time data feed infra. Most of the
implementation details include aggregating `.data._sampling` routines
into a new `Sampler` singleton type.

Move the following methods to class methods:
- `.increment_ohlc_buffer()` to allow a single task to increment all
  registered shm buffers.
- `.broadcast()` for IPC relay to all registered clients/shms.

Further add a new `maybe_open_global_sampler()` which allocates
a service nursery and assigns it to the `Sampler.service_nursery`; this
is prep for putting the step incrementer in a singleton service task
higher up the data-layer actor tree.
2023-01-10 12:42:26 -05:00
Tyler Goodlet 141f4cf018 Add back another panes resize during startup 2023-01-10 12:42:26 -05:00
Tyler Goodlet 7f2a5e267f Always zero-on-step $vlm 2023-01-10 12:42:26 -05:00
Tyler Goodlet a09735e0f0 Do full marker width after line 2023-01-10 12:42:26 -05:00
Tyler Goodlet 0fb44e1ec0 Fix indent level 2023-01-10 12:42:26 -05:00
Tyler Goodlet 049d7d0dc0 Make $vlm axis color same as clears 2023-01-10 12:42:26 -05:00
Tyler Goodlet f858dbcf68 Correctly load order mode for first fqsn in overlay set 2023-01-10 12:42:26 -05:00
Tyler Goodlet 075dd94759 Drop meaning the clearing rate, use per step count 2023-01-10 12:42:26 -05:00
Tyler Goodlet 6d2077e8e6 Move $vlm y-axis to LHS 2023-01-10 12:42:26 -05:00
Tyler Goodlet 7ec30efff4 Better index step value scanning by checking with our expected set 2023-01-10 12:42:26 -05:00
Tyler Goodlet adeb969810 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-10 12:42:26 -05:00
Tyler Goodlet bc271c4ebc 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-10 12:42:26 -05:00
Tyler Goodlet c47fa14d8c Modernize optional path variable type annots 2023-01-10 12:42:26 -05:00
Tyler Goodlet 783285e92c Drop `._index_step` from formatters and instead defer to `Viz.index_step()` 2023-01-10 12:42:26 -05:00
Tyler Goodlet 4ae46c1e20 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-10 12:42:26 -05:00
Tyler Goodlet c0ef20894c 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-10 12:42:26 -05:00
Tyler Goodlet 009102fc05 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-10 12:42:26 -05:00
Tyler Goodlet 2fde315089 Use left-style index search on RHS scan as well 2023-01-10 12:42:26 -05:00
Tyler Goodlet daf1cfc785 Use static `L1Label._x_br_offset` as l1 label length 2023-01-10 12:42:26 -05:00
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