Port ui components to use flows, drop all late assignments of shm
							parent
							
								
									82dbdd6148
								
							
						
					
					
						commit
						8388918af0
					
				| 
						 | 
				
			
			@ -223,8 +223,9 @@ class DynamicDateAxis(Axis):
 | 
			
		|||
    ) -> List[str]:
 | 
			
		||||
 | 
			
		||||
        chart = self.linkedsplits.chart
 | 
			
		||||
        bars = chart._arrays[chart.name]
 | 
			
		||||
        shm = self.linkedsplits.chart._shm
 | 
			
		||||
        flow = chart._flows[chart.name]
 | 
			
		||||
        shm = flow.shm
 | 
			
		||||
        bars = shm.array
 | 
			
		||||
        first = shm._first.value
 | 
			
		||||
 | 
			
		||||
        bars_len = len(bars)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -243,13 +243,13 @@ class ContentsLabels:
 | 
			
		|||
    def update_labels(
 | 
			
		||||
        self,
 | 
			
		||||
        index: int,
 | 
			
		||||
        # array_name: str,
 | 
			
		||||
 | 
			
		||||
    ) -> None:
 | 
			
		||||
        # for name, (label, update) in self._labels.items():
 | 
			
		||||
        for chart, name, label, update in self._labels:
 | 
			
		||||
 | 
			
		||||
            array = chart._arrays[name]
 | 
			
		||||
            flow = chart._flows[name]
 | 
			
		||||
            array = flow.shm.array
 | 
			
		||||
 | 
			
		||||
            if not (
 | 
			
		||||
                index >= 0
 | 
			
		||||
                and index < array[-1]['index']
 | 
			
		||||
| 
						 | 
				
			
			@ -258,8 +258,6 @@ class ContentsLabels:
 | 
			
		|||
                print('WTF out of range?')
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            # array = chart._arrays[name]
 | 
			
		||||
 | 
			
		||||
            # call provided update func with data point
 | 
			
		||||
            try:
 | 
			
		||||
                label.show()
 | 
			
		||||
| 
						 | 
				
			
			@ -461,9 +459,12 @@ class Cursor(pg.GraphicsObject):
 | 
			
		|||
    ) -> LineDot:
 | 
			
		||||
        # if this plot contains curves add line dot "cursors" to denote
 | 
			
		||||
        # the current sample under the mouse
 | 
			
		||||
        main_flow = plot._flows[plot.name]
 | 
			
		||||
        # read out last index
 | 
			
		||||
        i = main_flow.shm.array[-1]['index']
 | 
			
		||||
        cursor = LineDot(
 | 
			
		||||
            curve,
 | 
			
		||||
            index=plot._arrays[plot.name][-1]['index'],
 | 
			
		||||
            index=i,
 | 
			
		||||
            plot=plot
 | 
			
		||||
        )
 | 
			
		||||
        plot.addItem(cursor)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -406,9 +406,8 @@ def graphics_update_cycle(
 | 
			
		|||
            ):
 | 
			
		||||
                # TODO: make it so this doesn't have to be called
 | 
			
		||||
                # once the $vlm is up?
 | 
			
		||||
                vlm_chart.update_graphics_from_array(
 | 
			
		||||
                vlm_chart.update_graphics_from_flow(
 | 
			
		||||
                    'volume',
 | 
			
		||||
                    array,
 | 
			
		||||
 | 
			
		||||
                    # UGGGh, see ``maxmin()`` impl in `._fsp` for
 | 
			
		||||
                    # the overlayed plotitems... we need a better
 | 
			
		||||
| 
						 | 
				
			
			@ -434,6 +433,11 @@ def graphics_update_cycle(
 | 
			
		|||
                    vars['last_mx_vlm'] = mx_vlm_in_view
 | 
			
		||||
 | 
			
		||||
                for curve_name, flow in vlm_chart._flows.items():
 | 
			
		||||
 | 
			
		||||
                    if not flow.render:
 | 
			
		||||
                        print(f'skipping flow {curve_name}?')
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    update_fsp_chart(
 | 
			
		||||
                        vlm_chart,
 | 
			
		||||
                        flow,
 | 
			
		||||
| 
						 | 
				
			
			@ -498,9 +502,8 @@ def graphics_update_cycle(
 | 
			
		|||
            or i_diff > 0
 | 
			
		||||
            or trigger_all
 | 
			
		||||
        ):
 | 
			
		||||
            chart.update_graphics_from_array(
 | 
			
		||||
            chart.update_graphics_from_flow(
 | 
			
		||||
                chart.name,
 | 
			
		||||
                array,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        # iterate in FIFO order per tick-frame
 | 
			
		||||
| 
						 | 
				
			
			@ -513,8 +516,9 @@ def graphics_update_cycle(
 | 
			
		|||
            # tick frames to determine the y-range for chart
 | 
			
		||||
            # auto-scaling.
 | 
			
		||||
            # TODO: we need a streaming minmax algo here, see def above.
 | 
			
		||||
            mx = max(price + tick_margin, mx)
 | 
			
		||||
            mn = min(price - tick_margin, mn)
 | 
			
		||||
            if liv:
 | 
			
		||||
                mx = max(price + tick_margin, mx)
 | 
			
		||||
                mn = min(price - tick_margin, mn)
 | 
			
		||||
 | 
			
		||||
            if typ in clear_types:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -537,9 +541,8 @@ def graphics_update_cycle(
 | 
			
		|||
 | 
			
		||||
                if wap_in_history:
 | 
			
		||||
                    # update vwap overlay line
 | 
			
		||||
                    chart.update_graphics_from_array(
 | 
			
		||||
                    chart.update_graphics_from_flow(
 | 
			
		||||
                        'bar_wap',
 | 
			
		||||
                        array,
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
            # L1 book label-line updates
 | 
			
		||||
| 
						 | 
				
			
			@ -555,7 +558,7 @@ def graphics_update_cycle(
 | 
			
		|||
 | 
			
		||||
                if (
 | 
			
		||||
                    label is not None
 | 
			
		||||
                    # and liv
 | 
			
		||||
                    and liv
 | 
			
		||||
                ):
 | 
			
		||||
                    label.update_fields(
 | 
			
		||||
                        {'level': price, 'size': size}
 | 
			
		||||
| 
						 | 
				
			
			@ -569,7 +572,7 @@ def graphics_update_cycle(
 | 
			
		|||
                typ in _tick_groups['asks']
 | 
			
		||||
                # TODO: instead we could check if the price is in the
 | 
			
		||||
                # y-view-range?
 | 
			
		||||
                # and liv
 | 
			
		||||
                and liv
 | 
			
		||||
            ):
 | 
			
		||||
                l1.ask_label.update_fields({'level': price, 'size': size})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -577,7 +580,7 @@ def graphics_update_cycle(
 | 
			
		|||
                typ in _tick_groups['bids']
 | 
			
		||||
                # TODO: instead we could check if the price is in the
 | 
			
		||||
                # y-view-range?
 | 
			
		||||
                # and liv
 | 
			
		||||
                and liv
 | 
			
		||||
            ):
 | 
			
		||||
                l1.bid_label.update_fields({'level': price, 'size': size})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -684,9 +687,10 @@ async def display_symbol_data(
 | 
			
		|||
        # create main OHLC chart
 | 
			
		||||
        chart = linked.plot_ohlc_main(
 | 
			
		||||
            symbol,
 | 
			
		||||
            bars,
 | 
			
		||||
            ohlcv,
 | 
			
		||||
            sidepane=pp_pane,
 | 
			
		||||
        )
 | 
			
		||||
        chart.default_view()
 | 
			
		||||
        chart._feeds[symbol.key] = feed
 | 
			
		||||
        chart.setFocus()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -706,10 +710,6 @@ async def display_symbol_data(
 | 
			
		|||
        # size view to data once at outset
 | 
			
		||||
        chart.cv._set_yrange()
 | 
			
		||||
 | 
			
		||||
        # TODO: a data view api that makes this less shit
 | 
			
		||||
        chart._shm = ohlcv
 | 
			
		||||
        chart._flows[chart.data_key].shm = ohlcv
 | 
			
		||||
 | 
			
		||||
        # NOTE: we must immediately tell Qt to show the OHLC chart
 | 
			
		||||
        # to avoid a race where the subplots get added/shown to
 | 
			
		||||
        # the linked set *before* the main price chart!
 | 
			
		||||
| 
						 | 
				
			
			@ -772,6 +772,5 @@ async def display_symbol_data(
 | 
			
		|||
                sbar._status_groups[loading_sym_key][1]()
 | 
			
		||||
 | 
			
		||||
                # let the app run.. bby
 | 
			
		||||
                chart.default_view()
 | 
			
		||||
                # linked.graphics_cycle()
 | 
			
		||||
                await trio.sleep_forever()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -343,7 +343,7 @@ class SelectRect(QtGui.QGraphicsRectItem):
 | 
			
		|||
        nbars = ixmx - ixmn + 1
 | 
			
		||||
 | 
			
		||||
        chart = self._chart
 | 
			
		||||
        data = chart._arrays[chart.name][ixmn:ixmx]
 | 
			
		||||
        data = chart._flows[chart.name].shm.array[ixmn:ixmx]
 | 
			
		||||
 | 
			
		||||
        if len(data):
 | 
			
		||||
            std = data['close'].std()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,9 +93,8 @@ def update_fsp_chart(
 | 
			
		|||
    # update graphics
 | 
			
		||||
    # NOTE: this does a length check internally which allows it
 | 
			
		||||
    # staying above the last row check below..
 | 
			
		||||
    chart.update_graphics_from_array(
 | 
			
		||||
    chart.update_graphics_from_flow(
 | 
			
		||||
        graphics_name,
 | 
			
		||||
        array,
 | 
			
		||||
        array_key=array_key or graphics_name,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,9 +105,6 @@ def update_fsp_chart(
 | 
			
		|||
    # read from last calculated value and update any label
 | 
			
		||||
    last_val_sticky = chart._ysticks.get(graphics_name)
 | 
			
		||||
    if last_val_sticky:
 | 
			
		||||
        # array = shm.array[array_key]
 | 
			
		||||
        # if len(array):
 | 
			
		||||
        #     value = array[-1]
 | 
			
		||||
        last = last_row[array_key]
 | 
			
		||||
        last_val_sticky.update_from_data(-1, last)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -246,20 +242,18 @@ async def run_fsp_ui(
 | 
			
		|||
 | 
			
		||||
            chart.draw_curve(
 | 
			
		||||
                name=name,
 | 
			
		||||
                data=shm.array,
 | 
			
		||||
                shm=shm,
 | 
			
		||||
                overlay=True,
 | 
			
		||||
                color='default_light',
 | 
			
		||||
                array_key=name,
 | 
			
		||||
                **conf.get('chart_kwargs', {})
 | 
			
		||||
            )
 | 
			
		||||
            # specially store ref to shm for lookup in display loop
 | 
			
		||||
            chart._flows[name].shm = shm
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            # create a new sub-chart widget for this fsp
 | 
			
		||||
            chart = linkedsplits.add_plot(
 | 
			
		||||
                name=name,
 | 
			
		||||
                array=shm.array,
 | 
			
		||||
                shm=shm,
 | 
			
		||||
 | 
			
		||||
                array_key=name,
 | 
			
		||||
                sidepane=sidepane,
 | 
			
		||||
| 
						 | 
				
			
			@ -271,12 +265,6 @@ async def run_fsp_ui(
 | 
			
		|||
                **conf.get('chart_kwargs', {})
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            # XXX: ONLY for sub-chart fsps, overlays have their
 | 
			
		||||
            # data looked up from the chart's internal array set.
 | 
			
		||||
            # TODO: we must get a data view api going STAT!!
 | 
			
		||||
            chart._shm = shm
 | 
			
		||||
            chart._flows[chart.data_key].shm = shm
 | 
			
		||||
 | 
			
		||||
            # should **not** be the same sub-chart widget
 | 
			
		||||
            assert chart.name != linkedsplits.chart.name
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -626,7 +614,7 @@ async def open_vlm_displays(
 | 
			
		|||
        shm = ohlcv
 | 
			
		||||
        chart = linked.add_plot(
 | 
			
		||||
            name='volume',
 | 
			
		||||
            array=shm.array,
 | 
			
		||||
            shm=shm,
 | 
			
		||||
 | 
			
		||||
            array_key='volume',
 | 
			
		||||
            sidepane=sidepane,
 | 
			
		||||
| 
						 | 
				
			
			@ -639,7 +627,6 @@ async def open_vlm_displays(
 | 
			
		|||
            # the curve item internals are pretty convoluted.
 | 
			
		||||
            style='step',
 | 
			
		||||
        )
 | 
			
		||||
        chart._flows['volume'].shm = ohlcv
 | 
			
		||||
 | 
			
		||||
        # force 0 to always be in view
 | 
			
		||||
        def maxmin(
 | 
			
		||||
| 
						 | 
				
			
			@ -666,11 +653,6 @@ async def open_vlm_displays(
 | 
			
		|||
        # chart.hideAxis('right')
 | 
			
		||||
        # chart.showAxis('left')
 | 
			
		||||
 | 
			
		||||
        # XXX: ONLY for sub-chart fsps, overlays have their
 | 
			
		||||
        # data looked up from the chart's internal array set.
 | 
			
		||||
        # TODO: we must get a data view api going STAT!!
 | 
			
		||||
        chart._shm = shm
 | 
			
		||||
 | 
			
		||||
        # send back new chart to caller
 | 
			
		||||
        task_status.started(chart)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -685,9 +667,9 @@ async def open_vlm_displays(
 | 
			
		|||
 | 
			
		||||
        last_val_sticky.update_from_data(-1, value)
 | 
			
		||||
 | 
			
		||||
        vlm_curve = chart.update_graphics_from_array(
 | 
			
		||||
        vlm_curve = chart.update_graphics_from_flow(
 | 
			
		||||
            'volume',
 | 
			
		||||
            shm.array,
 | 
			
		||||
            # shm.array,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # size view to data once at outset
 | 
			
		||||
| 
						 | 
				
			
			@ -795,9 +777,8 @@ async def open_vlm_displays(
 | 
			
		|||
                        color = 'bracket'
 | 
			
		||||
 | 
			
		||||
                    curve, _ = chart.draw_curve(
 | 
			
		||||
                        # name='dolla_vlm',
 | 
			
		||||
                        name=name,
 | 
			
		||||
                        data=shm.array,
 | 
			
		||||
                        shm=shm,
 | 
			
		||||
                        array_key=name,
 | 
			
		||||
                        overlay=pi,
 | 
			
		||||
                        color=color,
 | 
			
		||||
| 
						 | 
				
			
			@ -812,7 +793,6 @@ async def open_vlm_displays(
 | 
			
		|||
                    # ``.draw_curve()``.
 | 
			
		||||
                    flow = chart._flows[name]
 | 
			
		||||
                    assert flow.plot is pi
 | 
			
		||||
                    flow.shm = shm
 | 
			
		||||
 | 
			
		||||
            chart_curves(
 | 
			
		||||
                fields,
 | 
			
		||||
| 
						 | 
				
			
			@ -847,7 +827,9 @@ async def open_vlm_displays(
 | 
			
		|||
            # liquidity events (well at least on low OHLC periods - 1s).
 | 
			
		||||
            vlm_curve.hide()
 | 
			
		||||
            chart.removeItem(vlm_curve)
 | 
			
		||||
            chart._flows.pop('volume')
 | 
			
		||||
            vflow = chart._flows['volume']
 | 
			
		||||
            vflow.render = False
 | 
			
		||||
 | 
			
		||||
            # avoid range sorting on volume once disabled
 | 
			
		||||
            chart.view.disable_auto_yrange()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue