Commit Graph

1154 Commits (30ac32da55669d0cc4054a95a9410ac6a23a6984)

Author SHA1 Message Date
Tyler Goodlet a82f43e3a5 Rework data feed API to allow for caching streams
Move all feed/stream agnostic logic and shared mem writing into a new
set of routines inside the ``data`` sub-package. This lets us move
toward a more standard API for broker and data backends to provide
cache-able persistent streams to client apps.

The data layer now takes care of
- starting a single background brokerd task to start a stream for as
  symbol if none yet exists and register that stream for later lookups
- the existing broker backend actor is now always re-used if possible
  if it can be found in a service tree
- synchronization with the brokerd stream's startup sequence is now
  oriented around fast startup concurrency such that client code gets
  a handle to historical data and quote schema as fast as possible
- historical data loading is delegated to the backend more formally by
  starting a ``backfill_bars()`` task
- write shared mem in the brokerd task and only destruct it once requested
  either from the parent actor or further clients
- fully de-duplicate stream data by using a dynamic pub-sub strategy
  where new clients register for copies of the same quote set per symbol

This new API is entirely working with the IB backend; others will need
to be ported. That's to come shortly.
2021-04-10 14:18:40 -04:00
Tyler Goodlet f17a26c948 Don't mistakenly alias options to underlyingn for positions 2021-04-10 14:18:40 -04:00
Tyler Goodlet 65e7680cdd Draft a feed cacheing sub-system 2021-04-10 14:18:40 -04:00
Tyler Goodlet 0d4073dbd2 Move quote stream setup into a cacheing func 2021-04-10 14:18:40 -04:00
Tyler Goodlet aa61bf5a65 Use mem-chans for quote streams; clone for multiple consumers 2021-04-10 14:18:40 -04:00
Tyler Goodlet 17d3e7a9e2 Don't shield ems feed; enact remote cancels 2021-04-10 14:18:40 -04:00
goodboy feb8d5bbad
Merge pull request #153 from wattygetlood/windows_patches
Windows patches
2021-04-06 11:55:51 -04:00
Tyler Goodlet 549f81e85d Fix lints 2021-04-03 12:29:56 -04:00
Tyler Goodlet 2b7cecc78e Drop upcoming cached feed usage 2021-04-03 12:22:14 -04:00
Tyler Goodlet 6891309abd Fix import 2021-04-03 12:22:14 -04:00
Tyler Goodlet b1a1b32315 Better tractor startup, runtime detection 2021-04-03 12:22:14 -04:00
Tyler Goodlet 877db52162 Add license header 2021-04-03 12:22:14 -04:00
Tyler Goodlet 2a51582ec0 Start forming an services api
Add a `Services` nurseries container singleton for spawning sub-daemons
inside the long running `pikerd` tree. Bring in `brokerd` spawning util
funcs to start getting eyes on what can be factored into a service api.
2021-04-03 12:22:14 -04:00
Tyler Goodlet 38471b7b34 Use early return instead of branching for remote emsd spawning 2021-04-03 12:22:14 -04:00
Tyler Goodlet fb996bfffb Change subpkg name in cli 2021-04-03 12:22:14 -04:00
Tyler Goodlet 20a9617c18 Use open pikerd from chart entrypoint 2021-04-03 12:22:14 -04:00
Tyler Goodlet 4ab8545e87 Return early on remote actor lookups instead of branching 2021-04-03 12:22:14 -04:00
Tyler Goodlet 8ce37875a0 Use pikerd to spawn emsd 2021-04-03 12:22:14 -04:00
Tyler Goodlet 1931da97f4 Fix spawn attr typo, merge tractor kwargs 2021-04-03 12:22:14 -04:00
Tyler Goodlet 7ca05238af Port pikerd entry to drop `tractor.run()` 2021-04-03 12:22:14 -04:00
Tyler Goodlet 79d37646a2 Add `open_pikerd()` and `spawn_emsd()`
The direct open is needed for running `pikerd` cmd and
the ems spawn point is the first step toward detaching UI based order
entry from the engine itself.
2021-04-03 12:22:14 -04:00
Tyler Goodlet 8812aff3b8 Fix import 2021-04-03 12:22:14 -04:00
Tyler Goodlet 26ee7260d6 Clearing is a better name 2021-04-03 12:22:14 -04:00
Tyler Goodlet 2b9ac8d8ec Port daemon(s) to new clearing system apis 2021-04-03 12:22:14 -04:00
Guillermo Rodriguez 189c56c012 Add piker root daemon spawning machinery
Refactor maybe_spawn_brokerd to adapt to new process tree structure
and add a ``maybe_open_pikerd``.
2021-04-03 12:22:14 -04:00
Tyler Goodlet d4395dbcbc Make default view more zooomed in 2021-03-31 14:26:32 -04:00
Tyler Goodlet f75b3108ce Size execution arrows to dpi 2021-03-31 14:26:13 -04:00
Tyler Goodlet 0dfa92230d Size level line markers to dpi aware font size 2021-03-31 14:25:51 -04:00
Tyler Goodlet 54d36f26f0 Base anchor contents labels based on dpi-aware font bounding rect 2021-03-31 14:25:17 -04:00
Tyler Goodlet 3f7d9c5c15 Base axis text offset on dpi-aware font size 2021-03-31 14:24:39 -04:00
Tyler Goodlet 3bd87caf4b Hip shot: try making low dpi font sizes "just work" 2021-03-29 17:52:32 -04:00
wattygetlood c39c4f11db Forcinng trio spawner seems to work? 2021-03-28 17:24:30 -04:00
wattygetlood 583cafc947 Avoid loading posix unlinker, use shm bytes size 2021-03-28 17:23:59 -04:00
Tyler Goodlet 07a5bf4b7c Use low dpi inches on 96 dpi 2021-03-19 09:33:47 -04:00
Tyler Goodlet 77fbde1115 Override the inverse transform func from pg 2021-03-19 00:40:39 -04:00
Tyler Goodlet 6fa1d4dc88 Show xhair even if order is filled while line is hovered 2021-03-18 21:57:08 -04:00
Tyler Goodlet 5610807b8e Move marker factory funcs to new mod 2021-03-18 16:59:22 -04:00
Tyler Goodlet 55de079320 Add low dpi settings and different default view bars counts 2021-03-18 13:40:31 -04:00
Tyler Goodlet 67c5563090 Enable marker-on-select through order mode 2021-03-18 13:33:10 -04:00
Tyler Goodlet 68f75b582a More fixes for kivy shit 2021-03-18 13:32:34 -04:00
Tyler Goodlet cd5da45abf Show order line marker on hover 2021-03-18 13:28:28 -04:00
Tyler Goodlet 2c7d8cdbb0 Support hiding only "half" the xhair 2021-03-18 13:27:49 -04:00
Tyler Goodlet e1dc2b9225 Enable daemon debug through top level kwarg 2021-03-17 08:36:34 -04:00
Tyler Goodlet aaca2b2f33 Tweak L1 labels to have more spaces 2021-03-17 08:26:28 -04:00
Tyler Goodlet 17b66e685f Experiment with zoom focal @ L1 edge 2021-03-17 08:25:58 -04:00
Tyler Goodlet d1c8c2a072 More level line reworking
- break (custom) graphics item style marker drawing into separate func
 but keep using it since it still seems oddly faster then the
 QGraphicsPathItem thing..
- unfactor hover handler; it was uncessary
- make both the graphics path item and custom graphics items approaches
  both work inside ``.paint()``
2021-03-16 19:36:05 -04:00
Tyler Goodlet adf6437449 Move margin settings to class scope 2021-03-16 15:59:44 -04:00
Tyler Goodlet 61198818dc Fix label snap on line highlight bug 2021-03-14 12:28:11 -04:00
Tyler Goodlet cf2f001bcc Add save last datum toggle to y-label 2021-03-13 21:06:53 -05:00
Tyler Goodlet 776395791a Pass action to line editor 2021-03-13 19:31:22 -05:00
Tyler Goodlet c75dacb239 Support func ops on field data, extend anchor logics 2021-03-13 19:29:52 -05:00
Tyler Goodlet c71a3e0fc5 Level line look and feel rework
Add support for drawing ``QPathGraphicsItem`` markers but don't use them
since they seem to be shitting up when combined with the infinite line
(bounding rect?): weird artifacts and whatnot. The only way to avoid
said glitches seems to be to update inside the infinite line's
`.paint()` but that slows stuff down.. Instead stick with the manual
paint job use the same pin point: left of the L1 spread graphics - where
the lines now also extend to.

