一个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然后在这个图形上显示一下以便深入理解其原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/484560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

plSql 大批量数据导入到表中

主要2种思路,一为insert插入sql,二是借助plsql提供的工具 insert语句odbc importer/导入器 insert语句 把要插入的数据转为insert语句,直接复制到plsql的sql窗口,运行即可;或者在命令行窗口回车键,选择要执…

使用 RunwayML 对图像进行 Camera 操作

RunwayML 是一個功能強大的平台,可以讓您使用 AI 和机器学习来增强您的图像和视频。 它提供一系列预训练模型,可用于各种任务,包括图像编辑、风格化和特效。 在本文中,我们将介绍如何使用 RunwayML 对图像进行 Camera 操作。我们…

[AIGC] SQL中的数据添加和操作:数据类型介绍

SQL(结构化查询语言)作为一种强大的数据库查询和操作工具,它能够完成从简单查询到复杂数据操作的各种任务。在这篇文章中,我们主要讨论如何在SQL中添加(插入)数据,以及在数据操作过程中&#xf…

数据结构(五)——树森林

5.4 树和森林 5.4.1 树的存储结构 树的存储1:双亲表示法 用数组顺序存储各结点,每个结点中保存数据元素、指向双亲结点(父结点)的“指针” #define MAX_TREE_SIZE 100// 树的结点 typedef struct{ElemType data;int parent; }PTNode;// 树的类型 type…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog !

关于安卓调用文件浏览器(一)打开并复制

背景 最近在做一个硬件产品,安卓应用开发。PM抽风,要求从app打开文件浏览器,跳转到指定目录,然后可以实现文件复制粘贴操作。 思考 从应用开发的角度看,从app打开系统文件浏览器并且选择文件,这是很常见…

馆室一体化查档平台制度有哪些

馆室一体化查档平台制度是指图书馆或档案馆在数字化和信息化的背景下,建立起的集查阅、借阅、咨询、文献传递等多项功能于一体的平台制度。下面是一些常见的馆室一体化查档平台制度: 1. 馆藏管理制度:包括图书和档案的采购、编目、分类、整理…

那些王道书里的题目-----计算机网络篇

注:仅记录个人认为有启发的题目 p155 34.下列四个地址块中,与地址块 172.16.166.192/26 不重叠,且与172.16.166.192/26聚合后的地址块不会引入多余地址的是() A.172.16.166.192/27 B.172.16.166.128/26 …

day06vue2学习

day06 路由的封装抽离 问题:所有的路由配置都堆在main.js中不太合适么?不好,会加大代码的复杂度 目标:将路由模块抽离出来。好处:差分模块,利于维护。 大致的做法就是,将路由相关的东西都提…

codeTop102:二叉树的层序遍历

前言 在已知BFS的方式后,知道每次从队列中取一个节点,就要将这个节点的所有子节点按照顺序放入队列。 难点在于怎么确定将同一层的节点放在一个数组里面的输出,也就是输出一个二维数组? 解决方法: 每次while循环将队列上轮放入的…

蓝桥集训之矩形牛棚

蓝桥集训之矩形牛棚 核心思想&#xff1a;单调队列 模板&#xff1a;Acwing.131.直方图矩形面积首先遍历所有下界 然后确定以该下界为底的直方图 求最大矩形 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 30…

Java学习day2

命名规则 在JAVA中&#xff0c;公共类的明朝必须与包含该类的源文件的文件名向匹配&#xff0c;即 这两个名称要一致 变量类型 与c/c基本一致 需要注意的是&#xff0c;long类型的数据在后面需要加上l或L&#xff08;建议加L&#xff0c;l可能会被误判&#xff09;&#xff…

【Redis】优惠券秒杀

全局唯一ID 全局唯一ID生成策略&#xff1a; UUIDRedis自增snowflake算法数据库自增 Redis自增ID策略&#xff1a;每天一个key&#xff0c;方便统计订单量ID构造是 时间戳 计数器 Component public class RedisIdWorker {// 2024的第一时刻private static final long BEGIN…

【C语言】编译和链接----预处理详解【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

易语言学习第一天(安装破解和配置)

一、引言 易语言是一个自主开发&#xff0c;适合国情&#xff0c;不同层次不同专业的人员易学易用的汉语编程语言。易语言降低了广大电脑用户编程的门槛&#xff0c;尤其是根本不懂英文或者英文了解很少的用户&#xff0c;可以通过使用本语言极其快速地进入Windows程序编写的大…

全新的分布式锁,功能简单且强大

分布式锁是分布式系统中一个极为重要的工具。 目前有多种分布式锁的设计方案&#xff0c;比如借助 redis&#xff0c;mq&#xff0c;数据库&#xff0c;zookeeper 等第三方服务系统来设计分布式锁。 tldb 提供的分布式锁&#xff0c;主要是要简化这个设计的过程&#xff0c;提…

安全之剑:深度解析 Apache Shiro 框架原理与使用指南

在现代软件开发中&#xff0c;安全性一直是至关重要的一个方面。随着网络攻击和数据泄露的不断增加&#xff0c;我们迫切需要一种强大而灵活的安全框架来保护我们的应用。Shiro框架就是这样一把利剑&#xff0c;它能够轻松地集成到你的项目中&#xff0c;为你的应用提供可靠的安…

用户增长的底层逻辑:从原理到实践

在互联网行业的洪流中&#xff0c;用户增长被视为企业生命力与竞争力的重要标志。理解并掌握用户增长的底层逻辑&#xff0c;是每一位产品经理、市场营销人员以及创业者不可或缺的基本功。 用户增长的底层逻辑&#xff1a;从原理到实践© 由 ZAKER科技 提供 一、用户增长的…

02.percona Toolkit工具pt-archiver命令实践

1.命令作用 Percona Toolkit有的32个命令&#xff0c;可以分为7大类 工具类别 工具命令 工具作用 备注 开发类 pt-duplicate-key-checker 列出并删除重复的索引和外键 pt-online-schema-change 在线修改表结构 pt-query-advisor 分析查询语句&#xff0c;并给出建议&#x…

深度学习知识点:神经网络

深度学习知识点&#xff1a;神经网络 前言神经网络激活函数的优缺点为什么ReLU常用于神经网络的激活函数&#xff1f;梯度消失和梯度爆炸的解决方案&#xff1f;梯度爆炸引发的问题&#xff1f;如何确定是否出现梯度爆炸&#xff1f;神经网络中有哪些正则化技术&#xff1f;批量…