Commit Graph

1381 Commits (6825ad4804e2cdad8333a5b5863e5940032c90b8)

Author SHA1 Message Date
Tyler Goodlet 5528e80c22 Basic allocator state updates from pp sidepane 2021-09-06 09:28:10 -04:00
Tyler Goodlet ce7eb75ada Validate allocator assignments with pydantic 2021-09-06 09:28:10 -04:00
Tyler Goodlet a7920689b6 Add reference gist for Qt guest mode stuff 2021-09-06 09:28:10 -04:00
Tyler Goodlet a3d1a71017 Unpack keyboard events into an explicit msg model 2021-09-06 09:28:10 -04:00
Tyler Goodlet b302707bf3 Order mode docs/comments updates 2021-09-06 09:28:10 -04:00
Tyler Goodlet c982634839 Add draft `pydantic`-`QWidget` ORM system
Move all the ``pydantic`` finagling to an `_orm.py` and
just keep an `Allocator` as the backing model for our pp controls
in the position module. This all needs to be tied together in some sane
with with facility for multiple symbols/streams per chart for when we
get to charting-trading aggregate feeds.
2021-09-06 09:28:10 -04:00
Tyler Goodlet 2d1deb7ab7 Drop uneeded `typing` types for py3.9+ 2021-09-06 09:28:10 -04:00
Tyler Goodlet b79b9c8c41 "last" and "current" are better names 2021-09-06 09:28:10 -04:00
Tyler Goodlet deedcb2c4a Flip to view mode on field exit key combos 2021-09-06 09:28:10 -04:00
Tyler Goodlet 5f7c9a16fb Make god widget focus to chart / "view mode" 2021-09-06 09:28:10 -04:00
Tyler Goodlet 70a283e336 Call god what it is 2021-09-06 09:28:10 -04:00
Tyler Goodlet d1f9273418 Use lightest default for pp line 2021-09-06 09:28:10 -04:00
Tyler Goodlet 8eaf2a1afe Allocate minority to OHLC chart since 2 fsps by default is likely 2021-09-06 09:28:10 -04:00
Tyler Goodlet 75f50f4b7e "bracket"-ify fills bar + labels and try to evenly space the pane sections 2021-09-06 09:28:10 -04:00
Tyler Goodlet 1fc9047746 Drop old pp config widget inserts; use new pane layout func 2021-09-06 09:28:10 -04:00
Tyler Goodlet 3e237124ec Break health bar and pane layout into separate routines 2021-09-06 09:28:10 -04:00
Tyler Goodlet b0ab240f9e Match search bar margins to pp pane 2021-09-06 09:28:10 -04:00
Tyler Goodlet 41b79d0f9a Fix pp pane to show on symbol switches 2021-09-06 09:28:10 -04:00
Tyler Goodlet e005c8b345 Use `QFormLayout` instead of rolling our own; add pp and feed status sections 2021-09-06 09:28:10 -04:00
Tyler Goodlet 318f3b45c5 Just always use a lambda ; it's innocuous 2021-09-06 09:28:10 -04:00
Tyler Goodlet b6c68e381d Move status back to gunmetal 2021-09-06 09:28:10 -04:00
Tyler Goodlet 0ffbb15bc7 Add a "health bar" factor B) 2021-09-06 09:28:10 -04:00
Tyler Goodlet 63138ccbf4 WIP add a lambda-QFrame to get per chart sidpanes for each linkedsplits row 2021-09-06 09:28:10 -04:00
Tyler Goodlet 825680b8c6 Support (sub)plot names separate from data array keys 2021-09-06 09:28:10 -04:00
Tyler Goodlet 65158b8c64 Add position status (health) bar math for sizing and styling 2021-09-06 09:28:10 -04:00
Tyler Goodlet 3eabe93d54 Always hide contents labels at startup 2021-09-06 09:28:10 -04:00
Tyler Goodlet 21d1e17c6a Better search label styling 2021-09-06 09:28:10 -04:00
Tyler Goodlet 30ac32da55 Add ctrl-p as "pane toggle" 2021-09-06 09:28:10 -04:00
Tyler Goodlet 0ce356f5d9 Make field form a vertical layout, add formatted style sheets 2021-09-06 09:28:10 -04:00
Tyler Goodlet 1ae39c963a Allocate pp config form alongside god widget as a side-pane 2021-09-06 09:28:10 -04:00
Tyler Goodlet d022a105bb Start using a small schema for generating forms 2021-09-06 09:28:10 -04:00
Tyler Goodlet 011f36fc3c WIP add input handler for each widget in the form 2021-09-06 09:28:10 -04:00
Tyler Goodlet 43b769a136 Support opening a handler on a collection of widgets 2021-09-06 09:28:10 -04:00
Tyler Goodlet d1244608bd Use font scaled delegate from forms module 2021-09-06 09:28:10 -04:00
Tyler Goodlet 5ec00ee762 Size view delegate from monkey patched parent 2021-09-06 09:28:10 -04:00
Tyler Goodlet 940aafe1be OMG Qt view item sizing is sooo dumb.. 2021-09-06 09:28:10 -04:00
Tyler Goodlet 29ea91553d Use "slots" as name for "number of entries" 2021-09-06 09:28:10 -04:00
Tyler Goodlet c18cf4f0bf Mock up initial selection field and progress bar 2021-09-06 09:28:10 -04:00
Tyler Goodlet 7e2e316cbf "Forms" is a better module name 2021-09-06 09:28:10 -04:00
Tyler Goodlet a2b61a67b5 Allocate pp config with new actory, drop old line update method 2021-09-06 09:28:10 -04:00
Tyler Goodlet e8e9e20124 Use mode name setter throughout 2021-09-06 09:28:10 -04:00
Tyler Goodlet 00ff0e96cd Add mode name setter 2021-09-06 09:28:10 -04:00
Tyler Goodlet 97f4d9bc2d Drop stale anchors 2021-09-06 09:28:10 -04:00
Tyler Goodlet 1ed7be7c00 Move font-aware line edit to "text entry" mod 2021-09-06 09:28:10 -04:00
Tyler Goodlet 8d65a55f9e Toggle pp config widget on order mode active 2021-09-06 09:28:10 -04:00
Tyler Goodlet 64ccc79a33 Change order label format to color:count 2021-09-06 09:28:10 -04:00
Tyler Goodlet 0f176425b1 First WIP of pp config entry widget on status bar 2021-09-06 09:28:10 -04:00
Tyler Goodlet c4a9d53306 Use one marker, drop old anchors, add graphics update on marker paint 2021-09-06 09:28:10 -04:00
Tyler Goodlet 4d5afc2e25 Add dpi font scale getter 2021-09-06 09:28:10 -04:00
Tyler Goodlet 4ce6edae70 Skip line stage when chart not yet initialized 2021-09-06 09:28:10 -04:00
Tyler Goodlet da3f149646 Add a tight pp anchor 2021-09-06 09:28:10 -04:00
Tyler Goodlet 5473c9848d Start a "text entry widgets" module 2021-09-06 09:28:10 -04:00
Tyler Goodlet 3fb0e02788 Factor font-size-based labeled-line edit into generics widget 2021-09-06 09:28:10 -04:00
Tyler Goodlet 5fb00f726e Add support for a marker "on paint" callback 2021-09-06 09:28:10 -04:00
Tyler Goodlet d283872eb6 Add a scene bounding rect getter to our label 2021-09-06 09:28:10 -04:00
Tyler Goodlet 5144492534 Just warn for now on unknown dialogs 2021-09-06 09:28:10 -04:00
Tyler Goodlet 568dd488b5 Move level marker to annotate module 2021-09-06 09:28:10 -04:00
Tyler Goodlet a4028d3475 Actually position msgs get relayed verbatim 2021-09-06 09:28:10 -04:00
Tyler Goodlet dc279a48c2 Move DPI / screen get logging to debug; reduce cli noise 2021-09-06 09:28:10 -04:00
Tyler Goodlet 7367ed5464 Drop all `ChartPlotWidget._lc` remap to `.linked 2021-09-06 09:28:10 -04:00
Tyler Goodlet c8b14e9445 Pass position msg to tracker, append fill msgs 2021-09-06 09:28:10 -04:00
Tyler Goodlet 3b0b7475c8 Fixup commented view locate call 2021-09-06 09:28:10 -04:00
Tyler Goodlet 1a5770c127 Only hide position (extra) info on order mode exit 2021-09-06 09:28:10 -04:00
Tyler Goodlet 1abbd095ec Fix oustanding label bugs, make `.update()` accept a position msg 2021-09-06 09:28:10 -04:00
Tyler Goodlet 826c4408ea Stop pulling lot size precision from symbol for now in the UI 2021-09-06 09:28:10 -04:00
Tyler Goodlet d3457cd423 Drop position-line factory from lines module, add endpoint getter 2021-09-06 09:28:10 -04:00
Tyler Goodlet 444421bddf Make our default label opaque (since it's normally just text) 2021-09-06 09:28:10 -04:00
Tyler Goodlet 565380368a Increase cursor debounce delay slightly? 2021-09-06 09:28:10 -04:00
Tyler Goodlet f06e05c9cb Switch mode to touch `.pp` 2021-09-06 09:28:10 -04:00
Tyler Goodlet 71eef1b7fd Add `.view` property, throttle to 50Hz by default 2021-09-06 09:28:10 -04:00
Tyler Goodlet 20a8045127 Add a left-side-of-marker orientation 2021-09-06 09:28:10 -04:00
Tyler Goodlet 74d6dd5957 Move position tracking to new module
It was becoming too much with all the labels and markers and lines..
Might as well package it all together instead of cramming it in the
order mode loop, chief.

The techincal summary,
- move `_lines.position_line()` -> `PositionInfo.position_line()`.
- slap a `.pp` on the order mode instance which *is* a `PositionInfo`
- drop the position info info label for now (let's see what users want
  eventually but for now let's keep it super minimal).
- add a `LevelMarker` type to replace the old `LevelLine` internal
  marker system (includes ability to change the style and level on the
  fly).
- change `_annotate.mk_marker()` -> `mk_maker_path()` and expect caller
  to wrap in a `QGraphicsPathItem` if needed.
2021-09-06 09:28:10 -04:00
Tyler Goodlet afcb323c49 Use `QGraphicsPathItem` for marker, add line hide method 2021-09-06 09:28:10 -04:00
Tyler Goodlet 45d6682ae0 Update entry count on position msgs, draft a composite position info type 2021-09-06 09:28:10 -04:00
Tyler Goodlet ff6ac6ba4f Add label location description param for graphics path anchor 2021-09-06 09:28:10 -04:00
Tyler Goodlet d21112dcd7 Drop the open ctx mng; add wip pp label 2021-09-06 09:28:10 -04:00
Tyler Goodlet 69091a894f Move marker label anchor to anchors mod 2021-09-06 09:28:10 -04:00
Tyler Goodlet e58a980786 Move all anchor funcs to new mod 2021-09-06 09:28:10 -04:00
Tyler Goodlet 94d3f67707 Move marker level-line-positioning anchor to new module 2021-09-06 09:28:10 -04:00
Tyler Goodlet 3aab6d67e9 Use label anchor 2021-09-06 09:28:10 -04:00
Tyler Goodlet 791fd23524 Remove `LevelLine.add_label()`, add dynamic pp marker label 2021-09-06 09:28:10 -04:00
Tyler Goodlet 62517c1662 Add user defined anchor support to label; reorg mod 2021-09-06 09:28:10 -04:00
Tyler Goodlet 0dc18598fb Add a client side order dialog type for tracking flows in the UI 2021-09-05 13:59:40 -04:00
Tyler Goodlet bd754b740d Only re-calc avg pp price on pp size increases 2021-09-05 13:59:40 -04:00
Tyler Goodlet 62dd327ef3 Drop `_graphics` subpkg; flat is better then nested 2021-09-05 13:59:40 -04:00
Tyler Goodlet 449c4210e4 Add per session paper position tracking
Generate and maintain position messages in the paper engine for each
`pikerd` session. We no longer tear down the engine on each client
disconnect. Ensure -ve size on sells to make the math work.
2021-09-05 13:59:40 -04:00
Tyler Goodlet 908678da84 Add more futes, add in order status comments 2021-09-05 13:59:40 -04:00
Tyler Goodlet 1c59a01a78 Make subplot proportion slightly larger 2021-09-05 13:59:40 -04:00
Tyler Goodlet fd5c72f97d WIP position market offscreen nav 2021-09-05 13:59:40 -04:00
goodboy ad174c5c21
Merge pull request #204 from pikers/ib_adhoc_derivs
Ib adhoc derivs search
2021-09-02 12:57:12 -04:00
Tyler Goodlet d3838c2a8b Use built-in type generics 2021-09-02 12:55:10 -04:00
Tyler Goodlet eb5762d912 Add adhoc-symbols search for ib
This gives us fast search over a known set of symbols you can't search
for with the api such as futures and commodities contracts.

Toss in a new client method to lookup contract details
`Client.con_deats()` and avoid calling it for now from `.search_stock()`
for speed; it seems originally we were doing the 2nd lookup due to weird
suffixes in the `.primaryExchange` which we can just discard.
2021-09-02 10:55:37 -04:00
Tyler Goodlet 2227721dac Only set event if entry still exists 2021-09-02 10:52:21 -04:00
Tyler Goodlet 3dad779c90 Add commented catch to skip backpressure errors wen debugging 2021-09-01 10:26:49 -04:00
Tyler Goodlet d940957455 Support account passthrough in `.submit_limit()` 2021-09-01 10:26:49 -04:00
Tyler Goodlet ffbfd187ad Raise cache miss on a disconnected ib client 2021-09-01 10:26:49 -04:00
Tyler Goodlet c6aa867c9b Add more futes, add in order status comments 2021-09-01 10:26:49 -04:00
Tyler Goodlet 4527d4a677 Allocate an event per context 2021-09-01 10:17:03 -04:00
Tyler Goodlet 26cb7aa660 Drop tractor stream shielding use 2021-09-01 09:03:55 -04:00
Tyler Goodlet 2df16e11ed Re-implement client caching using `maybe_open_ctx` 2021-09-01 09:01:25 -04:00
Tyler Goodlet c3682348fe Use the actor's service nursery instead
In order to ensure the lifetime of the feed can in fact be kept open
until the last consumer task has completed we need to maintain
a lifetime which is hierarchically greater then all consumer tasks.

This solution is somewhat hacky but seems to work well: we just use the
`tractor` actor's "service nursery" (the one normally used to invoke rpc
tasks) to launch the task which will start and keep open the target
cached async context manager. To make this more "proper" we may want to
offer a "root nursery" in all piker actors that is exposed through some
singleton api or even introduce a public api for it into `tractor`
directly.
2021-08-31 12:46:47 -04:00
Tyler Goodlet 1184a4d88e Cache sample step streams per actor 2021-08-31 09:28:22 -04:00
Tyler Goodlet bbcce0cab6 Facepalm^2: pass through kwargs 2021-08-30 18:04:19 -04:00
Tyler Goodlet cae7f486e4 Revert "Lol, don't use `maybe_open_feed()` for now, it's totally borked..."
Think this was fixed by passing through `**kwargs` in
`maybe_open_feed()`, the shielding for fsp respawns wasn't being
properly passed through..

This reverts commit 2f1455d423.
2021-08-30 17:55:10 -04:00
Tyler Goodlet ff322ae7be Re-impl ctx-mng caching using `trio.Nursery.start()`
Maybe i've finally learned my lesson that exit stacks and per task ctx
manager caching is just not trionic.. Use the approach we've taken for
the daemon service manager as well: create a process global nursery for
each unique ctx manager we wish to cache and simply tear it down when
the number of consumers goes to zero.

This seems to resolve all prior issues and gets us error-free cached
feeds!
2021-08-30 17:54:43 -04:00
Tyler Goodlet 2f1455d423 Lol, don't use `maybe_open_feed()` for now, it's totally borked... 2021-08-26 17:04:59 -04:00
Tyler Goodlet 2a9d24ccac Remove dead OHLC index consumers from subs list on error 2021-08-26 17:04:59 -04:00
Tyler Goodlet fe0d66e847 Drop removed module import 2021-08-26 17:04:59 -04:00
Tyler Goodlet 1e42f58478 Add pause/resume feed api, delegate to msg stream for broadcast api 2021-08-26 17:04:59 -04:00
Tyler Goodlet 2f5abaa47a Add njs token bucket gist url 2021-08-26 17:04:59 -04:00
Tyler Goodlet c8e320849a Add super basic support for data feed "pausing" 2021-08-26 17:04:59 -04:00
Tyler Goodlet 0c9516051b TO SQUASH cached ctx. 2021-08-26 17:04:59 -04:00
Tyler Goodlet 71b50fdae8 Use broadcast chan for order client and avoid chan repacking 2021-08-26 17:04:59 -04:00
Tyler Goodlet 954dc6a8b0 Fix missing cache hit bool element of return 2021-08-26 17:04:59 -04:00
Tyler Goodlet 310d8f485e Add disclaimer to old data mod 2021-08-26 17:04:59 -04:00
Tyler Goodlet 2202abc9fb Add (lack of proper) ring buffer note 2021-08-26 17:04:59 -04:00
Tyler Goodlet 7d0f47364c Use `maybe_open_feed()` in ems and fsp daemons 2021-08-26 17:04:59 -04:00
Tyler Goodlet a7d3afc9b1 Add a `maybe_open_feed()` which uses new broadcast chans
Try out he new broadcast channels from `tractor` for data feeds
we already have cached. Any time there's a cache hit we load the
cached feed and just slap a broadcast receiver on it for the local
consumer task.
2021-08-26 17:04:59 -04:00
Tyler Goodlet 224dbbc4e3 Drop feed refs 2021-08-26 17:04:59 -04:00
Tyler Goodlet 7d5add1c3a Add an njs cache gist link 2021-08-26 17:04:59 -04:00
Tyler Goodlet 66f1d91541 Let's abstractify: -> 2021-08-26 17:04:59 -04:00
Tyler Goodlet 68ce5b3550 Add lifo cache to new module; drop "utils", bleh 2021-08-26 17:04:59 -04:00
Tyler Goodlet 0ce8057823 Move feed cacheing to cache mod; put entry retreival into ctx mng 2021-08-26 17:04:59 -04:00
Tyler Goodlet a0660e553f Start top level cacheing apis module 2021-08-26 17:04:59 -04:00
Tyler Goodlet 146c684f21 Cache `brokerd` feeds for reuse in clearing loop 2021-08-26 17:04:59 -04:00
Tyler Goodlet 89b2089562 Fixup missing ib section handling; drop `.api` subsection 2021-08-24 10:27:25 -04:00
Tyler Goodlet d5394ac677 Fix TWS triggered trades msg packing 2021-08-24 10:26:41 -04:00
Tyler Goodlet a10d20c041 Add ib config section support 2021-07-27 07:09:01 -04:00
Conrad Steenberg afafe56ec0 Remove List typing 2021-07-21 18:30:50 -07:00
Conrad Steenberg c830183073 More fixes, some reversions 2021-07-21 18:26:24 -07:00
Conrad Steenberg 3912b22b41 Fix a few QtGui -> QtWidget issues 2021-07-21 18:26:24 -07:00
Conrad Steenberg 9d8d8fd1a2 Fix PyQt5 error 2021-07-21 10:53:40 -07:00
Tyler Goodlet 83ad071cb4 Load provider search engines in tasks instead of exit stack 2021-07-11 11:13:35 -04:00
Tyler Goodlet 90588018a6 Label doc tweak 2021-07-11 11:13:35 -04:00
Tyler Goodlet 26c333ff22 Only close event send side (facepalm) 2021-07-08 10:55:47 -04:00
Tyler Goodlet 48053588da Don't cancel handler nursery, let errors bubble 2021-07-08 10:55:47 -04:00
Tyler Goodlet 830ef90721 Enable contents labels on q for "query" 2021-07-08 10:55:47 -04:00
Tyler Goodlet 8b966cd7e4 Port all to use new cursor and ohlc refs 2021-07-08 10:55:47 -04:00
Tyler Goodlet b6eeed1ae0 Move contents labels management to cursor mod
Add a new type/api to manage "contents labels" (labels that sit in
a view and display info about viewed data) since it's mostly used by
the linked charts cursor. Make `LinkedSplits.cursor` the new and only
instance var for the cursor such that charts can look it up from that
common class. Drop the `ChartPlotWidget._ohlc` array, just add
a `'ohlc'` entry to `._arrays`.
2021-07-08 10:55:47 -04:00
Tyler Goodlet d3d5d4ad06 Drop global order lines map
Orders in order mode should be chart oriented since there's a mode per
chart. If you want all orders just ask the ems or query all the charts
in a loop.

This fixes cancel-all-orders such that when 'cc' is tapped only the
orders on the *current* chart are cancelled, lel.
2021-07-08 10:55:47 -04:00
Tyler Goodlet 91209b7d6e Use group status for symbol loading 2021-07-08 10:55:47 -04:00
Tyler Goodlet 37180a4e4e Fix old msg clearing var name 2021-07-08 10:55:47 -04:00
Tyler Goodlet eeeeb29f71 Add order cancellation and submission statuses
Generalize the methods for cancelling groups of orders (all or those
under cursor) and add new group status support such that statuses for
each cancel or order submission is displayed in the status bar. In the
"cancel-all-orders" case, use the new group status stuff.
2021-07-08 10:55:47 -04:00
Tyler Goodlet 572f984d06 Add an all order lines getter method 2021-07-08 10:55:47 -04:00
Tyler Goodlet 0133f0b589 Add "group statuses" support to status bar
Allows for submitting a top level "group status" associated with
a "group key" which eventually resolves once all sub-statuses associated
with that group key (and thus top level status) complete and are also
removed. Also add support for a "final message" for each status such
that once the status clear callback is called a final msg is placed on
the status bar that is then removed when the next status is set.

It's all a questionable bunch of closures/callbacks but it worx.
2021-07-08 10:55:47 -04:00
Tyler Goodlet 53074b552a Add fast tap key sequence support and order-mode-type statuses 2021-07-08 10:55:47 -04:00
Tyler Goodlet 3650db3321 Make alerts solid line only 2021-07-08 10:55:47 -04:00
Tyler Goodlet 0ded790330 Didn't end up needing a task stack 2021-07-08 10:55:47 -04:00
Tyler Goodlet ca23825aff Start input handling **after** order mode is up 2021-07-08 10:55:47 -04:00
Tyler Goodlet c971997f1a Don't access unset cursor 2021-07-08 10:55:47 -04:00
Tyler Goodlet aabbc12b82 Beautifully simplify kb handling code with set ops 2021-07-08 10:55:47 -04:00
Tyler Goodlet 983a517a8c Drop old commented behaviour; see parent class if needed 2021-07-08 10:55:47 -04:00
Tyler Goodlet 03c95ca908 Factor press and release handling into same qtloop 2021-07-08 10:55:47 -04:00
Tyler Goodlet 569b2efb51 Move region selection to editors mod 2021-07-08 10:55:47 -04:00
Tyler Goodlet 4a37cf768f Move line and arrow editors to new mod 2021-07-08 10:55:47 -04:00
Tyler Goodlet 93af8c936c Port cursor and axes to new widget names 2021-07-08 10:55:47 -04:00
Tyler Goodlet 75804a441c Convert view box to async input handling
Instead of callbacks for key presses/releases convert our `ChartView`'s
kb input handling to async code using our event relaying-over-mem-chan
system. This is a first step toward a more async driven modal control
UX. Changed a bunch of "chart" component naming as part of this as well,
namely: `ChartSpace` -> `GodWidget` and `LinkedSplitCharts` ->
`LinkedSplits`. Engage the view boxe's async handler code as part of new
symbol data loading in `display_symbol_data()`. More re-orging to come!
2021-07-08 10:55:47 -04:00
Tyler Goodlet 85621af8af Extend Qt event relaying
Add an `open_handler()` ctx manager for wholesale handling event sets
with a passed in async func. Better document and implement the event
filtering core including adding support for key "auto repeat" filtering;
it turns out the events delivered when `trio` does its guest-most tick
are not the same (Qt has somehow consumed them or something) so we have
to do certain things (like getting the `.type()`, `.isAutoRepeat()`,
etc.) before shipping over the mem chan. The alt might be to copy the
event objects first but haven't tried it yet. For now just offer
auto-repeat filtering through a flag.
2021-07-08 10:55:47 -04:00
Tyler Goodlet 91907bf5ef Drop old dialogues pop flag, the client does it on teardown 2021-07-08 10:17:31 -04:00
Tyler Goodlet f4a998655b Feed detach must explicitly unsub throttled streams
If a client attaches to a quotes data feed and requests a throttle rate,
be sure to unsub that side-band memchan + task when it detaches and
especially so on any transport connection error.

Also, use an explicit `tractor.Context.cancel()` on the client feed
block exit since we removed the implicit cancel option from the
`tractor` api.
2021-07-07 07:51:09 -04:00
Tyler Goodlet 9f897ba75c Support multiple client trade flows over one `brokerd~
There is no reason to have more then `brokerd` trades dialogue stream
open per `emsd`. Here we minimize to managing that lone stream and
multiplexing msgs from each client such that multiple clients can be
connected to the ems, conducting trading without requiring multiple
ems-client connections to the backend broker and without the broker
being aware there are even multiple flows going on.

