一个python实现的kline-chart图表程序(二)

前面一中简单介绍了kline-chart的图表程序,实际上这个程序最主要的功能不是显示K线,因为显示K线的程序太多了,没必要专门重写,这个程序最主要的功能是根据需要显示包含K线在内的各种指标,自己算的指标,或是不知道怎么算,但别人算出来的指标数据,甚至是买卖点,只要按一定格式存储进来,然后在配置文件中标记一下,即可以将K线,指标组合,何时买入,何时卖出的标记在图上显示出来,先给出一个自己计算MA20,MA60的指标,再加上一个存在的MACD指标数据(这个是在别处生成的,在这儿直接加载进来即可),组合在一起显示出来的效果如下:

一、分析结构:

从图上看,本程序应该有三个plot,第1个plot的大小是尽可能大,因此配置的参数max_height=0,第2个和第3个类似于股票软件中的副图指标,因此指定大小max_height=120.

然后每个plot中可以叠加不同的图形,如第1个plot中为一个K线图叠加了一个均线图,第2个plot中是macd图,第3个是成交量图

另外,前面也说了,均线是要自己计算的,成交量也是需要从K线中提取的,这些需要自己计算的一般在配置文件中均会提供回调函数,然后由该函数计算出数据以供画图,而macd图则是外部算好后以文件的形式提供给程序画出来,会在配置中提供对应的文件路径:

以下展示对应的配置:

当然,如果你只想显示2栏,最后一栏不想要的话,直接把plot[2]对应的数据都删掉即可。

程序稍有一点点复杂,后面看有没有机会将指标写成插件的形式,使得只想用的人直接写自己对应的代码即可。

二、简单介绍:

1、主调用:

这个相对简单,调用PySide6的组件QtWidgets,然后加载主窗口即可

if __name__ == '__main__':
    init_logger("info")
    logger.info(conf)

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(1024, 768)
    w.show()
    app.exec()

2、图形核心代码:

继承于ChartBase的各种图形的实现类,如ChartCandle(K线图类),ChartLine(曲线图类,可用于显示均线等各种曲线),ChartMacd(专们用来显示macd图形),ChartVolume(显示成交量图形),ChartStraight(显示直接,射线,线段图形),ChartSignal(显示买卖信号图形)等

展示一下如何画K线的:
    def _draw_bar_picture(self, ix: int, old_bar: DataItem, bar: DataItem) -> QtGui.QPicture:
        """"""
        # Create objects
        candle_picture = QtGui.QPicture()
        painter = QtGui.QPainter(candle_picture)
        # 1 open
        # 2 high
        # 3 low
        # 4 close
        # Set painter color
        if bar[4] > bar[1]:  # bar.close_price >= bar.open_price:
            painter.setPen(self._up_pen)
            painter.setBrush(self._black_brush)
        else:
            painter.setPen(self._down_pen)
            painter.setBrush(self._down_brush)

        # Draw candle shadow
        if bar[2] > bar[3]:  # bar.high_price > bar.low_price:
            painter.drawLine(
                QtCore.QPointF(ix, bar[2]),
                QtCore.QPointF(ix, bar[3])
            )

        # Draw candle body
        if bar[1] == bar[4]:  # bar.open_price == bar.close_price:
            painter.drawLine(
                QtCore.QPointF(ix - BAR_WIDTH, bar[1]),
                QtCore.QPointF(ix + BAR_WIDTH, bar[1]),
            )
        else:
            rect = QtCore.QRectF(
                ix - BAR_WIDTH,
                bar[1],
                BAR_WIDTH * 2,
                bar[4] - bar[1]
            )
            painter.drawRect(rect)

        # Finish
        painter.end()
        return candle_picture

看到,如果 收盘>开盘,则设置上涨色,否则设置下跌色,然后再从最高画到最低,上下影线,然后通过QtCore.QRectF画K线的实体部分,当bar[1]==bar[4]时,即开盘等于收盘,就不需要画实体框,只需要横着画一条线即可painter.drawLine。

3、两个回调函数:

def calc_volumes(klines: list[KLine]):
    bars = {}
    for k in klines:
        dt = datetime.fromtimestamp(k.time)
        bars[dt] = [dt, k.volume]
    return bars

从K线中获取成交量,然后丢给前端显示

def calc_ma20_60(klines: list[KLine]):
    bars = {}
    MA20, MA60 = MA(20), MA(60)
    for k in klines:
        dt = datetime.fromtimestamp(k.time)
        MA20.input(k.close)
        MA60.input(k.close)
        bars[dt] = [dt, MA20.ma, MA60.ma]
    return bars