Further stuff:
- Pin the y-label to a line's value on hover.
- Disable x-dimension line moving
- Rework the labelling to be more minimal
2021-03-13 17:31:15 -05:00
Tyler Goodlet 887c305d46 Allow y-label pinning on cross hair hide 2021-03-13 17:29:35 -05:00
Tyler Goodlet 9798689961 Lengthen label arrow a tad 2021-03-13 17:28:57 -05:00
Tyler Goodlet f6dbdfab84 Don't crash on unknown orders execing 2021-03-13 17:28:22 -05:00
Tyler Goodlet 396f6b2a0d Fix type annot 2021-03-12 07:41:47 -05:00
Tyler Goodlet 18ab81a967 Make crosshair lines a milder gray 2021-03-11 21:44:35 -05:00
Tyler Goodlet 624617d8e1 Don't run brokerds in debug mode by default 2021-03-11 21:44:10 -05:00
Tyler Goodlet d016abcd0d Adjust right axis anchor closure to include l1 label size 2021-03-11 21:43:29 -05:00
Tyler Goodlet 4a1df686a5 Update max l1 label size on chart 2021-03-11 21:42:38 -05:00
Tyler Goodlet a51d5c536e Add a couple more grays 2021-03-11 21:41:13 -05:00
Tyler Goodlet 31c14a2f9f Add l1 label size tracking to chart widget 2021-03-11 21:40:50 -05:00
Tyler Goodlet ea8120156f Add position line updating to order mode 2021-03-11 21:40:06 -05:00
Tyler Goodlet e91e7bea1f Add position event support to ems 2021-03-11 21:38:59 -05:00
Tyler Goodlet 6265ae8057 Add position event relay to ib broker backend 2021-03-11 21:38:31 -05:00
Tyler Goodlet 98bfee028a Add a position line api
Add a line which shows the current average price position with and arrow
marker denoting the direction (long or short). Required some further
rewriting of the infinite line from pyqtgraph including:
- adjusting marker (arrow) placement to be offset from axis + l1 labels
- fixing the hover event to not require the `.movable` attribute to be
  set
2021-03-11 21:35:09 -05:00
Tyler Goodlet 7075a968b4 Create an order mode module 2021-03-08 09:05:37 -05:00
Tyler Goodlet 7e214180a6 Remove old simulated order price on update 2021-03-07 22:17:19 -05:00
Tyler Goodlet fff9efe4aa Snap level line movements to tick size 2021-03-07 22:16:46 -05:00
Tyler Goodlet d58a82bd38 Factor and simplify paper clearing logic 2021-03-07 16:41:14 -05:00
Tyler Goodlet 5deea50963 Factor order request processing into new func 2021-03-07 16:25:47 -05:00
Tyler Goodlet e71bcb363c Drop stage line cacheing; the complexity isn't worth it. 2021-03-07 16:07:23 -05:00
Tyler Goodlet de5a69c59c Add mouse drag order update support to UI 2021-03-07 16:01:42 -05:00
Tyler Goodlet 6851bacd0a Add drag start/end callback support, remove from cursor hovered on delete 2021-03-07 15:50:50 -05:00
Tyler Goodlet 0ade7daebc Support simulated live order modification in paper engine 2021-03-07 13:34:03 -05:00
Tyler Goodlet 919ecab732 Support order modification in ems request loop 2021-03-07 13:12:39 -05:00
Tyler Goodlet a43ab1b983 Add order update method to client 2021-03-07 10:56:09 -05:00
Tyler Goodlet 2cabe1831c Attempt to handle existing order updates with ib backend 2021-03-06 16:33:56 -05:00
Tyler Goodlet a1a1dec885 Move L1 labels into lone module 2021-03-01 14:48:08 -05:00
Tyler Goodlet 8997b6029b Drop cruft 2021-03-01 12:02:07 -05:00
Tyler Goodlet 72c4a4366b Tag TWS trade events 2021-03-01 12:01:48 -05:00
Tyler Goodlet a1691cf1c5 Keep to one EMS daemon if possible 2021-03-01 11:28:44 -05:00
Tyler Goodlet 327129db37 Drop paper limit submissions for alerts 2021-02-25 18:44:40 -05:00
Tyler Goodlet 9f9b5480a6 More explicit private var name 2021-02-24 12:05:09 -05:00
Tyler Goodlet 948e133cae Split out ems daemon, client api and paper engine into new mods 2021-02-22 18:37:57 -05:00
Tyler Goodlet a9bbc223bb Add a new exchange subpackage 2021-02-22 17:28:34 -05:00
Tyler Goodlet 1142a538ea Don't forward errors without an order id 2021-02-22 10:45:01 -05:00
Tyler Goodlet e6ea053d40 Get kivy/questrade shit working again 2021-02-21 12:32:40 -05:00
Tyler Goodlet f724798336 Fix incorrect bounding rect calc 2021-02-21 12:02:20 -05:00
Tyler Goodlet 4b0e5662a5 Add default order lot sizes by asset type 2021-02-21 12:01:48 -05:00
Tyler Goodlet 6fb1945360 Fix and pass through piker loglevel correctly 2021-02-21 11:50:33 -05:00
Tyler Goodlet aa4a2ef64f Bump up font size one more time 2021-02-21 11:49:27 -05:00
Tyler Goodlet c2890b8197 Port level line to xhair methods 2021-02-21 11:48:51 -05:00
Tyler Goodlet d5b41e12c5 Add crosshair hide/show convenience methods 2021-02-21 11:45:24 -05:00
Tyler Goodlet 71745ddcd4 Even smaller text fill on axes 2021-02-21 11:44:58 -05:00
Tyler Goodlet 8c757d0bdd Accept a symbol type key from broker 2021-02-21 11:42:19 -05:00
Tyler Goodlet 38b2e99002 Fill clearable prices asap 2021-02-20 16:43:33 -05:00
Tyler Goodlet d8b157d209 First draft paper trading engine!
It's a super naive implementation with no slippage model or network
latency besides some slight delays. Clearing only happens on bid/ask
sweep ticks at the moment - simple last volume based clearing coming
up next.
2021-02-20 15:25:53 -05:00
Tyler Goodlet ead2f77d40 Add a symbol/asset type key 2021-02-19 18:43:56 -05:00
Tyler Goodlet add63734f1 Add an auto-reconnect websocket API 2021-02-19 18:42:50 -05:00
Tyler Goodlet bbd54e8f95 Report asset types, tick sizes, and order actions from ib 2021-02-19 17:23:37 -05:00
Tyler Goodlet 1ac4cc3dd3 Use new field label api for L1 2021-02-16 06:42:48 -05:00
Tyler Goodlet 880bdcffa7 Document order status list from ib 2021-02-12 09:07:49 -05:00
Tyler Goodlet b794855ad3 Port order mode to new order line api 2021-02-11 23:42:57 -05:00
Tyler Goodlet d91f07c947 Drop old candlestick graphics code 2021-02-11 23:42:17 -05:00
Tyler Goodlet aec8f1d25c Hide y-label on level line mouse over 2021-02-11 23:41:40 -05:00
Tyler Goodlet bf78c13df4 Attempt px perfection on crosshair lines placement 2021-02-11 14:03:47 -05:00
Tyler Goodlet f51e503e47 Support arbitrary fields (with update) in labels
This turned into a larger endeavour then intended but now we're using our
own label system on level lines to be able to display things nicely
**pinned wherever we want in the UI**. Keep the old ``LevelLabel`` for
now for the L1 graphics but we'll likely replace this as well since i'm
pretty sure the new label type (which wraps `QGraphicsTextItem`) is more
performant anyway.
2021-02-11 13:59:50 -05:00
Tyler Goodlet cbf259f3f3 Add hidpi issue regarding it being borky 2021-02-11 11:49:33 -05:00
Tyler Goodlet ca576ca3cf Add label delete method 2021-02-11 11:49:01 -05:00
Tyler Goodlet 0edca84b3d Yet another font size tweak 2021-02-11 11:48:40 -05:00
Tyler Goodlet dd1aed627e Tidy axis code 2021-02-11 11:48:19 -05:00
Tyler Goodlet 02edfdf846 Pass order size to ems 2021-02-11 11:47:34 -05:00
Tyler Goodlet 21e1561a57 Add a sane label type..smh 2021-02-11 00:12:37 -05:00
Tyler Goodlet 386cd9404d Drop hidpi detection? it doesn't seem to yield benefits 2021-02-08 07:07:04 -05:00
Tyler Goodlet ac84087755 Fix stage line updating, size up arrow heads? 2021-02-08 07:06:00 -05:00
Tyler Goodlet 0449734c53 Drop YSticky for level lines stuff 2021-02-08 07:04:08 -05:00
Tyler Goodlet 1ef2d18a41 Try to make crosshair lines px perfect 2021-02-08 07:03:28 -05:00
Tyler Goodlet 708ed89894 Hard code font inches 2021-02-08 07:01:26 -05:00
Tyler Goodlet 890f932400 Use through lot digits, drop YSticky 2021-02-08 07:00:51 -05:00
Tyler Goodlet bf66eb0b3d Support lot tick size (mostly for crypto) 2021-02-08 06:42:59 -05:00
Tyler Goodlet d7f806c57b Add arrowheads to labels
For labels that want it add nice arrow paths that point just over the
respective axis. Couple label text offset from the axis line based on
parent 'tickTextOffset' setting. Drop `YSticky` it was not enough
meat to bother with.
2021-02-08 06:40:11 -05:00
Tyler Goodlet c3fa31e731 Convert symbol type to use pydantic 2021-02-06 14:38:25 -05:00
Tyler Goodlet 0c184b1b41 Port ib to new provide new tick size fields in symbol info 2021-02-06 14:37:24 -05:00
Tyler Goodlet 69df73afc3 Deliver symbol info from kraken; start using pydantic 2021-02-06 14:23:27 -05:00
Tyler Goodlet a8c4829cb6 Start using `tick_size` throughout charting
The min tick size is the smallest step an instrument can move in value
(think the number of decimals places of precision the value can have).

