Only set the specific view's yrange per quote
Somewhat of a facepalm but, for incremental update of the auto-yrange from quotes in the display loop obviously we only want to update the associated `Viz`/viewbox for *that* fqsn. Further we don't need to worry about the whole "tick margin" stuff since `._set_yrange()` already adds margin to the yrange by default; thus we remove all of that.storage_cli
							parent
							
								
									b446dba493
								
							
						
					
					
						commit
						ccbe7c75e2
					
				| 
						 | 
					@ -182,7 +182,6 @@ class DisplayState(Struct):
 | 
				
			||||||
    # misc state tracking
 | 
					    # misc state tracking
 | 
				
			||||||
    vars: dict[str, Any] = field(
 | 
					    vars: dict[str, Any] = field(
 | 
				
			||||||
        default_factory=lambda: {
 | 
					        default_factory=lambda: {
 | 
				
			||||||
            'tick_margin': 0,
 | 
					 | 
				
			||||||
            'i_last': 0,
 | 
					            'i_last': 0,
 | 
				
			||||||
            'i_last_append': 0,
 | 
					            'i_last_append': 0,
 | 
				
			||||||
            'last_mx_vlm': 0,
 | 
					            'last_mx_vlm': 0,
 | 
				
			||||||
| 
						 | 
					@ -192,7 +191,6 @@ class DisplayState(Struct):
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    hist_vars: dict[str, Any] = field(
 | 
					    hist_vars: dict[str, Any] = field(
 | 
				
			||||||
        default_factory=lambda: {
 | 
					        default_factory=lambda: {
 | 
				
			||||||
            'tick_margin': 0,
 | 
					 | 
				
			||||||
            'i_last': 0,
 | 
					            'i_last': 0,
 | 
				
			||||||
            'i_last_append': 0,
 | 
					            'i_last_append': 0,
 | 
				
			||||||
            'last_mx_vlm': 0,
 | 
					            'last_mx_vlm': 0,
 | 
				
			||||||
| 
						 | 
					@ -262,7 +260,7 @@ async def increment_history_view(
 | 
				
			||||||
                if liv:
 | 
					                if liv:
 | 
				
			||||||
                    hist_viz.plot.vb.interact_graphics_cycle(
 | 
					                    hist_viz.plot.vb.interact_graphics_cycle(
 | 
				
			||||||
                        do_linked_charts=False,
 | 
					                        do_linked_charts=False,
 | 
				
			||||||
                        # do_overlay_scaling=False,
 | 
					                        do_overlay_scaling=False,
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                    profiler('hist chart yrange view')
 | 
					                    profiler('hist chart yrange view')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -381,9 +379,6 @@ async def graphics_update_loop(
 | 
				
			||||||
        #   levels this might be dark volume we need to
 | 
					        #   levels this might be dark volume we need to
 | 
				
			||||||
        #   present differently -> likely dark vlm
 | 
					        #   present differently -> likely dark vlm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tick_size = symbol.tick_size
 | 
					 | 
				
			||||||
        tick_margin = 4 * tick_size
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fast_chart.show()
 | 
					        fast_chart.show()
 | 
				
			||||||
        last_quote_s = time.time()
 | 
					        last_quote_s = time.time()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -408,7 +403,6 @@ async def graphics_update_loop(
 | 
				
			||||||
            'l1': l1,
 | 
					            'l1': l1,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            'vars': {
 | 
					            'vars': {
 | 
				
			||||||
                'tick_margin': tick_margin,
 | 
					 | 
				
			||||||
                'i_last': 0,
 | 
					                'i_last': 0,
 | 
				
			||||||
                'i_last_append': 0,
 | 
					                'i_last_append': 0,
 | 
				
			||||||
                'last_mx_vlm': last_mx_vlm,
 | 
					                'last_mx_vlm': last_mx_vlm,
 | 
				
			||||||
| 
						 | 
					@ -529,8 +523,6 @@ def graphics_update_cycle(
 | 
				
			||||||
    main_viz = ds.viz
 | 
					    main_viz = ds.viz
 | 
				
			||||||
    index_field = main_viz.index_field
 | 
					    index_field = main_viz.index_field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tick_margin = varz['tick_margin']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (
 | 
					    (
 | 
				
			||||||
        uppx,
 | 
					        uppx,
 | 
				
			||||||
        liv,
 | 
					        liv,
 | 
				
			||||||
| 
						 | 
					@ -555,14 +547,16 @@ def graphics_update_cycle(
 | 
				
			||||||
    # - we should probably scale the view margin based on the size of
 | 
					    # - we should probably scale the view margin based on the size of
 | 
				
			||||||
    #   the true range? This way you can slap in orders outside the
 | 
					    #   the true range? This way you can slap in orders outside the
 | 
				
			||||||
    #   current L1 (only) book range.
 | 
					    #   current L1 (only) book range.
 | 
				
			||||||
    mx = lmx = varz['last_mx']
 | 
					    main_vb = main_viz.plot.vb
 | 
				
			||||||
    mn = lmn = varz['last_mn']
 | 
					    this_viz = chart._vizs[fqsn]
 | 
				
			||||||
 | 
					    this_vb = this_viz.plot.vb
 | 
				
			||||||
 | 
					    lmn, lmx = this_vb._yrange
 | 
				
			||||||
 | 
					    mx = lmx
 | 
				
			||||||
 | 
					    mn = lmn
 | 
				
			||||||
    mx_vlm_in_view = varz['last_mx_vlm']
 | 
					    mx_vlm_in_view = varz['last_mx_vlm']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # update ohlc sampled price bars
 | 
					    # update ohlc sampled price bars
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        # do_rt_update
 | 
					 | 
				
			||||||
        # or do_px_step
 | 
					 | 
				
			||||||
        (liv and do_px_step)
 | 
					        (liv and do_px_step)
 | 
				
			||||||
        or trigger_all
 | 
					        or trigger_all
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
| 
						 | 
					@ -590,8 +584,8 @@ def graphics_update_cycle(
 | 
				
			||||||
        # NOTE: do this **after** the tread to ensure we take the yrange
 | 
					        # NOTE: do this **after** the tread to ensure we take the yrange
 | 
				
			||||||
        # from the most current view x-domain.
 | 
					        # from the most current view x-domain.
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
            mn_in_view,
 | 
					            mn,
 | 
				
			||||||
            mx_in_view,
 | 
					            mx,
 | 
				
			||||||
            mx_vlm_in_view,
 | 
					            mx_vlm_in_view,
 | 
				
			||||||
        ) = multi_maxmin(
 | 
					        ) = multi_maxmin(
 | 
				
			||||||
            i_read_range,
 | 
					            i_read_range,
 | 
				
			||||||
| 
						 | 
					@ -600,8 +594,6 @@ def graphics_update_cycle(
 | 
				
			||||||
            profiler,
 | 
					            profiler,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mx = mx_in_view + tick_margin
 | 
					 | 
				
			||||||
        mn = mn_in_view - tick_margin
 | 
					 | 
				
			||||||
        profiler(f'{fqsn} `multi_maxmin()` call')
 | 
					        profiler(f'{fqsn} `multi_maxmin()` call')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # iterate frames of ticks-by-type such that we only update graphics
 | 
					    # iterate frames of ticks-by-type such that we only update graphics
 | 
				
			||||||
| 
						 | 
					@ -625,8 +617,20 @@ def graphics_update_cycle(
 | 
				
			||||||
            # TODO: make sure IB doesn't send ``-1``!
 | 
					            # TODO: make sure IB doesn't send ``-1``!
 | 
				
			||||||
            and price > 0
 | 
					            and price > 0
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            mx = max(price + tick_margin, mx)
 | 
					            if (
 | 
				
			||||||
            mn = min(price - tick_margin, mn)
 | 
					                price < mn
 | 
				
			||||||
 | 
					            ):
 | 
				
			||||||
 | 
					                mn = price
 | 
				
			||||||
 | 
					                # print(f'{this_viz.name} new MN from TICK {mn}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (
 | 
				
			||||||
 | 
					                price > mx
 | 
				
			||||||
 | 
					            ):
 | 
				
			||||||
 | 
					                mx = price
 | 
				
			||||||
 | 
					                # print(f'{this_viz.name} new MX from TICK {mx}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # mx = max(price, mx)
 | 
				
			||||||
 | 
					            # mn = min(price, mn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # clearing price update:
 | 
					        # clearing price update:
 | 
				
			||||||
        # generally, we only want to update grahpics from the *last*
 | 
					        # generally, we only want to update grahpics from the *last*
 | 
				
			||||||
| 
						 | 
					@ -691,8 +695,14 @@ def graphics_update_cycle(
 | 
				
			||||||
    # of previous "last" L1 values which are in view.
 | 
					    # of previous "last" L1 values which are in view.
 | 
				
			||||||
    mn_diff = mn - lmn
 | 
					    mn_diff = mn - lmn
 | 
				
			||||||
    mx_diff = mx - lmx
 | 
					    mx_diff = mx - lmx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (
 | 
					    if (
 | 
				
			||||||
        mx_diff or mn_diff
 | 
					        mn_diff or mx_diff  # covers all cases below?
 | 
				
			||||||
 | 
					        # (mx - lmx) > 0  # upward expansion
 | 
				
			||||||
 | 
					        # or (mn - lmn) < 0  # downward expansion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # or (lmx - mx) > 0 # upward contraction
 | 
				
			||||||
 | 
					        # or (lmn - mn) < 0 # downward contraction
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        # complain about out-of-range outliers which can show up
 | 
					        # complain about out-of-range outliers which can show up
 | 
				
			||||||
        # in certain annoying feeds (like ib)..
 | 
					        # in certain annoying feeds (like ib)..
 | 
				
			||||||
| 
						 | 
					@ -721,17 +731,16 @@ def graphics_update_cycle(
 | 
				
			||||||
            liv
 | 
					            liv
 | 
				
			||||||
            and not chart._static_yrange == 'axis'
 | 
					            and not chart._static_yrange == 'axis'
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            main_vb = main_viz.plot.vb
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
                main_vb._ic is None
 | 
					                main_vb._ic is None
 | 
				
			||||||
                or not main_vb._ic.is_set()
 | 
					                or not main_vb._ic.is_set()
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                print(f'SETTING Y-mxmx -> {main_viz.name}: {(mn, mx)}')
 | 
					                # print(f'SETTING Y-mnmx -> {main_viz.name}: {(mn, mx)}')
 | 
				
			||||||
                main_vb.interact_graphics_cycle(
 | 
					                this_vb.interact_graphics_cycle(
 | 
				
			||||||
                    do_linked_charts=False,
 | 
					                    do_linked_charts=False,
 | 
				
			||||||
                    do_overlay_scaling=False,
 | 
					                    do_overlay_scaling=False,
 | 
				
			||||||
                    yranges={main_viz: (mn, mx)},
 | 
					                    yranges={this_viz: (mn, mx)},
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                profiler('main vb y-autorange')
 | 
					                profiler('main vb y-autorange')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -888,7 +897,7 @@ def graphics_update_cycle(
 | 
				
			||||||
                # resizing from last quote?)
 | 
					                # resizing from last quote?)
 | 
				
			||||||
                # XXX: without this we get completely
 | 
					                # XXX: without this we get completely
 | 
				
			||||||
                # mangled/empty vlm display subchart..
 | 
					                # mangled/empty vlm display subchart..
 | 
				
			||||||
                fvb = viz.plot.vb
 | 
					                # fvb = viz.plot.vb
 | 
				
			||||||
                # fvb.interact_graphics_cycle(
 | 
					                # fvb.interact_graphics_cycle(
 | 
				
			||||||
                #     do_linked_charts=False,
 | 
					                #     do_linked_charts=False,
 | 
				
			||||||
                #     do_overlay_scaling=False,
 | 
					                #     do_overlay_scaling=False,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue