VeighNa量化社区
你的开源社区量化交易平台
Member
加入于:
帖子: 59
声望: 8

1,chart\widget.py 的 Chartwidget里的add_plot方法, 有一个信号是view.sigXRangeChanged.connect(self._update_y_range), 第一个疑问是这里是指什么样类型的信号,如果只是实时更新K线图,但是不用滚轮或者方向键缩放,会触发这个信号吗?

2,plot.setRange(tuple)和 plot.setLimits(xmin,xmax,ymin,ymax)的区别是啥,两个都是设置区域的吧, 为啥在update_y_range的时候用setRange(),而在_update_plot_limits的时候要用setLimits?

3,用滚轮缩放图表,或者因为实时行情更新图表导致的图标拉伸压缩, 从代码来看应该是view的拉伸导致CandleItem和VolumeItem被缩放,我现在的想法是实现candleitem等图元不要因为行情的更新被夸张的缩放,而是保持一种和X轴同样比例的缩放,举个例子, 我想绘制收盘价为一个方形的点,但是按照社区版的例子,这个方形点会随着行情变化被拉伸成长长的柱子,怎么样才能实现方形的点一直保持为正方形而不随着行情变化被拉伸成矩形,而让纵坐标刻度区间增长或者减短用以维持在行情跨度太大的情况下的正方形point展示?我用drawPoint试了一下,仍旧会被拉伸, 所以从图元出发不可行, 还得从view出发

Member
加入于:
帖子: 59
声望: 8

自问自答: 已解决
def _update_y_range(self) -> None:
"""
Update the y-axis range of plots.
"""
view: pg.ViewBox = self._first_plot.getViewBox()
view_range: list = view.viewRange()
self.trader.main_engine.write_log(f"view_range:{view_range}")

    min_ix: int = max(0, int(view_range[0][0]))
    max_ix: int = min(self._manager.get_count(), int(view_range[0][1]))
    ix_count: int = max_ix - min_ix
    self.trader.main_engine.write_log(f"x索引为:{min_ix, max_ix}")

    # Update limit for y-axis
    for item, plot in self._item_plot_map.items():
        if plot is not self._first_plot:
            plot.setRange(yRange=item.get_y_range(min_ix,max_ix))
            continue
        y_range: tuple = item.get_y_range(min_ix, max_ix)
        median: float = (y_range[0] + y_range[1]) / 2
        rect = view.sceneBoundingRect()
        rect_ratio = rect.width()/rect.height()

        self.trader.main_engine.write_log(f"aspect_radio:{rect_ratio}")
        down_limit = median - ix_count/2/rect_ratio
        up_limit = median + ix_count/2/rect_ratio
        plot.setRange(yRange=(down_limit,up_limit))
Member
avatar
加入于:
帖子: 1446
声望: 102

守望长城2020-6-11-艾瑞巴蒂 wrote:

1,chart\widget.py 的 Chartwidget里的add_plot方法, 有一个信号是view.sigXRangeChanged.connect(self._update_y_range), 第一个疑问是这里是指什么样类型的信号,如果只是实时更新K线图,但是不用滚轮或者方向键缩放,会触发这个信号吗?

2,plot.setRange(tuple)和 plot.setLimits(xmin,xmax,ymin,ymax)的区别是啥,两个都是设置区域的吧, 为啥在update_y_range的时候用setRange(),而在_update_plot_limits的时候要用setLimits?

3,用滚轮缩放图表,或者因为实时行情更新图表导致的图标拉伸压缩, 从代码来看应该是view的拉伸导致CandleItem和VolumeItem被缩放,我现在的想法是实现candleitem等图元不要因为行情的更新被夸张的缩放,而是保持一种和X轴同样比例的缩放,举个例子, 我想绘制收盘价为一个方形的点,但是按照社区版的例子,这个方形点会随着行情变化被拉伸成长长的柱子,怎么样才能实现方形的点一直保持为正方形而不随着行情变化被拉伸成矩形,而让纵坐标刻度区间增长或者减短用以维持在行情跨度太大的情况下的正方形point展示?我用drawPoint试了一下,仍旧会被拉伸, 所以从图元出发不可行, 还得从view出发

  1. 应该会的,只要出现了新的一根K线 ,就触发了x轴变化
  2. setRange是设置当前可见的显示范围,setLimits是设计整个图表的显示范围,具体可以参考这里:https://pyqtgraph.readthedocs.io/en/latest/api_reference/graphicsItems/viewbox.html
  3. 修改Y轴的整个坐标映射规则,这个需要自己研究下了
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】