We start leveraging this in a few places:
- make our internal "symbol" type expose it as part of it's api
  so that it can be passed around by UI components
- in y-axis view box scaling, use it to keep the bid/ask spread (L1 UI)
  always on screen even in the case where the spread has moved further
  out of view then the last clearing price
- allows the EMS to determine dark order live order submission offsets
2021-02-06 11:35:12 -05:00
Tyler Goodlet 03541bd368 Drop unneeded .hide(); add more comments 2021-01-26 22:16:18 -05:00
Tyler Goodlet cfc36e7928 Snap y-cursor-label to min tick 2021-01-26 22:15:45 -05:00
Tyler Goodlet 708086cbcb Convert contractsto dicts on errors 2021-01-26 13:34:49 -05:00
Tyler Goodlet 5a0612e6a8 Factor some line and label steps 2021-01-26 13:34:29 -05:00
Tyler Goodlet 8501a9be4f Lol actually fix screen wakeup lookup.. 2021-01-26 12:26:43 -05:00
Tyler Goodlet a232e8bc39 Display order size on order lines in order mode 2021-01-26 11:36:44 -05:00
Tyler Goodlet 25ec5faaef Drop removed show_label kwarg 2021-01-26 11:28:24 -05:00
Tyler Goodlet b9d9dbfc4a Support size fields on order lines; avoid overlap with L1 lines 2021-01-26 11:27:50 -05:00
Tyler Goodlet 990c3a1eac Try out 3 ticks away as limit submission 2021-01-26 11:26:30 -05:00
Tyler Goodlet cc5af7319f Slightly lighter sell red, try to fix screen stuff... 2021-01-22 23:02:23 -05:00
Tyler Goodlet 18fafb501d Use dashed lines for dark orders 2021-01-22 23:01:12 -05:00
Tyler Goodlet 4b2161a37b Use 2 min-ticks offset for dark orders 2021-01-22 23:00:01 -05:00
Tyler Goodlet f072e2551b Snap y-axis crosshair to min tick(s) 2021-01-22 22:59:00 -05:00
Tyler Goodlet 50d2d8517b Add support for dotted style level lines 2021-01-22 22:57:42 -05:00
Tyler Goodlet 92efb8fd8e Expect new init message in feed from brokers 2021-01-22 22:56:42 -05:00
Tyler Goodlet b4a4f12aa4 Send init message with kraken 2021-01-22 22:55:49 -05:00
Tyler Goodlet 10e47e349c Include symbol deats in feed init message from ib
Async spawn a deats getter task whenever we load a symbol data feed.
Pass these symbol details in the first message delivered by the feed at
open. Move stream loop into a new func.
2021-01-22 17:11:53 -05:00
Tyler Goodlet 5327d7be5e Add screen acquire timeout loop 2021-01-22 16:46:39 -05:00
Tyler Goodlet f82127de31 Add "live order" submission using ctl-<action key> 2021-01-19 20:48:58 -05:00
Tyler Goodlet 7811119736 Support toggling level line highlighting 2021-01-19 20:47:55 -05:00
Tyler Goodlet 149820b3b0 Get "dark (order) mode" workin!
Basically a stop limit mode where the dirty execution-condition deats
are entirely held client side away from the broker. For now, there's
a static order size setting and a 0.5% limit setting relative to the
trigger price. Swap to using 'd' for dump and 'f' for fill - they're
easier for use with ctrl (which is used now to submit orders directly to
broker - ala "live (order) mode"). Still more kinks to work out with too
fast cancelled orders and alerts but we're getting there.
2021-01-19 16:58:01 -05:00
Tyler Goodlet 794665db70 Drop log msg 2021-01-18 20:28:52 -05:00
Tyler Goodlet e6724b6559 Move order mode handling into charting code 2021-01-18 20:28:37 -05:00
Tyler Goodlet f3ae8db04b Big refactor; start paper client 2021-01-18 19:56:35 -05:00
Tyler Goodlet 2bf95d7ec7 Fix clients map typing annot 2021-01-15 21:10:08 -05:00
Tyler Goodlet 5acd780eb6 Get live mode correct and working 2021-01-15 21:10:08 -05:00
Tyler Goodlet 3e959ec260 Add fill handler to order mode 2021-01-15 21:10:08 -05:00
Tyler Goodlet bdc02010cf Finally, sanely normalize local trades event data 2021-01-15 21:10:08 -05:00
Tyler Goodlet c835cc10e0 Get "live" order mode mostly workin 2021-01-15 21:10:08 -05:00
Tyler Goodlet ee8caa80d4 Add order cancellation and error support 2021-01-15 21:10:08 -05:00
Tyler Goodlet 140f3231e7 Add basic client-side order entry to EMS 2021-01-15 21:10:08 -05:00
Tyler Goodlet f9d4df7378 Start higher level order mode API 2021-01-15 21:10:08 -05:00
Tyler Goodlet 53c0816c5f Add color properties for level line and label 2021-01-15 21:10:08 -05:00
Tyler Goodlet c1266a7a1d Add buy/sell colors 2021-01-15 21:10:08 -05:00
Tyler Goodlet 12aebcc89c Expose "proxy" api a little better 2021-01-15 21:10:08 -05:00
Tyler Goodlet e51670a573 Try dynamically loading screen 2021-01-15 21:10:08 -05:00
Tyler Goodlet 5503a5705a Drop old line 2021-01-15 21:10:08 -05:00
Tyler Goodlet 3e7057d247 Use feed's trade streamin in ems 2021-01-15 21:10:08 -05:00
Tyler Goodlet 611486627f Cleaning 2021-01-15 21:10:08 -05:00
Tyler Goodlet bd180a3482 Add trades data stream routine to Feed 2021-01-15 21:10:08 -05:00
Tyler Goodlet 280739b51a Add trades data streaming support 2021-01-15 21:10:08 -05:00
Tyler Goodlet 620f5fee6e Wishful thinking with conditional mngrs 2021-01-15 21:10:08 -05:00
Tyler Goodlet 39e4953a6a Get order cancellation working 2021-01-07 22:08:25 -05:00
Tyler Goodlet dba8457be9 Trigger kraken sample increment after startup 2021-01-07 12:17:10 -05:00
Tyler Goodlet 282cc85ba0 Create an "order mode"
Our first major UI "mode" (yes kinda like the modes in emacs) that has
handles to a client side order book api, line and arrow editors, and
interacts with a spawned `emsd` (the EMS daemon actor).

