Use `Viz.update_graphics()` throughout remainder of graphics loop where possible
							parent
							
								
									e06a6c94eb
								
							
						
					
					
						commit
						ee8e27f256
					
				| 
						 | 
					@ -208,7 +208,7 @@ async def increment_history_view(
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                uppx,
 | 
					                uppx,
 | 
				
			||||||
                liv,
 | 
					                liv,
 | 
				
			||||||
                do_append,
 | 
					                do_px_step,
 | 
				
			||||||
                i_diff_t,
 | 
					                i_diff_t,
 | 
				
			||||||
                append_diff,
 | 
					                append_diff,
 | 
				
			||||||
                do_rt_update,
 | 
					                do_rt_update,
 | 
				
			||||||
| 
						 | 
					@ -220,7 +220,7 @@ async def increment_history_view(
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
                do_append
 | 
					                do_px_step
 | 
				
			||||||
                and liv
 | 
					                and liv
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                hist_viz.plot.vb._set_yrange(viz=hist_viz)
 | 
					                hist_viz.plot.vb._set_yrange(viz=hist_viz)
 | 
				
			||||||
| 
						 | 
					@ -459,11 +459,11 @@ def graphics_update_cycle(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    chart = ds.chart
 | 
					    chart = ds.chart
 | 
				
			||||||
    hist_chart = ds.hist_chart
 | 
					    hist_chart = ds.hist_chart
 | 
				
			||||||
 | 
					 | 
				
			||||||
    flume = ds.flume
 | 
					    flume = ds.flume
 | 
				
			||||||
    sym = flume.symbol
 | 
					    sym = flume.symbol
 | 
				
			||||||
    fqsn = sym.fqsn
 | 
					    fqsn = sym.fqsn
 | 
				
			||||||
    main_viz = chart._vizs[fqsn]
 | 
					    main_viz = chart._vizs[fqsn]
 | 
				
			||||||
 | 
					    hist_viz = hist_chart._vizs[fqsn]
 | 
				
			||||||
    index_field = main_viz.index_field
 | 
					    index_field = main_viz.index_field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    profiler = Profiler(
 | 
					    profiler = Profiler(
 | 
				
			||||||
| 
						 | 
					@ -487,7 +487,7 @@ def graphics_update_cycle(
 | 
				
			||||||
    (
 | 
					    (
 | 
				
			||||||
        uppx,
 | 
					        uppx,
 | 
				
			||||||
        liv,
 | 
					        liv,
 | 
				
			||||||
        do_append,
 | 
					        do_px_step,
 | 
				
			||||||
        i_diff_t,
 | 
					        i_diff_t,
 | 
				
			||||||
        append_diff,
 | 
					        append_diff,
 | 
				
			||||||
        do_rt_update,
 | 
					        do_rt_update,
 | 
				
			||||||
| 
						 | 
					@ -495,7 +495,7 @@ def graphics_update_cycle(
 | 
				
			||||||
    ) = main_viz.incr_info(ds=ds)
 | 
					    ) = main_viz.incr_info(ds=ds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: we should only run mxmn when we know
 | 
					    # TODO: we should only run mxmn when we know
 | 
				
			||||||
    # an update is due via ``do_append`` above.
 | 
					    # an update is due via ``do_px_step`` above.
 | 
				
			||||||
    (
 | 
					    (
 | 
				
			||||||
        mx_in_view,
 | 
					        mx_in_view,
 | 
				
			||||||
        mn_in_view,
 | 
					        mn_in_view,
 | 
				
			||||||
| 
						 | 
					@ -513,18 +513,16 @@ def graphics_update_cycle(
 | 
				
			||||||
    # update ohlc sampled price bars
 | 
					    # update ohlc sampled price bars
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        do_rt_update
 | 
					        do_rt_update
 | 
				
			||||||
        or do_append
 | 
					        or do_px_step
 | 
				
			||||||
        or trigger_all
 | 
					        or trigger_all
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        chart.update_graphics_from_flow(
 | 
					        main_viz.update_graphics(array_key=fqsn)
 | 
				
			||||||
            fqsn,
 | 
					        hist_viz.draw_last(array_key=fqsn)
 | 
				
			||||||
            # do_append=do_append,
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        main_viz.draw_last(array_key=fqsn)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        hist_chart.update_graphics_from_flow(
 | 
					    else:
 | 
				
			||||||
            fqsn,
 | 
					        main_viz.draw_last(
 | 
				
			||||||
            # do_append=do_append,
 | 
					            array_key=fqsn,
 | 
				
			||||||
 | 
					            only_last_uppx=True,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # don't real-time "shift" the curve to the
 | 
					    # don't real-time "shift" the curve to the
 | 
				
			||||||
| 
						 | 
					@ -532,7 +530,7 @@ def graphics_update_cycle(
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            should_tread
 | 
					            should_tread
 | 
				
			||||||
            and do_append
 | 
					            and do_px_step
 | 
				
			||||||
            and liv
 | 
					            and liv
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        or trigger_all
 | 
					        or trigger_all
 | 
				
			||||||
| 
						 | 
					@ -586,7 +584,7 @@ def graphics_update_cycle(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if wap_in_history:
 | 
					            if wap_in_history:
 | 
				
			||||||
                # update vwap overlay line
 | 
					                # update vwap overlay line
 | 
				
			||||||
                chart.update_graphics_from_flow('bar_wap')
 | 
					                chart.get_viz('bar_wap').update_graphics()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # L1 book label-line updates
 | 
					        # L1 book label-line updates
 | 
				
			||||||
        if typ in ('last',):
 | 
					        if typ in ('last',):
 | 
				
			||||||
| 
						 | 
					@ -623,7 +621,8 @@ def graphics_update_cycle(
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            l1.bid_label.update_fields({'level': price, 'size': size})
 | 
					            l1.bid_label.update_fields({'level': price, 'size': size})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # check for y-autorange re-size
 | 
					    # Y-autoranging: adjust y-axis limits based on state tracking
 | 
				
			||||||
 | 
					    # of previous "last" L1 values which are in view.
 | 
				
			||||||
    lmx = varz['last_mx']
 | 
					    lmx = varz['last_mx']
 | 
				
			||||||
    lmn = varz['last_mn']
 | 
					    lmn = varz['last_mn']
 | 
				
			||||||
    mx_diff = mx - lmx
 | 
					    mx_diff = mx - lmx
 | 
				
			||||||
| 
						 | 
					@ -633,6 +632,8 @@ def graphics_update_cycle(
 | 
				
			||||||
        mx_diff
 | 
					        mx_diff
 | 
				
			||||||
        or mn_diff
 | 
					        or mn_diff
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
 | 
					        # complain about out-of-range outliers which can show up
 | 
				
			||||||
 | 
					        # in certain annoying feeds (like ib)..
 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
            abs(mx_diff) > .25 * lmx
 | 
					            abs(mx_diff) > .25 * lmx
 | 
				
			||||||
            or
 | 
					            or
 | 
				
			||||||
| 
						 | 
					@ -647,7 +648,8 @@ def graphics_update_cycle(
 | 
				
			||||||
                f'mx_diff: {mx_diff}\n'
 | 
					                f'mx_diff: {mx_diff}\n'
 | 
				
			||||||
                f'mn_diff: {mn_diff}\n'
 | 
					                f'mn_diff: {mn_diff}\n'
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        # fast chart resize case
 | 
					
 | 
				
			||||||
 | 
					        # FAST CHART resize case
 | 
				
			||||||
        elif (
 | 
					        elif (
 | 
				
			||||||
            liv
 | 
					            liv
 | 
				
			||||||
            and not chart._static_yrange == 'axis'
 | 
					            and not chart._static_yrange == 'axis'
 | 
				
			||||||
| 
						 | 
					@ -659,7 +661,7 @@ def graphics_update_cycle(
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                yr = (mn, mx)
 | 
					                yr = (mn, mx)
 | 
				
			||||||
                # print(
 | 
					                # print(
 | 
				
			||||||
                #     f'updating y-range due to mxmn\n'
 | 
					                #     f'MAIN VIZ yrange update\n'
 | 
				
			||||||
                #     f'{fqsn}: {yr}'
 | 
					                #     f'{fqsn}: {yr}'
 | 
				
			||||||
                # )
 | 
					                # )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -673,8 +675,7 @@ def graphics_update_cycle(
 | 
				
			||||||
                    yrange=yr
 | 
					                    yrange=yr
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # check if slow chart needs a resize
 | 
					        # SLOW CHART resize case
 | 
				
			||||||
        hist_viz = hist_chart._vizs[fqsn]
 | 
					 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            _,
 | 
					            _,
 | 
				
			||||||
            hist_liv,
 | 
					            hist_liv,
 | 
				
			||||||
| 
						 | 
					@ -690,15 +691,16 @@ def graphics_update_cycle(
 | 
				
			||||||
        if hist_liv:
 | 
					        if hist_liv:
 | 
				
			||||||
            hist_viz.plot.vb._set_yrange(viz=hist_viz)
 | 
					            hist_viz.plot.vb._set_yrange(viz=hist_viz)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # XXX: update this every draw cycle to make
 | 
					    # XXX: update this every draw cycle to ensure y-axis auto-ranging
 | 
				
			||||||
 | 
					    # only adjusts when the in-view data co-domain actually expands or
 | 
				
			||||||
 | 
					    # contracts.
 | 
				
			||||||
    varz['last_mx'], varz['last_mn'] = mx, mn
 | 
					    varz['last_mx'], varz['last_mn'] = mx, mn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # run synchronous update on all linked viz
 | 
					    # run synchronous update on all `Viz` overlays
 | 
				
			||||||
    # TODO: should the "main" (aka source) viz be special?
 | 
					 | 
				
			||||||
    for curve_name, viz in chart._vizs.items():
 | 
					    for curve_name, viz in chart._vizs.items():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # update any overlayed fsp flows
 | 
					        # update any overlayed fsp flows
 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
            # curve_name != chart.data_key
 | 
					 | 
				
			||||||
            curve_name != fqsn
 | 
					            curve_name != fqsn
 | 
				
			||||||
            and not viz.is_ohlc
 | 
					            and not viz.is_ohlc
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
| 
						 | 
					@ -713,21 +715,28 @@ def graphics_update_cycle(
 | 
				
			||||||
        # px column to give the user the mx/mn
 | 
					        # px column to give the user the mx/mn
 | 
				
			||||||
        # range of that set.
 | 
					        # range of that set.
 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
            liv
 | 
					            curve_name != fqsn
 | 
				
			||||||
            # and not do_append
 | 
					            and liv
 | 
				
			||||||
 | 
					            # and not do_px_step
 | 
				
			||||||
            # and not do_rt_update
 | 
					            # and not do_rt_update
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            viz.draw_last(
 | 
					            viz.draw_last(
 | 
				
			||||||
                array_key=curve_name,
 | 
					                array_key=curve_name,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # TODO: XXX this is currently broken for the
 | 
				
			||||||
 | 
					                # `FlattenedOHLC` case since we aren't returning the
 | 
				
			||||||
 | 
					                # full x/y uppx's worth of src-data from
 | 
				
			||||||
 | 
					                # `draw_last_datum()` ..
 | 
				
			||||||
                only_last_uppx=True,
 | 
					                only_last_uppx=True,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # volume chart logic..
 | 
					    # volume chart logic..
 | 
				
			||||||
    # TODO: can we unify this with the above loop?
 | 
					    # TODO: can we unify this with the above loop?
 | 
				
			||||||
    if vlm_chart:
 | 
					    if vlm_chart:
 | 
				
			||||||
        # print(f"DOING VLM {fqsn}")
 | 
					 | 
				
			||||||
        vlm_vizs = vlm_chart._vizs
 | 
					        vlm_vizs = vlm_chart._vizs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        main_vlm_viz = vlm_vizs['volume']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # always update y-label
 | 
					        # always update y-label
 | 
				
			||||||
        ds.vlm_sticky.update_from_data(
 | 
					        ds.vlm_sticky.update_from_data(
 | 
				
			||||||
            *array[-1][[
 | 
					            *array[-1][[
 | 
				
			||||||
| 
						 | 
					@ -739,19 +748,20 @@ def graphics_update_cycle(
 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                do_rt_update
 | 
					                do_rt_update
 | 
				
			||||||
                or do_append
 | 
					                or do_px_step
 | 
				
			||||||
                and liv
 | 
					                and liv
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            or trigger_all
 | 
					            or trigger_all
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            # TODO: make it so this doesn't have to be called
 | 
					            # TODO: make it so this doesn't have to be called
 | 
				
			||||||
            # once the $vlm is up?
 | 
					            # once the $vlm is up?
 | 
				
			||||||
            vlm_chart.update_graphics_from_flow(
 | 
					            main_vlm_viz.update_graphics(
 | 
				
			||||||
                'volume',
 | 
					
 | 
				
			||||||
                # UGGGh, see ``maxmin()`` impl in `._fsp` for
 | 
					                # UGGGh, see ``maxmin()`` impl in `._fsp` for
 | 
				
			||||||
                # the overlayed plotitems... we need a better
 | 
					                # the overlayed plotitems... we need a better
 | 
				
			||||||
                # bay to invoke a maxmin per overlay..
 | 
					                # bay to invoke a maxmin per overlay..
 | 
				
			||||||
                render=False,
 | 
					                render=False,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # XXX: ^^^^ THIS IS SUPER IMPORTANT! ^^^^
 | 
					                # XXX: ^^^^ THIS IS SUPER IMPORTANT! ^^^^
 | 
				
			||||||
                # without this, since we disable the
 | 
					                # without this, since we disable the
 | 
				
			||||||
                # 'volume' (units) chart after the $vlm starts
 | 
					                # 'volume' (units) chart after the $vlm starts
 | 
				
			||||||
| 
						 | 
					@ -760,7 +770,7 @@ def graphics_update_cycle(
 | 
				
			||||||
                # connected to update accompanying overlay
 | 
					                # connected to update accompanying overlay
 | 
				
			||||||
                # graphics..
 | 
					                # graphics..
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            profiler('`vlm_chart.update_graphics_from_flow()`')
 | 
					            profiler('`main_vlm_viz.update_graphics()`')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
                mx_vlm_in_view != varz['last_mx_vlm']
 | 
					                mx_vlm_in_view != varz['last_mx_vlm']
 | 
				
			||||||
| 
						 | 
					@ -768,50 +778,49 @@ def graphics_update_cycle(
 | 
				
			||||||
                vlm_yr = (0, mx_vlm_in_view * 1.375)
 | 
					                vlm_yr = (0, mx_vlm_in_view * 1.375)
 | 
				
			||||||
                vlm_chart.view._set_yrange(yrange=vlm_yr)
 | 
					                vlm_chart.view._set_yrange(yrange=vlm_yr)
 | 
				
			||||||
                profiler('`vlm_chart.view._set_yrange()`')
 | 
					                profiler('`vlm_chart.view._set_yrange()`')
 | 
				
			||||||
                # print(f'mx vlm: {last_mx_vlm} -> {mx_vlm_in_view}')
 | 
					 | 
				
			||||||
                varz['last_mx_vlm'] = mx_vlm_in_view
 | 
					                varz['last_mx_vlm'] = mx_vlm_in_view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # update all downstream FSPs
 | 
					        # update all downstream FSPs
 | 
				
			||||||
        for curve_name, viz in vlm_vizs.items():
 | 
					        for curve_name, viz in vlm_vizs.items():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if curve_name == 'volume':
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
                curve_name not in {'volume', fqsn}
 | 
					                viz.render
 | 
				
			||||||
                and viz.render
 | 
					 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
                    liv and do_rt_update
 | 
					                    liv and do_rt_update
 | 
				
			||||||
                    or do_append
 | 
					                    or do_px_step
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                # and not viz.is_ohlc
 | 
					                and curve_name not in {fqsn,}
 | 
				
			||||||
                # and curve_name != fqsn
 | 
					 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                update_fsp_chart(
 | 
					                update_fsp_chart(
 | 
				
			||||||
                    viz,
 | 
					                    viz,
 | 
				
			||||||
                    curve_name,
 | 
					                    curve_name,
 | 
				
			||||||
                    array_key=curve_name,
 | 
					                    array_key=curve_name,
 | 
				
			||||||
                    # do_append=uppx < update_uppx,
 | 
					 | 
				
			||||||
                    # do_append=do_append,
 | 
					 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                # is this even doing anything?
 | 
					                # is this even doing anything?
 | 
				
			||||||
                # (pretty sure it's the real-time
 | 
					                # (pretty sure it's the real-time
 | 
				
			||||||
                # resizing from last quote?)
 | 
					                # resizing from last quote?)
 | 
				
			||||||
                fvb = viz.plot.vb
 | 
					                fvb = viz.plot.vb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # XXX: without this we get completely
 | 
				
			||||||
 | 
					                # mangled/empty vlm display subchart..
 | 
				
			||||||
                fvb._set_yrange(
 | 
					                fvb._set_yrange(
 | 
				
			||||||
                    viz=viz,
 | 
					                    viz=viz,
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            elif (
 | 
					 | 
				
			||||||
                curve_name != 'volume'
 | 
					 | 
				
			||||||
                and not do_append
 | 
					 | 
				
			||||||
                and liv
 | 
					 | 
				
			||||||
                and uppx >= 1
 | 
					 | 
				
			||||||
            # even if we're downsampled bigly
 | 
					            # even if we're downsampled bigly
 | 
				
			||||||
            # draw the last datum in the final
 | 
					            # draw the last datum in the final
 | 
				
			||||||
            # px column to give the user the mx/mn
 | 
					            # px column to give the user the mx/mn
 | 
				
			||||||
            # range of that set.
 | 
					            # range of that set.
 | 
				
			||||||
 | 
					            elif (
 | 
				
			||||||
 | 
					                not do_px_step
 | 
				
			||||||
 | 
					                and liv
 | 
				
			||||||
 | 
					                and uppx >= 1
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                # always update the last datum-element
 | 
					                # always update the last datum-element
 | 
				
			||||||
                # graphic for all vizs
 | 
					                # graphic for all vizs
 | 
				
			||||||
                # print(f'drawing last {viz.name}')
 | 
					 | 
				
			||||||
                viz.draw_last(array_key=curve_name)
 | 
					                viz.draw_last(array_key=curve_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1139,7 +1148,6 @@ async def display_symbol_data(
 | 
				
			||||||
        # for zoom-interaction purposes.
 | 
					        # for zoom-interaction purposes.
 | 
				
			||||||
        hist_chart.get_viz(fqsn).draw_last(
 | 
					        hist_chart.get_viz(fqsn).draw_last(
 | 
				
			||||||
            array_key=fqsn,
 | 
					            array_key=fqsn,
 | 
				
			||||||
            # only_last_uppx=True,
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        pis.setdefault(fqsn, [None, None])[1] = hist_chart.plotItem
 | 
					        pis.setdefault(fqsn, [None, None])[1] = hist_chart.plotItem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1243,7 +1251,6 @@ async def display_symbol_data(
 | 
				
			||||||
                # for zoom-interaction purposes.
 | 
					                # for zoom-interaction purposes.
 | 
				
			||||||
                viz.draw_last(
 | 
					                viz.draw_last(
 | 
				
			||||||
                    array_key=fqsn,
 | 
					                    array_key=fqsn,
 | 
				
			||||||
                    # only_last_uppx=True,
 | 
					 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                hist_pi.vb.maxmin = partial(
 | 
					                hist_pi.vb.maxmin = partial(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue