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