Buncha cleaning and fixes in here for various thingers as well.
2021-01-07 12:03:18 -05:00
Tyler Goodlet 8d66a17daf Add a "lines editor" api/component 2021-01-05 13:37:03 -05:00
Tyler Goodlet 268f207a6c Shadow 'close' field with 'last' 2021-01-05 08:02:48 -05:00
Tyler Goodlet 24536ad769 Get roundtrip alert uuids workin; stage order book api 2021-01-05 08:02:14 -05:00
Tyler Goodlet d0a3deae09 Pass symbol type further down chart stack 2021-01-04 14:46:47 -05:00
Tyler Goodlet 4d6b1d4bb1 Add brokers list field to symbol type 2021-01-04 14:45:59 -05:00
Tyler Goodlet 3c424a153f Port to new `Portal.run()` api 2021-01-04 14:45:34 -05:00
Tyler Goodlet 267c8c6bd3 Go back to manual label contents check for now 2021-01-04 14:45:12 -05:00
Tyler Goodlet 9478adf600 Use event sync for increment task launch 2021-01-04 14:44:39 -05:00
Tyler Goodlet c7ff0804db Graph snap quote immediately on ib spin up 2021-01-04 14:43:59 -05:00
Tyler Goodlet c030b63101 Rejig state with dataclasses; prep for numba 2021-01-04 14:42:35 -05:00
Tyler Goodlet 7b5a72909e Start a "real" alert looking msg 2021-01-03 17:23:45 -05:00
Tyler Goodlet 616a74865b Better highlighted yellow 2021-01-03 17:23:23 -05:00
Tyler Goodlet 6e2328d351 More comments? 2021-01-03 17:23:06 -05:00
Tyler Goodlet a3468fb915 Barebones level based alerts are working! 2021-01-03 17:19:16 -05:00
Tyler Goodlet 97b2f86cfe Add preliminary support for alert line management 2021-01-03 11:12:51 -05:00
Tyler Goodlet 88d48bd188 Port to `Cursor` 2021-01-03 11:10:08 -05:00
Tyler Goodlet 08aa5984ec Rename crosshair (type) to cursor
Since the "crosshair" is growing more and more UX implementation details
it probably makes sense to call it what it is; a python level mouse
abstraction. Add 2 internal sets: `_hovered` for allowing mouse hovered
objects to register themselves to other cursor aware components, and
`_trackers` for allowing scene items to "track" cursor movements via
a `on_tracked_source()` callback.
2021-01-03 10:46:28 -05:00
Tyler Goodlet 14dad08d98 Extend level line interaction
Support tracking the mouse cursor using a new `on_tracked_sources()`
callback method. Make hovered highlight a bit thicker and highlight when
click-dragged. Add a delete method for removing from the scene along
with label.
2021-01-03 10:43:53 -05:00
Tyler Goodlet edbbcbf954 Add alert yellow 2021-01-03 10:39:06 -05:00
Tyler Goodlet d492f5c35a Define our own mouse clicked handler 2021-01-01 17:49:23 -05:00
Tyler Goodlet a55d72f8d6 Create and "EMS" module for order execution/routing actor(s) 2021-01-01 17:49:02 -05:00
Tyler Goodlet 80d48e5ece Dynamically override .boundingRect() after startup 2021-01-01 13:23:05 -05:00
Tyler Goodlet e474d8c309 Remove horizontal crosshair on "a" hotkey 2021-01-01 13:05:50 -05:00
Tyler Goodlet 7a53f19eeb Highlight level line label on hover 2021-01-01 13:05:16 -05:00
Tyler Goodlet d602cbc985 Avoid active_plot race 2021-01-01 12:59:31 -05:00
Tyler Goodlet bd85214017 Add draft order actor architecture 2021-01-01 12:40:05 -05:00
Tyler Goodlet 5fddb581ab Kill backfiller on "no history" error 2021-01-01 12:34:50 -05:00
Tyler Goodlet 81b10b9dfc Add initial y-axis zoom 2020-12-30 12:55:02 -05:00
Tyler Goodlet f3a0b1e91e Use pixel buffers on axis labels 2020-12-29 18:05:36 -05:00
Tyler Goodlet 1e09b0f08f Type annot paint methods 2020-12-29 18:05:36 -05:00
Tyler Goodlet 98c3bb8aee Add a pyqtgraph profiling toggle to chart CLI 2020-12-29 18:05:36 -05:00
Tyler Goodlet a68fff4139 Break specialized graphics into specific mods 2020-12-29 18:05:36 -05:00
Tyler Goodlet 575b3a0605 Adjust imports 2020-12-29 18:05:36 -05:00
Tyler Goodlet 916396fbfe Move fast curve graphics to new mod 2020-12-29 18:05:36 -05:00
Tyler Goodlet 19e3db8f61 Move OHLC items into new module 2020-12-29 18:05:36 -05:00
Tyler Goodlet b4c28cb086 Start a new graphics sub-package 2020-12-29 18:05:36 -05:00
Tyler Goodlet 5d30f351af Remove use of `tractor.run()` 2020-12-29 18:05:36 -05:00
Tyler Goodlet d7f80d8ddb Add note about shm limit 2020-12-29 18:05:36 -05:00
Tyler Goodlet b467e8fd8d Try cache mode on a bunch of "static" graphics 2020-12-29 18:05:36 -05:00
Tyler Goodlet 588213a230 Add an experimental "fast appendable curve" graphic 2020-12-29 18:05:36 -05:00
Tyler Goodlet 93e76fa12c Comment some unneeded PDI optimization flags 2020-12-29 18:05:36 -05:00
Tyler Goodlet cac797a7fc Add initial pixel buffer caching usage
Leverages `QGraphicsItem.cacheMode` to speed up interactivity via
less `.paint()` calls (on mouse interaction) and redraws of the
underlying path when there are no transformations (other then a shift).
In order to keep the "flat bar on new time period" UX, a couple special
methods have to be triggered to get a redraw of the pixel buffer when
appending new data.

Use `QPainterPath.controlPointRect()` over `.boundingRect()` since
supposedly it's a lot faster. Drop all use of `QPicture` (since it seems
to conflict with the pixel buffer stuff?) and it doesn't give any
measurable speedup when drawing the "last bar" lines.

Oh, and add some profiling for now.
2020-12-29 18:05:36 -05:00
Tyler Goodlet bd73d02cfb Avoid loading volume FSPs on symbols without any data 2020-12-28 14:43:17 -05:00
Tyler Goodlet 42761438f6 Pass backfiller explicit symbol str, don't require volume ticks 2020-12-26 18:04:32 -05:00
Tyler Goodlet bc96c5847c Port to new tractor api 2020-12-21 13:02:43 -05:00
Tyler Goodlet 714c757e3e Add vwap back to fsp conf on feature branch 2020-12-21 13:02:43 -05:00
Tyler Goodlet 48da729364 Use .shield() meth name from tractor 2020-12-21 13:02:43 -05:00
Tyler Goodlet c01382294e Add signal backfilling via trio task respawn 2020-12-21 13:02:43 -05:00
Tyler Goodlet e89d3f9560 Use `numpy.divide()` to avoid divide-by-zero 2020-12-21 13:02:43 -05:00
Tyler Goodlet 7c7b31ebbe Break hist calc into wap func, use hlc3. 2020-12-21 13:02:43 -05:00
Tyler Goodlet 33515f45cc Add vwap to exposed fsp map 2020-12-21 13:02:43 -05:00
Tyler Goodlet ef2be16d97 Add initial tina (ohl3) vwap fsp 2020-12-21 13:02:43 -05:00
Tyler Goodlet 833a442ac0 Disable vwap in conf, feature delay 2020-12-19 16:57:58 -05:00
Tyler Goodlet f27d639552 Port kraken to declare "wap" field 2020-12-19 16:53:51 -05:00
Tyler Goodlet b72d7d3085 Drop profile calls on OHLC bars for now 2020-12-19 16:52:04 -05:00
Tyler Goodlet df686755da Drop legacy "historical" QPicture cruft 2020-12-19 16:51:11 -05:00
Tyler Goodlet 618c2f8e0a More general salutation 2020-12-19 16:51:03 -05:00
Tyler Goodlet db6f77481b Stick with slightly smaller fonts 2020-12-19 16:50:54 -05:00
Tyler Goodlet 7ce27107df Fix axes for shm primary indexing 2020-12-19 16:50:49 -05:00
Tyler Goodlet c8537d59a8 Port charting to new shm primary indexing 2020-12-19 16:50:38 -05:00
Tyler Goodlet 9930430721 Close app on last window exit
Use a system triggered SIGINT on app close to tear down the streaming
stack and terminate the `trio`/`tractor` runtimes deterministically.
2020-12-19 16:50:29 -05:00
Tyler Goodlet 599b5276b4 Port data apis to not touch primary index 2020-12-19 16:50:20 -05:00
Tyler Goodlet fda9fcbc55 Add historical backfilling to ib backend 2020-12-19 16:50:08 -05:00
Tyler Goodlet 6d50ad75a7 Ensure right bar x index is an int 2020-12-19 16:49:57 -05:00
Tyler Goodlet 2568a2d2e9 First draft, make graphics work on shm primary index
This is a bit hacky (what with array indexing semantics being relative
to the primary index's "start" value but it works. We'll likely want
to somehow wrap this index finagling into an API soon.
2020-12-19 16:49:43 -05:00
Tyler Goodlet 02b7d6cd19 Add prepend support to shm system 2020-12-19 16:49:35 -05:00
Tyler Goodlet 9710685508 Left align yaxis label 2020-12-19 16:49:27 -05:00
Tyler Goodlet 1f8f2eb8b3 Font size tweaks for low dpi 2020-12-19 16:06:54 -05:00
Tyler Goodlet 247b5fa2ec Tidy up doc string 2020-12-19 16:06:28 -05:00
Tyler Goodlet 3e16840566 Attempt to add numba typing and use `QGraphicsPathItem`
Failed at using either.

Quirks in numba's typing require specifying readonly arrays by
composing types manually.

The graphics item path thing, while it does take less time to write on
bar appends, seems to be slower in general in calculating the
``.boundingRect()`` value. Likely we'll just add manual max/min tracking
on array updates like ``pg.PlotCurveItem`` to squeeze some final juices
on this.
2020-12-19 16:06:22 -05:00
Tyler Goodlet 949e9d6cd1 Drop commented pixmap cruft
See #124 as to why we'll probably never need this.
2020-12-19 16:06:07 -05:00
Tyler Goodlet f083f537b1 Get `QPainterPath` "append" working
Pertains further to #109.

Instead of redrawing the entire `QPainterPath` every time there's
a historical bars update just use `.addPath()` to slap in latest
history. It seems to work and is fast. This also seems like it will be
a great strategy for filling in earlier data, woot!
2020-12-19 16:05:59 -05:00
Tyler Goodlet 413c703e34 Draw bars using `QPainterPath` magic
This gives a massive speedup when viewing large bar sets (think a day's
worth of 5s bars) by using the `pg.functions.arrayToQPath()` "magic"
binary array writing that is also used in `PlotCurveItem`.  We're using
this same (lower level) function directly to draw bars as part of one
large path and it seems to be painting 15k (ish) bars with around 3ms
`.paint()` latency. The only thing still a bit slow is the path array
generation despite doing it with `numba`. Likely, either having multiple
paths or, only regenerating the missing backing array elements should
speed this up further to avoid slight delays when incrementing the bar
step.

This is of course a first draft and more cleanups are coming.
2020-12-19 16:05:53 -05:00
Tyler Goodlet 8aede3cbcb Add field diffing on failed push 2020-12-19 16:05:22 -05:00
Tyler Goodlet f9e4e9507d Tweak axis text offset and margins 2020-12-19 15:05:37 -05:00
Tyler Goodlet c625dc90f1 Use new global var stack from tractor 2020-12-19 15:05:29 -05:00
Tyler Goodlet 9572280553 Kill the tractor tree on window close.
This makes it so you don't have to ctrl-c kill apps.
Add in the experimental openGL support even though I'm pretty sure it's
not being used much for curve plotting (but could be wrong).
2020-12-19 15:05:21 -05:00
Tyler Goodlet bfcf5170dc Add commented ex. code for line price charts 2020-12-19 15:05:14 -05:00
Tyler Goodlet acf8aeb33e Allocate space for 2d worth of 5s bars 2020-12-19 15:05:03 -05:00
Tyler Goodlet daa429f7ca Put fsp plotting into a couple tasks, startup speedups.
Break the chart update code for fsps into a new task (add a nursery) in
new `spawn_fsps` (was `chart_from_fsps`) that async requests actor
spawning and initial historical data (all CPU bound work).  For multiple
fsp subcharts this allows processing initial output in parallel
(multi-core). We might want to wrap this in a "feed" like api
eventually. Basically the fsp startup sequence is now:
- start all requested fsp actors in an async loop and wait for
  historical data to arrive
- loop through them all again to start update tasks which do chart
  graphics rendering

Add separate x-axis objects for each new subchart (required by
pyqtgraph); still need to fix hiding unnecessary ones.
Add a `ChartPlotWidget._arrays: dict` for holding overlay data distinct
from ohlc. Drop the sizing yrange to label heights for now since it's
pretty much all gone to hell since adding L1 labels. Fix y-stickies to
look up correct overly arrays.
2020-12-19 15:04:51 -05:00
Tyler Goodlet 49699a16ff Skip base metrics on no basis 2020-12-17 10:50:05 -05:00
Tyler Goodlet af61611801 Add initial selection box interaction
Requires decent modification of the built-in ``ViewBox``.
We do away with the zoom functionality for now and instead just add
a label full of some simple stats on the bounded data.
2020-11-08 16:15:34 -05:00
Tyler Goodlet 1972740d0c Make salotz stop grumbling like an old man 2020-11-06 15:35:10 -05:00
Tyler Goodlet 0f458f8263 Add min tick setting to axis type 2020-11-06 15:24:01 -05:00
Tyler Goodlet c1109ee3fb Add license headers to pertinent files 2020-11-06 12:23:14 -05:00
Tyler Goodlet be4a3df7ba Add L1 spread streaming to kraken 2020-11-06 11:35:40 -05:00
Tyler Goodlet 043bc985df Configure L1 queue size precisions from history 2020-11-06 11:35:10 -05:00
Tyler Goodlet e27fece4e6 Add L1 queue size precision controls 2020-11-06 11:34:32 -05:00
Tyler Goodlet 205bedce85 Spec dpi aware font size in inches 2020-11-05 20:32:35 -05:00
Tyler Goodlet 1e491fb1bb Use pyqtgraph default pen for level lines 2020-11-05 13:23:29 -05:00
Tyler Goodlet cc88300ac5 Fix L1 updates to be like TWS
I think this gets us to the same output as TWS both on booktrader and
the quote details pane. In theory there might be logic needed to
decreases an L1 queue size on trades but can't seem to get it without
getting -ves displayed occasionally - thus leaving it for now.

Also, fix the max-min streaming logic to actually do its job, lel.
2020-11-05 12:08:29 -05:00
Tyler Goodlet db075b81ac Specialize `LevelLabel` for orientation-around-axis gymnastics 2020-11-05 12:08:02 -05:00
Tyler Goodlet 9c3850874d Add all L1 tick types for ib 2020-11-05 08:18:55 -05:00
Tyler Goodlet f438139ad7 Update L1 labels in price loop 2020-11-03 22:03:49 -05:00
Tyler Goodlet 73e54a2259 Add L1 labels wrapper type
Start a simple API for L1 bid/ask labels.
Make `LevelLabel` draw a line above/below it's text (instead of the
rect fill we had before) since it looks much simpler/slicker.
Generalize the label text orientation through bounding rect
geometry positioning.
2020-11-03 19:48:27 -05:00
Tyler Goodlet 987c13c584 Classify L1 tick types 2020-11-03 16:22:04 -05:00
Tyler Goodlet a5d5208cfa Add sticky "orientation", allow overriding label draw instructions. 2020-11-03 16:21:21 -05:00
Tyler Goodlet e65f511648 Draw flat line on every new time step
Until we get a better datum "cursor" figured out just draw the flat bar
despite the extra overhead. The reason to do this in 2 separate calls is
detailed in the comment but basic gist is that there's a race between
writer and reader of the last shm index.

Oh, and toss in some draft symbol search label code.
2020-11-03 12:25:08 -05:00
Tyler Goodlet d92e02db86 Add back min window size i guess 2020-11-03 12:22:57 -05:00
Tyler Goodlet 22f1b56b36 Always update left (open) arm 2020-11-03 08:15:00 -05:00
Tyler Goodlet 1640906b09 Write shm volume (facepalm), update open=close on first volume 2020-11-03 08:14:37 -05:00
Tyler Goodlet b23e459027 Cleanup unneeded commented stuff 2020-11-02 15:43:19 -05:00
Tyler Goodlet 119196f2ff Scale level label correctly to small(er) fonts
Not sure what fixed it exactly, and I guess we didn't need any relative
DPI scaling factor after all. Using the 3px margin on the level label
seems to make it look nice for any font size (i think) as well.

