gap_annotator: super fast (time-)gap detection API #75
Open
goodboy
wants to merge 25 commits from
gap_annotator into ib_venue_closures
pull from: gap_annotator
merge into: pikers:ib_venue_closures
pikers:claudy_skillz
pikers:ib_async_CONT
pikers:dpi-font-auto-calc
pikers:macmini_testing
pikers:ib_async
pikers:macos_hackarounds
pikers:claudy_writes_ruff_conf
pikers:macos_dnks_vibed_fixes
pikers:main
pikers:ib_venue_closures
pikers:fix_tractor_logging
pikers:hist_backfill_fixes
pikers:refresh_annots
pikers:multiaddrs
pikers:tpt_closed_and_finally_footguns
pikers:tractor_struct_and_godw_mod
pikers:tpt_closed_and_finally_footguns_CONT
pikers:CONT_fix_tractor_logging
pikers:CONT2_hist_fixes
pikers:cont_hist_fixes
pikers:order_line_cancel_nowork_debugging
pikers:macos_fixed_with_readme
pikers:binance_nq_hotfix
pikers:pdbp_bump
pikers:macos_fixes_2025
pikers:add_visidata
pikers:service_mng_to_tractor
pikers:how_to_show_ur_pp
pikers:ib_2025_updates
pikers:providers_sync
pikers:port_to_latest_tractor
pikers:decimal_prices_thru_ems
pikers:rando_data_subsys_styling
pikers:subsys_refinery
pikers:bump_polars
pikers:brokers_refinery
pikers:simpler_gitea_merge_template
pikers:gitea_merge_template
pikers:nixround2_n_sway_testing
pikers:alt_tpts_for_perf
pikers:binance_api_3.1
pikers:accounting_refinery
pikers:no_symcache_no_problem
pikers:wayland_nix_py313
pikers:dpi_font_autocalc_fomo_bits
pikers:qt_w_graceful_SIGINT
pikers:stop_is_eoc
pikers:mp_fomo_polish
pikers:dpi_scaling_round2
pikers:max_pain_storage
pikers:macos_fixes_with_readme_premain_BACKUP
pikers:testing_utils
pikers:max_pain_chart
pikers:max_pain_deribit
pikers:deribit_fix
pikers:gitea_feats
pikers:jsonrpc_err_in_rent
pikers:tsp_gaps
pikers:max_pain_chart_backup
pikers:subsys_refinery_BACKUP
pikers:max_pain_deribit_backup
pikers:add_ruff_linter
pikers:deribit_fix_backup
pikers:kucoin_and_binance_fix
pikers:uv_migration
pikers:kucoin_and_binance_BACKUP
pikers:go_httpx_no_unrelated_binance_stuff
pikers:go_httpx
pikers:go_httpx_orig_BACKUP
pikers:ib_refinements
pikers:fix_deribit_hist_queries_NEW
pikers:fix_deribit_hist_queries
pikers:prev_deribit_fix
pikers:nix_shell_env_fix
pikers:cherry_to_storage_pr
pikers:fix_deribit_hist_queries_BACKUP
pikers:kucoin_and_binance_fix_goodboyBACKUP
pikers:nix-headless-fix
pikers:go_httpx_binance
pikers:fix-binance-venues
pikers:pyqt6
pikers:distribute_dis
pikers:runtime_to_msgspec
pikers:nix-monkeys-fix
pikers:ib_py311_fixes
pikers:poetry2nix
pikers:account_tests
pikers:py311_ib_fix
pikers:master
pikers:basic_buy_bot
pikers:marketstore_disable_snappy
pikers:rekt_pps
pikers:py311
pikers:kucoin_backend
pikers:small_kucoin_fixes
pikers:pre_overruns_ctxcancelled
pikers:emit_clear_ticks_only_on_ts_change
pikers:binance_ws_ep_update
pikers:log_linearized_curve_overlays
pikers:xdotool_fixes
pikers:deribit_updates
pikers:storage_middleware_layer
pikers:service_subpkg
pikers:pps_precision_hotfixes
pikers:service_subpkg_backup
pikers:storage_cli
pikers:xdo_and_you
pikers:decimalization_take_2
pikers:backward_compat_trans_with_symbolinfo
pikers:explicit_write_pps_on_exit
pikers:backend_spec
pikers:paper_trade_improvements_rebase
pikers:loglevel_to_testpikerd
pikers:overlays_interaction_latency_tuning
pikers:kraken_deposits_fixes
pikers:l1_compaction
pikers:epoch_indexing_and_dataviz_layer
pikers:multichartz
pikers:axis_sticky_api
pikers:multi_symbol_input
pikers:update_qt_screen_info_script
pikers:fsps_and_flumes
pikers:epoch_index
pikers:pregraphics_formatters
pikers:multichartz_backup
pikers:samplerd_service
pikers:misc_brokerd_backend_repairs
pikers:pre_viz_calls
pikers:dark_clearing_improvements
pikers:dark_clearing_repairs
pikers:epoch_index_backup
pikers:agg_feedz
pikers:kraken_limits_fields
pikers:cz_post_ftx
pikers:kraken_pair_status
pikers:ib_contract_updates
pikers:pre_multifeed_hotfix
pikers:kraken_pair_updates
pikers:daemon_sockaddr_config
pikers:no_signal_pi_overlays
pikers:pre_multi_feedz
pikers:pg_exts_fork
pikers:ib_1m_hist
pikers:even_moar_kraken_order_fixes
pikers:ci_fix_tractor_testing
pikers:clears_table_events
pikers:offline_dark_clearing
pikers:multi_client_order_mgt
pikers:pin_tractor_main
pikers:history_view
pikers:tractor_core_port
pikers:kraken_fill_bugs
pikers:paper_clear_logics_fix
pikers:kraken_nameerr_fix
pikers:livenpaper
pikers:size_in_shm_token
pikers:deribit
pikers:asycvnc_pin_bump
pikers:live_n_paper
pikers:open_order_loading
pikers:doin_the_splits
pikers:dict_differ
pikers:msgpack_zombie
pikers:the_ems_flattening
pikers:kraken_ws_orders
pikers:kraken_userref_hackzin
pikers:pydantic_zombie
pikers:ib_pps_upgrade
pikers:multisympaper
pikers:ppu_history
pikers:basic_pp_audit
pikers:historical_breakeven_pp_price
pikers:ib_native_data_hack
pikers:pptables
pikers:ahab_you_bad_boi
pikers:fix_forex
pikers:fsp_shm_caching
pikers:paper_eng_msg_fixes
pikers:drop_pydantic
pikers:krakenwsbackup
pikers:dpbackup
pikers:null_last_quote_fix
pikers:ahab_hardkill
pikers:tractor_typed_msg_hackin
pikers:kraken_ledger_pps
pikers:ib_rt_pp_update_hotfix
pikers:notokeninwswrapper
pikers:pps_postmortem
pikers:lifo_pps_ib
pikers:310_plus
pikers:mxmn_from_m4
pikers:contain_mkts
pikers:slic_fix_v2
pikers:uppx_slice_fix
pikers:update_last_datums_in_view
pikers:ib_subpkg
pikers:flexxin
pikers:ib_checker_hackz
pikers:incremental_update_paths
pikers:ib_dedicated_data_client
pikers:dockerize_ib_gw
pikers:pre_flow
pikers:drop_pandas
pikers:no_ib_pps
pikers:trimeter_dep
pikers:l1_precision_fix
pikers:marketstore
pikers:no_orderid_in_error
pikers:incr_update_backup
pikers:big_data_lines
pikers:m4_corrections
pikers:offline_history_loading
pikers:drop_arrow_add_predulum
pikers:marketstore_backup
pikers:broker_bumpz
pikers:no_git_prot_w_pip
pikers:kraken_editorder
pikers:fqsns
pikers:kraken_cleaning
pikers:kraken_orders
pikers:only_draw_iv_for_ohlc
pikers:mkts_backup
pikers:pp_bar_fixes
pikers:async_hist_loading
pikers:kraken_gb
pikers:windows_fixes_yo
pikers:ib_mkt_closed
pikers:py3.10_support
pikers:gb_kraken_orders
pikers:dark_vlm
pikers:overlayed_dvlm
pikers:fsp_ui_mod
pikers:vlm_plotz
pikers:plotitem_overlays
pikers:misc_backend_fixes
pikers:dolla_vlm
pikers:fspd_cluster
pikers:misc_ib_updates
pikers:single_display_update_loop
pikers:basic_vlm_display
pikers:pane_sizing_fixes
pikers:tractor_clustering
pikers:msgpack_no_sets_allowed
pikers:tinas_unite
pikers:simpler_quote_throttle_logic
pikers:fast_step_curve
pikers:win_fixes
pikers:fsp_hotfixes
pikers:teardown_guesmost_via_cs
pikers:windows_testing_volume
pikers:fsp_drunken_alignment
pikers:vlm_plotz_backup
pikers:fsp_feeds
pikers:chart_mod_breakup
pikers:pause_feeds_on_sym_switch
pikers:brokers_config
pikers:ordermodepps_backup
pikers:readme_bump_zone
pikers:ci_on_forks
pikers:asyncify_input_modes
pikers:minimal_brokerd_trade_dialogues
pikers:wait_on_daemon_portals
pikers:backup_asyncify_input_modes
pikers:naive_feed_throttling
pikers:window_cuckery
pikers:msgspec_fixes
pikers:status_bar
pikers:ems_hotfixes
pikers:ems_to_bidir_streaming
pikers:web_utils
pikers:symbol_search
pikers:binance_syminfo_and_mintick
pikers:update_throttling
pikers:syseng_tweaks
pikers:ems_tweaks
pikers:py3.9
pikers:binance_aggtrades_and_ohlc_parsing
pikers:binance_backend
pikers:tractor_open_stream_from
pikers:feed_fixes
pikers:order_mode_finesse
pikers:cached_feeds
pikers:readme_bumpz
pikers:supervise
pikers:basic_orders
pikers:kraken_trades_data
pikers:basic_alerts
pikers:kraken_history
pikers:y_zoom
pikers:chart_trader
pikers:graphics_pixel_buffer
pikers:vwap_fsp
pikers:to_qpainterpath_and_beyond
pikers:tina_free_vwap
pikers:vwap_backup
pikers:bar_select
pikers:ib_backend
pikers:unleash_the_kraken
pikers:facepalm
pikers:marketstore_integration
pikers:its_happening
pikers:relicense_as_agplv3
pikers:questrade_candles
pikers:use_tractor_logging
pikers:questrade_conns
pikers:kivy_mainline_and_py3.8
25 Commits (main)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
b5a33e1217 |
Exclude crypto futes from `without_src` sym key
Extend the `col_sym_key` asset-type check in `start_backfill()` to also exclude crypto-denominated futures (where `src` is `'crypto_currency'` and `dst` is `'future'`) from the `without_src=True` fqme path. Also in `.brokers.binance` backend (it being the guilty culprit in the discovery of this bug; and why i touched styling this code), - reformat `make_sub()` fn sig to multiline style in `.binance.feed`. - add backtick around `dict` in `make_sub()` docstring. - reformat `or` conditionals to multiline style in `.binance.feed.get_mkt_info()`. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
796a831c6e | Enable console log (from passed down `loglevel`) in `.tsp._history.manage_history()` | |
|
|
de81d1e905 | Drop `Flume.feed`, it's unused yet causes import cycles.. | |
|
|
170dd9794c |
Just warn on single-bar nulls instead of bping
Replace the debug breakpoint with a warning-log when a single-bar null-segment is detected in `get_null_segs()`. This lets the gap analysis continue while still alerting about the anomaly. Deats, - extract the 3-bar window (before, null, after) and calculate a `gap: pendulum.Interval` for the warning msg. - comment-out the old breakpoint block for optional debugging as needed. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
599c36aba6 | Lul, drop long unused poetry lock file | |
|
|
f174f79a1a |
Pin `pg` at latest official `0.14.0` release
Keep in masked GH sources lines for easy hackin against upstream `master` branch when needed as well! |
|
|
|
9b284c2256 | .ui._editors: log multiline styling and re-leveling | |
|
|
59f2d46a97 | .ui._lines: drop unused graphics-item import | |
|
|
c1b1e99693 |
Add batch-submit API for gap annotations
Introduce `AnnotCtl.add_batch()` and `serve_rc_annots()` batch handler to submit 1000s of gaps in single IPC msg instead of per-annot round-trips. Server builds `GapAnnotations` from specs and handles vectorized timestamp-to-index lookups. Deats, - add `'cmd': 'batch'` handler in `serve_rc_annots()` - vectorized timestamp lookup via `np.searchsorted()` + masking - build `gap_specs: list[dict]` from rect+arrow specs client-side - create single `GapAnnotations` item for all gaps server-side - handle `GapAnnotations.reposition()` in redraw handler - add profiling to batch path for perf measurement - support optional individual arrows for A/B comparison Also, - refactor `markup_gaps()` to collect specs + single batch call - add `no_qt_updates()` context mgr for batch render ops - add profiling to annotation teardown path - add `GapAnnotations` case to `rm_annot()` match block (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
24651d2326 |
Add a `GapAnnotations` path-renderer
For a ~1000x perf gain says ol' claudy, our boi who wrote this entire patch! Bo Introduce `GapAnnotations` in `.ui._annotate` for batch-rendering gap rects/arrows instead of individual `QGraphicsItem` instances. Uses upstream's `pyqtgraph.Qt.internals.PrimitiveArray` for rects and a `QPainterPath` for arrows. This API-replicates our prior annotator's in view shape-graphics but now using (what we're dubbing) "single-array-multiple-graphics" tech much like our `.ui._curve` extensions to `pg` B) Impl deats, - batch draw ~1000 gaps in single paint call vs 1000 items - arrows render in scene coords to maintain pixel size on zoom - add vectorized timestamp-to-index lookup for repositioning - cache bounding rect, rebuild on `reposition()` calls - match `SelectRect` + `ArrowItem` visual style/colors - skip reposition when timeframe doesn't match gap's period Other, - fix typo in `LevelMarker` docstring: "graphich" -> "graphic" - reflow docstring in `qgo_draw_markers()` to 67 char limit (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
2d00bb1024 |
Add info log for shm processing in `ldshm` CLI cmd
Log shm file name and detected period before null segment processing to aid debugging. (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
dd40ad603f | Bump to latest official `pyqtgraph` release | |
|
|
f2ace1b63b | Use `ppfmt()` in `order_mode` since it's provided by `tractor` now | |
|
|
9010f9c7ab |
Augment `.ib.symbols` search with more logging
Refactor `open_symbol_search()` to use `partial()` for nursery task spawning and add detailed query->results logging via `ppfmt()`. Deats, - change `extend_results()` to accept `target` callable + `pattern` + `**kwargs` and invoke inside, instead of receiving a pre-called awaitable; use `partial()` to pass args. - add `ppfmt()` formatted logging of search query params and results including client class + method repr. - change `print()` -> `log.exception()` for `Lagged` overrun. - bump `upto=5` -> `upto=10` for `search_symbols()` call. Also for styling, - add type some missing type annots. - add multiline style to `or` conditionals in pattern check. - reformat log msgs to multiline style throughout. - use `ppfmt()` for fuzzy match debug log. - rename nursery `sn` -> `tn`. - add TODO comment about `assert 0` hang. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
89a145113c |
Handle `str`-errors in `.ib.broker` trade events
Add `isinstance()` dispatch for the `'error'` event case in `deliver_trade_events()` to handle `ib_async` sometimes emitting plain `str` error items instead of the previously expected `dict`. Deats, - add `isinstance(err, dict)` branch for the standard case with `error_code`, `reason`, and `reqid` fields. - add `isinstance(err, str)` branch to parse error strings of the form `'[code 104] connection failed'` into `code` and `reason`. - set `reqid: str = '<unknown>'` for string-form errors since there's no request ID available. - update `err` type annot to `dict|str`. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
ec4db30cdc |
Handle valid null frames and 0-bar cases in backfill
Add guards for empty-array and zero-bar-diff cases in the TSP backfill loops to avoid crashes and allow graceful loop termination. In `maybe_fill_null_segments()`, - add `array.size == 0` guard in `maybe_fill_null_segments()` to detect valid (venue closure) gaps from the backend; add a warning + bp + break for this case. - add TODO that we should likely be filling nulls with the close price for the gap's duration. In `start_backfill()`, - expand the "0 bars after diff" warning msg with `backfill_until_dt` and `end_dt_param` context. - mask the `await tractor.pause()` and add a `break` to avoid blocking the backfill loop. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
2a394dba03 |
Warn instead of raise on `start_dt`-trimmed frames
Downgrade the `start_dt`-trimming check in `open_history_client()` from a `RuntimeError` raise to a warning log, allowing the caller to still receive a (shorter) frame of bars (though we may need to still specially handle such cases in the backfiller's biz logic layer). Deats, - add `trimmed_bars.size` guard to skip check on empty results. - change condition to `>=` and log a warning with the short-frame size instead of raising. - comment-out `raise RuntimeError` and breakpoint for future removal once confident. - add docstring-style comment on `start_dt=` kwarg noting that `Client.bars()` doesn't truly support it (uses duration-style queries internally). (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
19f16e1df3 |
Handle ambiguous futes contracts in `get_fute()`
Use (the only available in `ib_async`) `returnAll=True` in `qualifyContractsAsync()` calls within `get_fute()` and handle the case where IB returns a list of ambiguous contract matches instead of a single result. Deats, - add `returnAll=True` to both `ContFuture` and `Future` qualification calls. - add `isinstance(con, list)` check after unpacking first result to detect ambiguous contract sets. - log warning with input params and matched contracts when ambiguous. - update return type annot to `Contract|list[Contract]`. Also, - handle list-of-contracts case in `find_contracts()` by unpacking `*contracts` into the `qualifyContractsAsync()` call. - reformat `qualifyContractsAsync()` calls to multiline style. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
3adb0d8b9d |
Fall back to `Contract.exchange` in `has_holiday()`
Use `con.exchange` as fallback when `con.primaryExchange` is empty in `has_holiday()` to handle contracts like futures that don't always set a `primaryExchange`. Deats, - extract `con: Contract` from `con_deats.contract` for reuse. - use `con.primaryExchange or con.exchange` to ensure a valid exchange code is always passed to the calendar lookup. - add `Contract` to `TYPE_CHECKING` imports. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
ee09f519a9 |
Remap non-std IB exchange values
Add exchange name translation in `.ib.venues.has_holiday()` to handle non-standard exchange codes when looking up holiday gaps.. Deats, - add an ad-hoc lookup dict to remap an IB `Contract.primaryExchange` val which doesn't exist in the `exchange_calendars`'s alias set. - use `.get()` with fallback to map `exch` to new `std_exch` and pass that to `xcals.get_calendar()`. - add the case i just caught, `'ARCA'` -> `'ARCX'` to the table when i loaded the `gld.arca.ib` market.. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
9247746a79 |
Handle unknown order statuses in `.ib.broker`
Add fallback handling for unknown IB order status strings to avoid crashes when IB returns unexpected status values. Deats, - add `'ValidationError': 'error'` mapping to `_statuses` dict. - use `.get()` with `'error'` default instead of direct dict lookup for `status.status`. - add `elif status_str == 'error'` block to log unknown status values. - add type annots to `event_name` and `item` in `deliver_trade_events()` loop. Also, - reformat log msg in `deliver_trade_events()` to multiline. - drop extra conditional in `if status_str == 'filled'` check. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
9e2af2838f | Ah right, we import types from `eventkit` (now `aeventkit`).. | |
|
|
b1cb67d1bd |
Port `.ib` backend from `ib_insync` to `ib_async`
Migrate the IB broker backend to use `ib_async` (the actively maintained fork) instead of the now stale, original `ib_insync` lib. Deats, - update `pyproject.toml` dep: drop `ib-insync` pin, add `ib-async>=2.1.0`. - update lock file with `ib-async` and its new `aeventkit` dep (which i guess replaces `eventkit`). - obvi, change all `ib_insync` imports to `ib_async` across `.ib.*`. - update docs and select internal comments referencing the original lib. Also, - drop unused `ledger_dict` init in `_flex_reports.load_flex_trades()`. - fix union type annot style: `dict | None` -> `dict|None`. - strip `.tzinfo` from `lastTimeStamp` in `normalize()` to avoid IPC codec issues with `ib_async`'s `timezone.utc` injection. - pop `'defaults'` from ticker data dict in `normalize()` to avoid non-serializable `timezone` objects and warning-log in such cases. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code |
|
|
|
196422433c |
Capture `cons` in `Client.get_fute()`
That is to be able to (eventually) introspect "ambiguous" contract sets once we move to `ib_async` and its `returnAll: bool` now offered by `IB.qualifyContractsAsync()`, https://github.com/ib-api-reloaded/ib_async/blob/main/ib_async/ib.py#L2115 Also, tweak some type type annots to multline style in sibling mods. |
|
|
|
9a720f8e21 |
Merge pull request 'ib_venue_closures: gap detection for "legacy mkts"' (#71)
Reviewed-on: https://www.pikers.dev/pikers/piker/pulls/71 |