2 Star 3 Fork 2

michao/leve2Demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
K线图.py 11.20 KB
一键复制 编辑 原始数据 按行查看 历史
michao 提交于 2017-03-27 22:36 . K线
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QWidget, QApplication,QMainWindow,QHBoxLayout
from Public.RequestUtils import StocksRequest
# 绘制行情类
class K线图工具类(QWidget):
左侧补丁边距 = 45
右侧补丁边距 = 45
顶部补丁边距 = 25
底部补丁边距 = 1
总宽 = 左侧补丁边距 + 右侧补丁边距
总高 = 顶部补丁边距 + 底部补丁边距
主窗宽 = 0
主窗高 = 0
表格高度 = 0
表格宽度 = 0
def __init__(self, parent):
# 初始化
super(K线图工具类, self).__init__()
self.parent = parent
self.paint = QtGui.QPainter()
# 度量尺对象
self.metrics = self.paint.fontMetrics()
self.字体库 = dict()
self.字体库['默认字体'] = QtGui.QFont('Serif', 9, QtGui.QFont.Light)
self.字体库['雅黑加粗字体'] = QtGui.QFont('Serif', 12, QtGui.QFont.Bold)
self.字体库['雅黑字体'] = QtGui.QFont('Serif', 12, QtGui.QFont.Light)
self.设置当前字体('默认字体')
# 设置笔刷样式库
self.笔刷样式库 = dict()
# 红色 1px粗 1px点 2px距 线条
self.笔刷样式库['红色1px虚线'] = QtGui.QPen(QtCore.Qt.red, 1, QtCore.Qt.DashLine)
self.笔刷样式库['红色1px虚线'].setDashPattern([1, 2])
self.笔刷样式库['红色1px线'] = QtGui.QPen(QtCore.Qt.red, 1, QtCore.Qt.SolidLine)
self.笔刷样式库['白色1px线'] = QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine)
self.笔刷样式库['绿色1px线'] = QtGui.QPen(QtCore.Qt.green, 1, QtCore.Qt.SolidLine)
self.笔刷样式库['黄色1px线'] = QtGui.QPen(QtCore.Qt.yellow, 1, QtCore.Qt.SolidLine)
self.笔刷样式库['亮蓝1px线'] = QtGui.QPen(QtCore.Qt.cyan, 1, QtCore.Qt.SolidLine)
def 开始绘制(self):
self.绘制表格()
self.绘制表格上方的股票信息()
self.绘制K线()
self.绘制MACD()
self.绘制VOL()
def paintEvent(self, event):
# 获得窗口的长和宽
主窗口大小 = self.parent.size()
self.主窗宽 = 主窗口大小.width()
self.主窗高 = 主窗口大小.height()
self.表格高度 = self.主窗高 - self.总高
self.表格宽度 = self.主窗宽 - self.总宽
self.paint.begin(self)
self.开始绘制()
self.paint.end() # 结束
def 绘制表格(self):
self.设置当前笔刷('红色1px线')
self.paint.setBrush(QtCore.Qt.NoBrush)
self.paint.drawRect(0, 0, self.主窗宽 - 1, self.主窗高 - 1)
# 画分主边框
self.paint.drawRect(self.左侧补丁边距, self.顶部补丁边距, self.主窗宽 - self.总宽, self.主窗高 - self.总高)
# 成交量和走势的分界线(成交量和走势三七割)
self.paint.drawLine(self.左侧补丁边距, self.表格高度 * 0.6 + self.顶部补丁边距, self.主窗宽 - self.右侧补丁边距,
self.表格高度 * 0.6 + self.顶部补丁边距)
self.paint.drawLine(self.左侧补丁边距, self.表格高度 * 0.8 + self.顶部补丁边距, self.主窗宽 - self.右侧补丁边距,
self.表格高度 * 0.8 + self.顶部补丁边距)
def 设置当前字体(self, code='默认字体'):
self.paint.setFont(self.字体库[code])
def 设置当前笔刷(self, code='default'):
self.paint.setPen(self.笔刷样式库[code])
def 绘制表格上方的股票信息(self):
self.设置当前笔刷('黄色1px线')
self.paint.drawText(4 + self.左侧补丁边距, self.顶部补丁边距 - 4, str(self.parent.股票数据['股票名称'])) # 股票名称
self.paint.drawText(4 + self.左侧补丁边距 + 140, self.顶部补丁边距 - 4, str('昨收:'))
self.paint.drawText(4 + self.左侧补丁边距 + 240, self.顶部补丁边距 - 4, str('今开:'))
self.paint.drawText(4 + self.左侧补丁边距 + 340, self.顶部补丁边距 - 4, str('今收:'))
self.paint.drawText(4 + self.左侧补丁边距 + 440, self.顶部补丁边距 - 4, str('涨跌:'))
昨收 = self.parent.股票数据['上一个交易日收盘价']
今收 = self.parent.股票数据['当前价']
if 昨收 > 今收:
self.设置当前笔刷('绿色1px线')
if 昨收 == 今收:
self.设置当前笔刷('白色1px线')
if 昨收 < 今收:
self.设置当前笔刷('红色1px虚线')
self.paint.drawText(4 + self.左侧补丁边距 + 180, self.顶部补丁边距 - 4, str(昨收))
self.paint.drawText(4 + self.左侧补丁边距 + 280, self.顶部补丁边距 - 4, str('%.2f' % self.parent.股票数据['开盘价']))
self.paint.drawText(4 + self.左侧补丁边距 + 380, self.顶部补丁边距 - 4, str('%.2f' % self.parent.股票数据['当前价']))
self.paint.drawText(4 + self.左侧补丁边距 + 480, self.顶部补丁边距 - 4, str(self.parent.股票数据['涨跌']))
def 绘制K线(self):
_最高价 = self.parent.股票数据['K线数据']['周期最高价'] + 2
_最低价 = self.parent.股票数据['K线数据']['周期最低价']-1.5
mCandleWidth = (self.表格宽度)/ len(self.parent.股票数据['K线数据']['日K线数据']) ;
_rate = (self.表格高度 * 0.6 ) / (_最高价 - _最低价)
i = 0
五日路径 = QtGui.QPainterPath()
十日路径 = QtGui.QPainterPath()
二十日路径 = QtGui.QPainterPath()
三十日路径 = QtGui.QPainterPath()
for _K线数据 in self.parent.股票数据['K线数据']['日K线数据']:
open = ( _最高价- _K线数据['开盘价']) * _rate + self.顶部补丁边距
close = (_最高价 - _K线数据['收盘价']) * _rate + self.顶部补丁边距
high = (_最高价 - _K线数据['最高价']) * _rate + self.顶部补丁边距
low = (_最高价- _K线数据['最低价']) * _rate + self.顶部补丁边距
left = mCandleWidth * i + self.左侧补丁边距
right = mCandleWidth * (i + 1) + self.左侧补丁边距
startX = right - (mCandleWidth ) / 2
if open < close:
self.设置当前笔刷('绿色1px线')
self.paint.fillRect(left, close, mCandleWidth,open-close,QtCore.Qt.green)
self.paint.drawLine(startX, low, startX,high )
self.paint.drawLine(startX, open, startX, close)
elif open == close:
self.paint.drawLine(left, open, right, open)
self.paint.drawLine(startX, high, startX, low)
else:
self.设置当前笔刷('红色1px线')
self.paint.fillRect(left, open, mCandleWidth,close-open,QtCore.Qt.red)
self.paint.drawLine(startX, high, startX, low)
self.paint.drawLine(startX, close, startX, open)
w = i * mCandleWidth + self.左侧补丁边距
y1 = (_最高价 - _K线数据['5日']) * _rate + self.顶部补丁边距
y2 = (_最高价 - _K线数据['10日']) * _rate + self.顶部补丁边距
y3 = (_最高价 - _K线数据['20日']) * _rate + self.顶部补丁边距
y4 = (_最高价 - _K线数据['30日']) * _rate + self.顶部补丁边距
y1 = y1 if y1 > self.顶部补丁边距 else self.顶部补丁边距+2
y2 = y2 if y2 > self.顶部补丁边距 else self.顶部补丁边距+2
y3 = y3 if y3 > self.顶部补丁边距 else self.顶部补丁边距+2
y4 = y4 if y4 > self.顶部补丁边距 else self.顶部补丁边距+2
if i == 0:
五日路径.moveTo(w, y1)
十日路径.moveTo(w, y2)
二十日路径.moveTo(w, y3)
三十日路径.moveTo(w, y4)
五日路径.lineTo(w, y1)
十日路径.lineTo(w, y2)
二十日路径.lineTo(w, y3)
三十日路径.lineTo(w, y4)
i += 1
self.paint.drawPath(五日路径)
self.设置当前笔刷('黄色1px线')
self.paint.drawPath(十日路径)
self.设置当前笔刷('亮蓝1px线')
self.paint.drawPath(二十日路径)
self.设置当前笔刷('白色1px线')
self.paint.drawPath(三十日路径)
def 绘制VOL(self):
_当前最高成交量 = self.parent.股票数据['K线数据']['周期成交量高值']
_K线表格高度 = ((self.表格高度 + self.顶部补丁边距 ) * 0.8)
w_radio = (self.表格宽度) / len(self.parent.股票数据['K线数据']['日K线数据'])
h_radio = (_K线表格高度 * 0.2) / _当前最高成交量
y = _K线表格高度 + 5
self.设置当前笔刷('黄色1px线')
for i in range(0, len(self.parent.股票数据['K线数据']['日K线数据'])):
x = i * w_radio + self.左侧补丁边距
y2 = h_radio * self.parent.股票数据['K线数据']['日K线数据'][i]['成交量']
if(self.parent.股票数据['K线数据']['日K线数据'][i]['开盘价'] > self.parent.股票数据['K线数据']['日K线数据'][i]['收盘价']):
self.paint.fillRect(x, y , w_radio, -y2, QtCore.Qt.green)
else:
self.paint.fillRect(x, y , w_radio, -y2,QtCore.Qt.red)
def 绘制MACD(self):
_最高 = self.parent.股票数据['K线数据']['周期MACD高值']
_最低 = self.parent.股票数据['K线数据']['周期MACD低值']
_K线表格高度 = ((self.表格高度 + self.顶部补丁边距) * 0.85)
_rate = (_K线表格高度 * 0.15) / (_最高 - _最低);
w_radio = (self.主窗宽 - self.总宽)/ len(self.parent.股票数据['K线数据']['日K线数据']) ;
_dif = QtGui.QPainterPath()
_dea = QtGui.QPainterPath()
_zero = _K线表格高度 + (_最高*_rate)
if _zero < _K线表格高度:
_zero=_K线表格高度 +20
i = 0
for _K线数据 in self.parent.股票数据['K线数据']['日K线数据']:
top = ((_最高 - _K线数据['macd']) * _rate) + _K线表格高度
x = self.左侧补丁边距 + w_radio * i
if _K线数据['macd'] > 0:
self.设置当前笔刷('红色1px线')
self.paint.drawLine( x, top ,x ,_zero)
else:
self.设置当前笔刷('绿色1px线')
bottom = ((_最高 - _K线数据['macd']) * _rate) +_K线表格高度
self.paint.drawLine(x, _zero, x, bottom)
w = i * w_radio + self.左侧补丁边距
y1 = (_最高 - _K线数据['dif']) * _rate + _K线表格高度
y2 = (_最高 - _K线数据['dea']) * _rate + _K线表格高度
if i==0:
_dif.moveTo(w,y1)
_dea.moveTo(w,y2)
_dif.lineTo(w, y1)
_dea.lineTo(w, y2)
i=i+1
self.设置当前笔刷('黄色1px线')
self.paint.drawPath(_dif)
self.设置当前笔刷('亮蓝1px线')
self.paint.drawPath(_dea)
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/fastmc/leve2Demo.git
git@gitee.com:fastmc/leve2Demo.git
fastmc
leve2Demo
leve2Demo
master

搜索帮助