Gonna need some cleanup after this one.
2020-11-02 15:27:48 -05:00
Tyler Goodlet 96f700a762 Add level line type with custom label 2020-11-02 13:33:19 -05:00
Tyler Goodlet 9e7aa3f9bf Add a dpi aware font wrapper type 2020-11-02 12:02:05 -05:00
Tyler Goodlet 307c501763 Add symbol field to ib quotes 2020-10-29 17:21:41 -04:00
Tyler Goodlet da0789e184 Add symbol field to kraken quotes 2020-10-29 17:08:25 -04:00
Tyler Goodlet 416f027c5f Flip contents label stuff into a type 2020-10-29 17:08:03 -04:00
Tyler Goodlet 68304b79bc More thematic max datums on screen 2020-10-28 09:28:37 -04:00
Tyler Goodlet 031eab28c7 Adjust contents label font for DPI 2020-10-28 08:52:08 -04:00
Tyler Goodlet 20a4aed672 Update font metrics after dpi calc; facepalm. 2020-10-28 08:12:56 -04:00
Tyler Goodlet 751cca35e1 Attempt to calculate font size by DPI 2020-10-27 15:15:31 -04:00
Tyler Goodlet 23672fc22b Rework axes types, sizing stuff
Make our own ``Axis`` and have it call an impl specific ``.resize()``
such that different axes can size to their own spec. Allow passing in a
"typical maximum value string" which will be used by default for sizing
the axis' minor dimension; a common value should be passed to all axes
in a linked split charts widget. Add size hinting for axes labels such
that they can check their parent (axis) for desired dimensions if
needed.
2020-10-27 10:50:28 -04:00
Tyler Goodlet 89d48afb6c Size axis labels based on text contents
Compute the size in pixels the label based on the label's contents.
Eventually we want to have an update system that can iterate through
axes and labels to do this whenever needed (eg. after widget is moved
to a new screen with a different DPI).
2020-10-26 23:34:48 -04:00
Tyler Goodlet 55f34dfed0 Start a profiling mod 2020-10-26 14:08:42 -04:00
Tyler Goodlet bed6a631c0 Don't pass color down to axis 2020-10-25 10:49:31 -04:00
Tyler Goodlet f32763d992 Only move x-axis sticky when we mouse-over a new index
Avoid drawing a new new sticky position if the mouse hasn't moved to the
next (rounded) index in terms of the scene's coordinates. This completes
the "discrete-ization" of the mouse/cursor UX.

Finalizing this feature helped discover and solve
pyqtgraph/pyqtgraph#1418 which masssively improves interaction
performance throughout the whole lib!

Hide stickys on startup until cursor shows up on plot.
2020-10-24 20:18:21 -04:00
Tyler Goodlet ece57b2a1d Rename our main color 2020-10-24 20:18:03 -04:00
Tyler Goodlet 94a8ee6270 Optimize axis labels using `QPicture`
This is likely a marginal improvement but is slightly less execution and
adds a coolio black border around the label. Drop all the legacy code
from quantdom which was quite a convoluted mess for "coloring".
Had to tweak sticky offsets to get the crosshair to line up right; not
sure what that's all about yet.
2020-10-24 20:12:12 -04:00
Tyler Goodlet 13f32acfdf Only update history on bar increment
With the improved update logic on `BarsItems` it doesn't seem to be
necessary. Remove y sticky for overlays for now to avoid clutter that
looks like double draws when the last overlay value is close to the last
price.
2020-10-22 21:21:14 -04:00
Tyler Goodlet 8eb4344d86 More "thematic" default view values ;) 2020-10-22 20:42:46 -04:00
Tyler Goodlet 8c25892521 Fix (really sidestep) flat bar rendering issue(s)
It seems a plethora of problems (including drawing performance) are due
to trying to hack around the strange rendering bug in Qt with `QLineF`
with y1 == y2. There was all sorts of weirdness that would show up with
trying (a hack) to just set all 4 points to the same value including
strange infinite diagonal ghost lines randomly on charts. Instead, just
place hold these flat bar's 'body' line with a `None` and filter the
null values out before calling `QPainter.drawLines()`. This results
in simply no body lines drawn for these datums. We can probably `numba`
the filtering too if it turns out to be a bottleneck.
2020-10-22 20:35:51 -04:00
Tyler Goodlet 7be624de39 Implement `tickStrings` for price axis; use float_digits() 2020-10-22 20:22:21 -04:00
Tyler Goodlet 18dc809acb Add naive digits count routine 2020-10-22 14:05:35 -04:00
Tyler Goodlet f2c4a46c94 Center bars around index, adjust curves back to match... 2020-10-21 11:19:41 -04:00
Tyler Goodlet cd828db9e9 Show 24 bars to left on startup 2020-10-21 10:51:54 -04:00
Tyler Goodlet 875bc8be24 Add line dots cursors to curves by default 2020-10-21 10:46:56 -04:00
Tyler Goodlet 1f6b5da17e Add support for curve "cursors" using a filled dot
Add a new graphic `LineDot` which is a `pg.CurvePoint` that draws
a simple filled dot over a curve at the specified index.

Add support for adding these cursor-dots to the crosshair/mouse through
a new `CrossHair.add_curve_cursor()`. Discretized the vertical line
updates on the crosshair such that it's only drawn in the middle of
the current bar in the main chart.
2020-10-21 10:40:51 -04:00
Tyler Goodlet 88583d999a Add "follow mode"
Makes the chart act like tws where each new time step increment the
chart shifts to the right so that the last bar stays in place. This
gets things looking like a proper auto-trading UX.

Added a couple methods to ``ChartPlotWidget`` to make this work:
- ``.default_view()`` to set the preferred view based on user settings
- ``.increment_view()`` to shift the view one time frame right

Also, split up the `.update_from_array()` method to be curve/ohlc
specific allowing for passing in a struct array with a named field
containing curve data more straightforwardly. This also simplifies the
contest label update functions.
2020-10-20 09:13:27 -04:00
Tyler Goodlet 1902507703 Change scroll "center" to rightmost bar on screen 2020-10-19 21:32:50 -04:00
Tyler Goodlet c57f678295 Fix contents labels issues
Lookup overlay contents from the OHLC struct array (for now / to make
things work) and fix anchoring logic with better offsets to keep
contents labels super tight to the edge of the view box. Unfortunately,
had to hack the label-height-calc thing for avoiding overlap of graphics
with the label; haven't found a better solution yet and pyqtgraph seems
to require more rabbit holing to figure out something better. Slap in
some inf lines for over[sold/bought] rsi conditions thresholding.
2020-10-19 14:18:06 -04:00
Tyler Goodlet 851104dd31 Add an inf horizontal line helper 2020-10-19 14:01:57 -04:00
Tyler Goodlet 1706b67e00 Note the issues with the shared fsp array index.. 2020-10-19 14:01:25 -04:00
Tyler Goodlet 32974a118c Add hidpi comments, 300 bars in view at startup 2020-10-19 11:37:50 -04:00
Tyler Goodlet d3dc8fb219 Differentiate array schema by close field 2020-10-19 11:37:28 -04:00
Tyler Goodlet c7d5ea6e15 Fix static yrange and last bar double draw issues 2020-10-16 12:18:14 -04:00
Tyler Goodlet fc23b2180d Pass through fonts to axes 2020-10-16 12:15:33 -04:00
Tyler Goodlet 58d3234f74 Drop lingering print 2020-10-16 12:15:07 -04:00
Tyler Goodlet f4c38621d5 Add a default "bars from right" style setting 2020-10-15 15:08:56 -04:00
Tyler Goodlet 6f429b1104 These seem to be "faster" crosshair settings? 2020-10-15 15:08:16 -04:00
Tyler Goodlet cb72662350 Add warnings for shm cache misses 2020-10-15 15:07:56 -04:00
Tyler Goodlet 454b445b4b Add better shared mem writer task checking
If you have a common broker feed daemon then likely you don't want to
create superfluous shared mem buffers for the same symbol. This adds an
ad hoc little context manger which keeps a bool state of whether
a buffer writer task currently is running in this process. Before we
were checking the shared array token cache and **not** clearing it when
the writer task exited, resulting in incorrect writer/loader logic on
the next entry..