计算出M20,M60值,然后丢给前端显示

前面两个函数是需要自己实现的,如果有更复杂的实现,比如kdj的计算,就需要自己按以上方法写一个,然后在配置文件中配上对应的函数名即可。

更多的细节可查看源代码,已经上传于资源中。https://download.csdn.net/download/luhouxiang/89026271

最后,说一下,写这个文章只是想找一些对量化交易有兴趣的朋友一起研究研究算法,顺便把这个程序完善一下,使之更好的服务于量化算法。

到此,本程序应该是够用了,下周有空估计会把MT5上的ZigZag即波峰波谷的代码研究一下,先转成python然后在这个图形上显示一下以便深入理解其原理。

关于资源的说明:

有网友说运行不了,报获取不到配置文件,经检查是最后上传的时候应该是动到了相关的配置,如下:

1. kline-chart\klinechart\trader\config.py的修改:

原先的:conf = load_yaml("../etc/config.yaml")

修改为:conf = load_yaml("etc/config.yaml")

2. kline-chart\etc\config.yaml的修改:

原先的:file_name: ../data/candle.txt

修改为:file_name: data/candle.txt

原先的:file_name: ../data/MA.txt

修改为:file_name: data/MA.txt

原先的:file_name: ../data/MACD12.26.9.txt

修改为:file_name: data/MACD12.26.9.txt

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Python语言中的requests库来获取雪球网股票数据。下面是一个示例程序,可以请求并获取雪球网股票数据:# 导入requests库 import requests# 设置雪球网股票的URL url = "https://xueqiu.com/v4/stock/quote.json?code=SH600004"# 发送HTTP请求,获取股票数据 response = requests.get(url)# 解析响应数据 data = response.json()# 打印股票数据 print(data) ### 回答2: 以下是一个使用Python获取雪球网股票数据的示例程序,我已经添加了中文注释以帮助您理解代码的功能。 ```python import requests import json def get_stock_data(stock_code): # 构建请求的URL,其中stock_code参数为股票代码 url = f"https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol={stock_code}&begin=0&period=day&type=before&count=-142&indicator=kline" # 发起GET请求获取响应 response = requests.get(url) # 解析响应中的JSON数据 data = json.loads(response.text) # 提取需要的股票数据 klines = data['data']['item'] for kline in klines: timestamp = kline[0] close_price = kline[5] print(f"时间戳:{timestamp},收盘价:{close_price}") # 测试程序 stock_code = "AAPL" # 股票代码,这里以苹果公司(AAPL)为例 get_stock_data(stock_code) ``` 此程序使用requests库发起HTTP请求,并使用json库解析响应中的JSON数据。它通过构建URL来获取股票数据,并从响应中提取出时间戳和收盘价等信息。您可以将`stock_code`变量设置为您想要获取数据的股票代码,然后运行程序即可获取相应的股票数据。请确保在运行程序之前已安装必要的依赖库。 ### 回答3: 下面是一个Python编写的获取雪球网股票数据的程序,并附有中文注释: ```python import requests import json # 设置要获取股票数据的URL url = "https://stock.xueqiu.com/v5/stock/chart/kline.json" # 设置请求头,添加User-Agent以模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } # 设置请求参数,比如股票代码、起始日期、结束日期、数据类型等 params = { "symbol": "SH600000", # 中国银行的股票代码 "begin": "20210101", # 起始日期 "end": "20210531", # 结束日期 "period": "day", # 数据类型为日线 "type": "before", # before表示取得起始日期前的数据,如果是after则表示取得起始日期之后的数据 "indicator": "kline", # 指标为K线图 "extend": "true", # 使用复权因子 } # 发送GET请求,获取股票数据 response = requests.get(url, headers=headers, params=params) data = response.json() # 解析股票数据 chart_list = data["data"]["item"] for item in chart_list: date = item[0] # 日期 open_price = item[1] # 开盘价 close_price = item[2] # 收盘价 high_price = item[3] # 最高价 low_price = item[4] # 最低价 # 打印股票数据 print(f"日期:{date},开盘价:{open_price},收盘价:{close_price},最高价:{high_price},最低价:{low_price}") ``` 上述程序通过发送GET请求,从雪球网获取指定股票的K线数据,然后解析并打印出各个日期的开盘价、收盘价、最高价和最低价。你可以根据需要修改股票代码、起始日期、结束日期等参数来获取不同的股票数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值