This patch also sets up for being able to have ems clients which
register to receive and track trade flows from other piker clients thus
enabling so called "multi-player" trading where orders for both paper
and live trades can be shared between multiple participants in the form
of a pre-broker, local clearing service and trade signals dark book.
2021-07-07 07:51:09 -04:00
Tyler Goodlet 8b6fb83257 Pop subscriber streams on connection errors 2021-07-07 07:51:09 -04:00
Tyler Goodlet 003fa6254f Don't forget to pop the brokerd dialogue on teardown.. 2021-07-07 07:51:09 -04:00
Tyler Goodlet 8f05254c80 Better live order handling logic 2021-07-07 07:51:09 -04:00
Tyler Goodlet a7e106be96 Avoid multiple `brokerd` trades dialogue flows
This solves a bunch of issues to do with `brokerd` order status msgs
getting relayed for each order to **every** correspondingly connected
EMS client. Previously we weren't keeping track of which emsd orders
were associated with which clients so you had backend msgs getting
broadcast to all clients which not only resulted in duplicate (and
sometimes erroneous, due to state tracking) actions taking place in the
UI's order mode, but it's also just duplicate traffic (usually to the
same actor) over multiple logical streams. Instead, only keep up **one**
(cached) stream with the `trades_dialogue()` endpoint such that **all**
emsd orders route over that single connection to the particular
`brokerd` actor.
2021-07-07 07:51:09 -04:00
Tyler Goodlet 9c24bb6480 Make json resp log debug level 2021-07-07 07:07:01 -04:00
Tyler Goodlet 7b6e34aaf4 Better formalize `pikerd` service semantics
An async exit stack around the new `@tractor.context` is problematic
since a pushed context can't bubble errors unless the exit stack has
been closed. But in that case why do you need the exit stack if you're
going to push it and wait it right away; it seems more correct to use
a nursery and spawn a task in `pikerd` that waits on the both the
target context completion first (thus being able to bubble up any errors
from the remote, and top level service task) and the sub-actor portal.
(Sub)service Daemons are spawned with `.start_actor()` and thus will
block forever until cancelled so, add a way to cancel them explicitly
which we'll need eventually for restarts and dynamic feed management.