Really, we need a better set of SC semantics around the shared mem stuff
presuming there's only ever one writer per shared buffer at given time.
Hopefully that will come soon!
2020-10-15 15:02:42 -04:00
Tyler Goodlet db273e1cd7 Up the mouse re-draw rate limit 2020-10-12 09:36:46 -04:00
Tyler Goodlet 18097fc33b Scale for hidpi pixmaps too 2020-10-02 12:13:50 -04:00
Tyler Goodlet 2302e59f1d 3k bars for now, ignore rtTime 2020-10-02 12:13:50 -04:00
Tyler Goodlet 8d9a6845c6 Add a naive maxmin calc to avoid frequent resizes
If we know the max and min in view then on datum updates we can avoid
resizing the y-range when a new max/min has not yet arrived.

This adds a very naive numpy calc in the drawing thread which we can
likely improve with a more efficient streaming alternative which can
also likely be run in a fsp subactor. Also, since this same calc is
essentially done inside `._set_yrange()` we will likely want to allow
passing the result into the method to avoid duplicate work.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 6d5ccc6c3f Specify font size in pixels 2020-10-02 12:13:50 -04:00
Tyler Goodlet 8276b02f92 Further label and axis sizing tweaks for hidpi 2020-10-02 12:13:50 -04:00
Tyler Goodlet e524ee9045 Resize everything with HiDPI scaling on 2020-10-02 12:13:50 -04:00
Tyler Goodlet bceeaa56ff Drop ringbuf, didn't end up using 2020-10-02 12:13:50 -04:00
Tyler Goodlet acc8dd66f5 Add data._normalize.py ... 2020-10-02 12:13:50 -04:00
Tyler Goodlet bc65040601 Add shm support to kraken backend 2020-10-02 12:13:50 -04:00
Tyler Goodlet d4eb5ccca4 Handle vwap overlay with shm 2020-10-02 12:13:50 -04:00
Tyler Goodlet 8a4528c006 Always ask backend for ohlc dtype 2020-10-02 12:13:50 -04:00
Tyler Goodlet 47d4ec5985 Move _source under data package 2020-10-02 12:13:50 -04:00
Tyler Goodlet 8e2e695ba8 Revert project name removal; breaks shit elsewhere somehow.. 2020-10-02 12:13:50 -04:00
Tyler Goodlet 155c3eef2a Convert timeit thing to use print() 2020-10-02 12:13:50 -04:00
Tyler Goodlet 8832804bab Sub each new symbol to shm incrementing 2020-10-02 12:13:50 -04:00
Tyler Goodlet e3e219aa4b Add multi-symbol-buffer increment support 2020-10-02 12:13:50 -04:00
Tyler Goodlet 41e85ccaa9 Break wma calc into sync func 2020-10-02 12:13:50 -04:00
Tyler Goodlet 3f0e175011 Get bar oriented RSI working correctly 2020-10-02 12:13:50 -04:00
Tyler Goodlet 268e748417 Drop extra prefix in logs 2020-10-02 12:13:50 -04:00
Tyler Goodlet bfa7839370 Adopt official color 2020-10-02 12:13:50 -04:00
Tyler Goodlet 2fcbefa6e1 Use shm in fsp cascading
This kicks off what will be the beginning of hopefully a very nice
(soft) real-time financial signal processing system. We're keeping the
hack to "time align" curves (for now) with the bars for now by slapping
in an extra datum at index 0.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 4383579cd0 Use shm array in chart-fsp task
Just like for the source OHLC, we now have the chart parent actor create
an fsp shm array and use it to read back signal data for plotting.
Some tweaks to get the price chart (and sub-charts) to load historical
datums immediately instead of waiting on an initial quote.
2020-10-02 12:13:50 -04:00
Tyler Goodlet ba4261f974 Add timeit prints 2020-10-02 12:13:50 -04:00
Tyler Goodlet 561cafbe55 Another black 2020-10-02 12:13:50 -04:00
Tyler Goodlet efb52f2292 Make shared array buffer incrementer a message pub
Drop ctx manager api and use `tractor.msg.pub`.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 373ff90229 Only need UTC offset hacking if time w broker is messed.. 2020-10-02 12:13:50 -04:00
Tyler Goodlet d93ce84a99 Variety of IB backend improvements
- Move to new shared mem system only writing on the first (by process)
  entry to `stream_quotes()`.
- Deliver bars before first quote arrives so that chart can populate and
  then wait for initial arrival.
- Allow caching clients per actor.
- Load bars using the same (cached) client that starts the quote stream
  thus speeding up initialization.
2020-10-02 12:13:50 -04:00
Tyler Goodlet b1093dc71d Add a `data.Feed` type
Wraps the growing tuple of items being delivered by `open_feed()`.
Add lazy loading of the broker's signal step stream with
a `Feed.index_stream()` method.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 38469bd6ef Slight rework: shm API
Add an internal `_Token` to do interchange (un)packing for passing
"references" to shm blocks between actors.  Part of the token involves
providing the `numpy.dtype` in a cross-actor format.  Add a module
variable for caching "known tokens" per actor.  Drop use of context
managers since they tear down shm blocks too soon in debug mode and
there seems to be no reason to unlink/close shm before the process has
terminated; if code needs it torn down explicitly, it can.
2020-10-02 12:13:50 -04:00
Tyler Goodlet cd540fd07e Cleanups 2020-10-02 12:13:50 -04:00
Tyler Goodlet 6fa4f6e943 Port charts to new shm arrays 2020-10-02 12:13:50 -04:00
Tyler Goodlet f872fbecf8 Hook IB up to shared memory system
Adjust the `data.open_feed()` api to take a shm token so the
broker-daemon can attach a previously created (by the parent actor) mem
buf and push real-time tick data. There's still some sloppiness here in
terms of ensuring only one mem buf per symbol (can be seen in
`stream_quotes()`) which should really managed at the data api level.
Add a bar incrementing stream-task which delivers increment msgs to any
consumers.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 17491ba819 Disconnect stdlib's resource_tracker, fix .push()
Logic in `SharedArray.push()` was totally wrong.
Remove all the `multiprocessing.resource_tracker` crap such that we
aren't loading an extra process at every layer and we don't get tons of
errors when cleaning on in an SC way.
2020-10-02 12:13:50 -04:00
Tyler Goodlet 712e36b9d5 First draft of a shared numpy array sub-system
This adds a shared memory "incrementing array" sub-sys interface
for single writer, multi-reader style data passing. The main motivation
is to avoid multiple copies of the same `numpy` array across actors
(plus now we can start being fancy like ray).

There still seems to be some odd issues with the "resource tracker"
complaining at teardown (likely partially to do with SIGINT stuff) so
some further digging in the stdlib code is likely coming.

Pertains to #107 and #98
2020-10-02 12:13:50 -04:00
Tyler Goodlet 07beec59bf Hopefully fix datum offset on signal sub-plots
Added a comment to clarify, ish.
Add `ChartPlotWidget._overlays` as registry of curves added on top of
main graphics. Hackishly (ad-hoc-ishly?) update the curve assuming the
data resides in the same `._array` for now (which it does for historical
vwap).
2020-10-02 12:13:28 -04:00
Tyler Goodlet 2cc2b32805 Fix dbz with `np.divide()` 2020-10-02 12:13:28 -04:00
Tyler Goodlet eb5d64ceef Add support for overlay curves and fixed y-range
Allow passing a fixed ylow, yhigh tuple to `._set_yrange()` which avoids
recomputing the range from data if desired (eg. rsi-like bounded
signals). Add support for overlay curves to the OHLC chart and add basic
support to brokers which provide a historical 'vwap`. The data array
increment logic had to be tweaked to copy the vwap from the last bar.

Oh, and hack the subchart curves with two extra prepended datums to make
them align "better" with the ohlc main chart; need to talk to
`pyqtgraph` core about how to do this more correctly.
2020-10-02 12:13:28 -04:00
Tyler Goodlet e91ba55d68 Always draw any history bars on update 2020-10-02 12:13:28 -04:00
Tyler Goodlet a4a5bff3fa Yes, even more grays 2020-10-02 12:13:28 -04:00
Tyler Goodlet da2325239c Copy non-base dtype fields on bar increment 2020-10-02 12:13:28 -04:00
Tyler Goodlet 80f191c57d Adjust range logic to avoid overlap with labels
By mapping any in view "contents labels" to the range of the
``ViewBox``'s data we can avoid having graphics overlap with labels.
Take this approach instead of specifying a min y-range using the std
and activate the range compute on resize and mouser scrolling.
Also, add y-sticky update for signal plots.
2020-10-02 12:13:28 -04:00
Tyler Goodlet fc0a03d597 Handle OHLC *and* signal indexing 2020-10-02 12:13:28 -04:00
Tyler Goodlet 9a59f2408d Start fsp subpackage, separate momo stuff 2020-10-02 12:13:28 -04:00
Tyler Goodlet 7d24e8eeb0 First draft of real-time rsi using numba 2020-10-02 12:13:28 -04:00
Tyler Goodlet 9d8a867767 Bar graphics update speed improvements
Use two separate `QPicture` instances:
- one for the 3 lines for the last bar
- one for all the historical bars lines