The big lesson here is that async exit stacks are not conducive to
spawning and monitoring service tasks, and especially so if
a `@tractor.context` is used since if the `.open_context()` call isn't
exited (only possible by the stack being closed), then there will be no
way for `trio` to cancel the task that pushed that context (since it
can't run a checkpoint while yielded inside the stack) without also
cancelling all other contexts pushed on that stack. Presuming one
`pikerd` task is used to do the original pushing (which it was) then
any error would have to kill all service daemon tasks which obviously
won't work.

I see this mostly as the painz of tinkering out an SC service manager
with `tractor` / `trio` for the first time, so try to go easy on the
process ;P
2021-07-06 16:41:41 -04:00
Tyler Goodlet cc9a720af7 Don't use a context stack for contexts 2021-07-06 16:41:10 -04:00
Tyler Goodlet df2f6487ff Apply `brokerd` quote rate throttling when requested in `open_feed()` 2021-06-14 21:55:51 -04:00
Tyler Goodlet ccf81520cb First attempt data feed side quote throttling
Adding binance's "hft" ws feeds has resulted in a lot of context
switching in our Qt charts, so much so it's chewin CPU and definitely
worth it to throttle to the detected display rate as per discussion in
issue #192.

This is a first very very naive attempt at throttling L1 tick feeds on
the `brokerd` end (producer side) using a constant and uniform delivery
rate by way of a `trio` task + mem chan.  The new func is
`data._sampling.uniform_rate_send()`. Basically if a client request
a feed and provides a throttle rate we just spawn a task and queue up
ticks until approximately the next display rate's worth period of time
has passed before forwarding. It's definitely nothing fancy but does
provide fodder and a start point for an up and coming queueing eng to
start digging into both #107 and #109 ;)
2021-06-14 21:43:19 -04:00
Tyler Goodlet 57a35a3c6c Port feed bus endpoint to a `@tractor.context` 2021-06-14 10:55:01 -04:00
Tyler Goodlet 3455ebc60c Cast back to tuples after msgspec strips them... 2021-06-14 00:03:05 -04:00
Tyler Goodlet 588b5c317c Drop unseralizable "sec tag" for now 2021-06-14 00:02:23 -04:00
Tyler Goodlet f320f95288 Drop old hi-dpi font inches sizes 2021-06-13 23:59:02 -04:00
Tyler Goodlet d269edc0b3 Re-org main window singleton into a new module
Avoids some cyclical and confusing import time stuff that we needed to get
DPI aware fonts configured from the active display. Move the main window
singleton into its own module and add a `main_window()` getter for it.
Make `current_screen()` a ``MainWindow` method to avoid so many module
variables.
2021-06-13 23:47:52 -04:00
Tyler Goodlet 84f61c9a92 Avoid clearing cached results; detect repeats later 2021-06-10 13:23:28 -04:00
Tyler Goodlet 0dcadec11a Add multi-status updates throughout chart init 2021-06-10 13:23:28 -04:00
Tyler Goodlet 90b0673052 Add multi-status support to window 2021-06-10 13:23:28 -04:00
Tyler Goodlet ce67022e2e Only add font size scaled down when dpi scaling > 2 2021-06-10 13:23:28 -04:00
Tyler Goodlet 9d31f8ca6a Add default "small" dpi aware font 2021-06-10 13:23:28 -04:00
Tyler Goodlet f68295653d Load cache search before other providers 2021-06-10 13:23:28 -04:00
Tyler Goodlet 112b3f0f07 Drop hidpi font size hacking from contents labels 2021-06-10 13:23:28 -04:00
Tyler Goodlet e924cbeb43 Min debounce period for faster cached completions 2021-06-10 13:23:28 -04:00
Tyler Goodlet 62c456f8eb Downscale fonts on scaled-down hidpi displays 2021-06-10 13:23:28 -04:00
Tyler Goodlet 193f4f945c Flip to using scaled hi DPI detected by Qt 2021-06-10 13:23:28 -04:00
Tyler Goodlet bb1c549d94 Add some initial status updates during startup 2021-06-10 13:23:28 -04:00
Tyler Goodlet df50700aa5 Style a basic status bar and add a mode label to it 2021-06-10 13:23:28 -04:00
Tyler Goodlet a9cdb94ff3 Port styling to latest `qtdarkstyle` version 2021-06-10 13:23:28 -04:00
Tyler Goodlet 74b63b9868 Add mode label to right side 2021-06-10 13:23:28 -04:00
Tyler Goodlet cc60ad46fc Skip chart updates if parent widget is hidden to save cpus 2021-06-10 13:23:28 -04:00
Tyler Goodlet 7da7dee02b Add mode name to viewbox 2021-06-10 13:23:28 -04:00
Tyler Goodlet 78e04e66a5 Add mode names to search, repair LIFO ordering on select 2021-06-10 13:23:28 -04:00
Tyler Goodlet 0564bbd9c3 Use focus switch signal to update status bar 2021-06-10 13:23:28 -04:00
Tyler Goodlet 754a5cce4f WIP toying with a simple status bar 2021-06-10 13:23:28 -04:00
Tyler Goodlet 8d02778158 Don't bail on unknown order ids 2021-06-10 12:02:57 -04:00
Tyler Goodlet 95f466b93d Fix to msg attr access 2021-06-10 12:02:26 -04:00
goodboy 689bc0cde0
Merge pull request #190 from pikers/ems_to_bidir_streaming
Ems to bidir streaming
2021-06-10 08:45:44 -04:00
Tyler Goodlet a9cc3210d8 Grr pydantic being a weirdo 2021-06-10 08:37:21 -04:00
Tyler Goodlet a9cbacd8aa Move details assignements to static declaration 2021-06-10 08:24:51 -04:00
Tyler Goodlet b06cb5bb5a Comments clean and improvments 2021-06-10 08:24:10 -04:00
Tyler Goodlet a1f605bd52 Clear out old commented code 2021-06-09 13:21:56 -04:00
Tyler Goodlet 8e8a005128 Fix attr accesses on msg type 2021-06-09 12:22:02 -04:00
Konstantine Tsafatinos 90e5a10a66 modify error string to format: <name>.<provider> 2021-06-09 12:02:05 -04:00
Tyler Goodlet 4cae470f3a Pass "arbiter" socket correctly 2021-06-08 15:57:01 -04:00
Tyler Goodlet 47e7baa0c9 Ensure paperboi is shield killed on teardown 2021-06-08 15:56:34 -04:00
Tyler Goodlet db92683ede Port ib orders to new msgs and bidir streaming api 2021-06-08 14:33:41 -04:00
Tyler Goodlet 6e58f31fd8 Port EMS to typed messaging + bidir streaming
This moves the entire clearing system to use typed messages using
`pydantic.BaseModel` such that the streamed request-response order
submission protocols can be explicitly viewed in terms of message
schema, flow, and sequencing. Using the explicit message formats we can
now dig into simplifying and normalizing across broker provider apis to
get the best uniformity and simplicity.

The order submission sequence is now fully async: an order request is
expected to be explicitly acked with a new message and if cancellation
is requested by the client before the ack arrives, the cancel message is
stashed and then later sent immediately on receipt of the order
submission's ack from the backend broker. Backend brokers are now
controlled using a 2-way request-response streaming dialogue which is
fully api agnostic of the clearing system's core processing; This
leverages the new bi-directional streaming apis from `tractor`.  The
clearing core (emsd) was also simplified by moving the paper engine to
it's own sub-actor and making it api-symmetric with expected `brokerd`
endpoints.

A couple of the ems status messages were changed/added:
'dark_executed' -> 'dark_triggered'
added 'alert_triggered'

More cleaning of old code to come!
2021-06-08 14:33:30 -04:00
Tyler Goodlet 0dabc6ad26 Port paper engine to new msgs and run in sub-actor
This makes the paper engine look IPC-wise exactly like any
broker-provider backend module and uses the new ``trades_dialogue()``
2-way streaming endpoint for commanding order requests.

This serves as a first step toward truly distributed forward testing
since the paper engine can now be run out-of tree from `pikerd` if
needed thus demonstrating how real-time clearing signals can be shared
between fully distinct services.
2021-06-08 14:32:03 -04:00
Tyler Goodlet 23094d8624 Spec out brokerd 2-way trade dialogue messages 2021-06-08 14:31:43 -04:00
Tyler Goodlet 02459cd964 Use new top level portal import 2021-06-08 14:31:14 -04:00
Tyler Goodlet 0bcad35c70 Set ack time on pydantic model 2021-06-08 14:31:04 -04:00
Tyler Goodlet f9238f3a8a Validate client message updates 2021-06-08 14:30:47 -04:00
Konstantine Tsafatinos 099bf260f5 fix unknown kraken symbol raised error 2021-06-01 18:01:45 -04:00
Tyler Goodlet f4c9e20f0d Avoid `numpy` type usage on the wire 2021-06-01 10:48:23 -04:00
Tyler Goodlet edf3af9777 Drop waits to half-seconds 2021-06-01 10:48:23 -04:00
Tyler Goodlet 9931accc52 Port clearing systems to new tractor context api
This avoids somewhat convoluted "hackery" making 2 one-way streams
between the order client and the EMS and instead uses the new
bi-directional streaming and context API from `tractor`. Add a router
type to the EMS that gets setup by the initial service tree and which
we'll eventually use to work toward multi-provider executions and
order-trigger monitoring. Move to py3.9 style where possible throughout.
2021-06-01 10:48:23 -04:00
Tyler Goodlet 7fb2c95ef1 Factor daemon spawning logic, use it to spawn emsd 2021-06-01 10:48:23 -04:00
Tyler Goodlet 9792b9aa7d Drop search pause config; use default 2021-05-28 14:11:02 -04:00
Tyler Goodlet 51a8308105 Lower connection timeout duration 2021-05-28 14:11:02 -04:00
Tyler Goodlet b689adaeb0 Throttle L1 label updates at a lower rate 2021-05-28 14:11:02 -04:00
Tyler Goodlet ff856a6ee3 Woops, make unsub pairs a list 2021-05-28 14:11:02 -04:00
Tyler Goodlet 19711bf024 Reconnect slow binance conns instead of error 2021-05-28 14:11:02 -04:00
Tyler Goodlet 1a7b06c147 Limit l1 graphics updates to half the refresh rate 2021-05-28 14:11:02 -04:00
Tyler Goodlet d0e3f5a51c Port binance and kraken to "reliable" ws API 2021-05-28 14:11:02 -04:00
Tyler Goodlet 89dc3dde61 Move no bs websocket api into its own data module 2021-05-28 14:11:02 -04:00
Tyler Goodlet ee71f445fb Clear entries on no results returned per task 2021-05-28 14:08:24 -04:00
Tyler Goodlet a31b83c5ca Don't ever send plain whitespace a search pattern 2021-05-28 13:44:30 -04:00
Tyler Goodlet ea3d96e7ed Accept arbitrary QEvent subscriptions via a set 2021-05-28 13:30:26 -04:00
Tyler Goodlet 7fa9f3f542 Add `Client.search_symbols()` to all backends, use it in `piker search` 2021-05-28 12:29:58 -04:00
Tyler Goodlet c56c7b8540 Increase min debounce period, stop searching on user nav selection 2021-05-28 10:16:00 -04:00
Tyler Goodlet 50aff72f8e Don't require map (yet) in backend modules 2021-05-27 13:05:23 -04:00
Tyler Goodlet ec6ea32dda Don't pass through linked charts x-axis handle 2021-05-27 13:05:23 -04:00
Tyler Goodlet e88e5b8ce2 Decrease binance search debounce period 2021-05-27 13:05:23 -04:00
Tyler Goodlet 3e39e9620c Add a no data available error 2021-05-27 13:05:23 -04:00
Tyler Goodlet 7dfc7f7fa2 Factor chart selection into widget, cleanups, add resource links 2021-05-27 13:05:23 -04:00
Tyler Goodlet ab3adcee9e Get basic switch-on-click mouse support working 2021-05-27 13:05:23 -04:00
Tyler Goodlet 607e1a8299 Add per-provider-async searching with status updates 2021-05-27 13:05:23 -04:00
Tyler Goodlet 89beb92866 Add api for per-section filling/clearing
Makes it so we can move toward separate provider results fills in an
async way, on demand.

Also,
- add depth 1 iteration helper method
- add section finder helper method
- fix last selection loading to be mostly consistent
2021-05-27 13:05:23 -04:00
Tyler Goodlet c478ddaed0 Disable cursor blink globally 2021-05-27 13:05:23 -04:00
Tyler Goodlet 924960a359 Add label to search bar 2021-05-27 13:05:23 -04:00
Tyler Goodlet 46d88965d3 Get LIFO sort on cache syms working properly 2021-05-27 13:05:23 -04:00
Tyler Goodlet 44f4fdf043 Type annot the internal symbol cache 2021-05-27 13:05:23 -04:00
Tyler Goodlet 59475cfd81 Store lowercase symbols within piker data internals 2021-05-27 13:05:23 -04:00
Tyler Goodlet af9dcf9230 Use an ordered dict to get LIFO cache sorting on sym selection 2021-05-27 13:05:23 -04:00
Tyler Goodlet 9bfc230dde Speedup: load provider searches async at startup 2021-05-27 13:05:23 -04:00
Tyler Goodlet c9cf72d554 Add remote context allocation api to service daemon
This allows for more deterministically managing long running sub-daemon
services under `pikerd` using the new context api from `tractor`.
The contexts are allocated in an async exit stack and torn down at root
daemon termination. Spawn brokerds using this method by changing the
persistence entry point to be a `@tractor.context`.
2021-05-27 13:05:23 -04:00
Tyler Goodlet 27d704b32e To avoid feed breakage, just give up on history after too many throttles for now 2021-05-27 13:05:23 -04:00
Tyler Goodlet 82cdb176e1 Make ctrl-l highlight current text in edit 2021-05-27 13:05:23 -04:00
Tyler Goodlet 0cd3cb3328 Drop old todo 2021-05-27 13:05:23 -04:00
Tyler Goodlet 212882a5a5 Don't try to show xhair if no active plot 2021-05-27 13:05:23 -04:00