On price changes update the last bar and only update historical bars
when the current bar's period expires (when a new bar is "added").
Add a flag `just_history` for this  `BarItems.draw_lines()`.
Also, switch the internal lines array/buffer to a 2D numpy array to avoid
the type-cast step and instead just flatten using `numpy.ravel()`.

Overall this should avoid the problem of draws getting slower over time
as new bars are added to the history since price updates only redraw
a single bar to the "last" `QPicture` instance. Ideally in the future we
can make the `history` `QPicture` a `QPixmap` but it looks like this
will require some internal work in `pyqtgraph` to support it.
2020-10-02 12:13:28 -04:00
Tyler Goodlet b1591e3ee1 Start mucking with faster bars updates
Use a ``rec2array`` struct array converter to generate lines sequence
faster. Start looking into using a `QPixmap` to avoid redrawing all
bars every update.
2020-10-02 12:13:28 -04:00
Tyler Goodlet 0e513599eb Info log fsp output for now 2020-10-02 12:13:28 -04:00
Tyler Goodlet f1b72dfd6b Better bg color, tweak margins. 2020-10-02 12:13:28 -04:00
Tyler Goodlet 17d205f773 Add proper x-axis time-stamping 2020-10-02 12:13:28 -04:00
Tyler Goodlet ea2a675adf Use dashed crosshair, simplify x-axis alloc 2020-10-02 12:13:28 -04:00
Tyler Goodlet 387a696232 Even more colors 2020-10-02 12:13:28 -04:00
Tyler Goodlet fca6257152 Use dashed lines for crosshair 2020-10-02 12:13:28 -04:00
Tyler Goodlet 7a245ddda4 Add and update y-sticky labels on new price data 2020-10-02 12:13:28 -04:00
Tyler Goodlet 363d4cf609 Start color map 2020-10-02 12:13:28 -04:00
Tyler Goodlet d7466a58b4 Add updateable y-sticky label 2020-10-02 12:13:28 -04:00
Tyler Goodlet 8d29338174 Cleanup latency tracker 2020-10-02 12:13:28 -04:00
Tyler Goodlet 58b2e7e395 Refer to main chart's data for date axis 2020-10-02 12:13:28 -04:00
Tyler Goodlet f46fa99a6e Add "contents" labels to charts
Add a default "contents label" (eg. OHLC values for bar charts) to each
chart and update on crosshair interaction.

Few technical changes to make this happen:
- adjust bar graphics to have the HL line be in the "middle" of the
  underlying arrays' "index range" in the containing view.
- add a label dict each chart's graphics name to a label + update routine
- use symbol names instead of this "main" identifier crap for referring to
  particular price curves/graphics
2020-10-02 12:13:28 -04:00
Tyler Goodlet 61e460a422 Start brokers.api module 2020-10-02 12:13:28 -04:00
Tyler Goodlet fd21f4b0fe WIP initial draft of FSP subsystem
This is a first attempt at a financial signal processing subsystem which
utilizes async generators for streaming frames of numpy array data
between actors. In this initial attempt the focus is on processing price
data and relaying it to the chart app for real-time display. So far this
seems to work (with decent latency) but much more work is likely needed
around improving the data model for even better latency and less data
duplication.

Surprisingly (or not?) a lot of simplifications to the charting code
came out of this in terms of conducting graphics updates in streaming
tasks instead of hiding them inside the obfuscated mess that is the
Qt-style-inheritance-OO-90s-trash. The goal from here on wards will be
to enforce strict semantics around reading and writing of data such that
state is kept outside "object trees" as much as possible and streaming
function semantics guide our flow model. Unsurprisingly, this reduction
in "instance state" is happening wherever we use `trio` ;)

A little summary on the technical changes:
- not going to explain the fsp system yet; it's too nascent and
  probably going to get some heavy editing.
- drop any "update" methods from the `LinkedCharts` type since each
  sub-chart will have it's own update task and thus a separate update
  loop; further individual graphics (per chart) may eventually require
  this same design.
- delete `ChartView`; moved into separate mod.
- add "stream from fsp" task to start our foray into real-time actor
  processed numpy streaming.
2020-10-02 12:13:28 -04:00
Tyler Goodlet edb32e8c2b Drop weird chart type enum 2020-10-02 12:13:28 -04:00
Tyler Goodlet 04e21a96da Use partial, pass kwargs to `tractor._main()` 2020-10-02 12:13:28 -04:00
Tyler Goodlet a29b7d9be5 Start "interaction" module 2020-10-02 12:13:28 -04:00
Tyler Goodlet 8a46f8d6ed Port monitor to normalized streams 2020-10-02 12:13:28 -04:00
Tyler Goodlet 241b2374e8 Port `DataFeed` api to broker specific normalizer routine 2020-10-02 12:13:28 -04:00
Tyler Goodlet 9bbf0e0d7a Add a normalizer routine which emits quote differentials/ticks 2020-10-02 12:13:28 -04:00
Tyler Goodlet 81fb327fe1 Add `services` cmd for monitoring actors 2020-10-02 12:13:28 -04:00
Tyler Goodlet 65fb92eaff Flatten out chart tasks 2020-10-02 12:13:28 -04:00
Tyler Goodlet 6b572eb0ef Add ravel() reference link 2020-10-02 12:13:28 -04:00
Tyler Goodlet 971b871647 Handle "mouse-not-on-plot" edge cases 2020-10-02 12:13:28 -04:00
Tyler Goodlet b2506b04f6 Attempt more reliable chart startup
Wait for a first actual real-time quote before starting graphics update
tasks. Use the new normalized tick format brokers are expected to emit
as a `quotes['ticks']` list. Auto detect time frame from historical
bars.
2020-10-02 12:13:28 -04:00
Tyler Goodlet d81f6620f5 Passthrough loglevel from qtractor 2020-10-02 12:13:28 -04:00
Tyler Goodlet 2eea946e5b Drop forkserver usage.
We've got the sweet and realable `trio` spawner now :)
2020-10-02 12:13:28 -04:00
Tyler Goodlet 1a143f6b16 Pass piker log level through to tractor for chart app 2020-10-02 12:13:28 -04:00
Tyler Goodlet dc919fa676 Set tractor loglevel in cli config 2020-10-02 12:13:28 -04:00
Tyler Goodlet cb8215c203 Also log the payload 2020-10-02 12:13:28 -04:00
Tyler Goodlet 46c804db0b Support the `stream_quotes()` api in questrade backend 2020-10-02 12:13:28 -04:00
Tyler Goodlet ad519c10a9 Always just look up the current plot on mouse handling 2020-10-02 12:13:28 -04:00
Tyler Goodlet bbe02570b3 Allow for dynamically added plots
Add `ChartPlotWidget.add_plot()` to add sub charts for indicators which
can be updated independently. Clean up rt bar update code and drop some
legacy ohlc loading cruft.
2020-10-02 12:13:28 -04:00
Tyler Goodlet b4f1ec7960 Massively simplify the cross-hair monstrosity
Stop with all this "main chart" special treatment.
Manage all lines in the same way across all referenced plots.
Add `CrossHair.add_plot()` for adding new plots dynamically.

Just, smh.
2020-10-02 12:13:28 -04:00
Tyler Goodlet c56aee6347 Use array of names for lookup 2020-10-02 12:13:28 -04:00
Tyler Goodlet 788771bd75 Change name to qtractor 2020-10-02 12:13:28 -04:00
Tyler Goodlet 3aebeb5801 Standardize ohlc dtype 2020-10-02 12:13:28 -04:00
Tyler Goodlet e5bca1e089 Fix import error 2020-10-02 12:13:28 -04:00
Tyler Goodlet 88fb7a8951 Handle overloaded arg 2020-10-02 12:13:28 -04:00
Tyler Goodlet 1a1e768126 Port to new data apis 2020-10-02 12:13:28 -04:00