如何(c++,js)写一个传统的K线图和走势图5 - 移动筹码图

14 篇文章 1 订阅

下图就是一般传统行情软件的移动筹码图。 左边是一个K线图,右边是一个移动筹码图, 鼠标在K线上移动的时候,右边的筹码图就显示当前K线数据下的筹码分布信息。随着鼠标在K线上移动, 右边的筹码图是动态变化的。

先看下筹码概念吧 (了解下就可以了)

筹码分析即成本分析,基于流通盘是固定的。

采集当前所得k线进行计算。

价格按照0到100分布。

筹码分布计算原理  

筹码分布计算的基础要素,有三个
第一个是流通股本,第二个是成交量,第三个是换手率。

成本集中度是一个很重要的数值,这个数值理论上在0到100之间,成本集中度这个数值越小,表明这个股票的成本越集中,这个集中指的是持有这个股票的投资者不管是谁,持有者的股票成本相差不大;反之,如果股票的成本集中度的度值越大,表明股票筹码的成本越分散,这个分散,指的是各股票持有者手中的股票成本相差较大。

成本集中度计算方法:该成本区域内(高价低价差)除以(高价低价和)。

成本算法:

每日成本算法是一个移动平均过程,公式是:当日成本*(换手率*历史换手衰减系数)+上一日成本分布图*1-换手率*历史换手衰减系数)。

平均分布:当日换手的证券数在当日的最高价和最低价之间平均分配。

三角形分布:当日换手的证券数在当日的最高价、最低价和平均价之间三角形分配。

历史换手衰减系数:表示历史换手的递减速度,将多少倍数的当日换手率从昨日的成本分布中移走得到当日的成本分布图。无流通盘数据时用多少天成交量累加,无流通盘数据时用多少天成交量累加替代。

下面就开始讲怎么实现了。

需要的数据, 以日线数据来做例子, 
1. 基础数据 每天的 
   最高价
   最低价
   流通股本
   成交量
   成交金额
   史换手衰减系数 默认是1,可以外部设置的。
2. 衍生数据
   换手率=成交量/流通股本

数据准备好以后就可以开始计算了。

首先我们要获取到左边K线十字光标显示的日期(x轴)和价格(y轴), 如果当前没有十字光标, 日期就是当前屏的最后一个数据日期。价格就是当前屏的最后一个数据的收盘价

假设 当前K线上十字光标所在的日期 为xDate ,y轴对应的价格为yPrice , 这天地收盘价为 close

1. 计算每天移动筹码, 从xDate开始 已经计算到k线数据的第1天(倒叙循环)

公式:当天(N)的筹码=成交量*换手率
前一天筹码=当天筹码+(1-当天换手率*历史换手衰减系数)*前一天成交量
前二天筹码=当天筹码+(1-当天换手率*历史换手衰减系数)*前一天成交量+(1-前一天换手率*历史换手衰减系数)*前第二天成交量+
.....
一直计算到K线的第1天的数据, 这样每天的筹码就计算完成

 

2. 计算筹码分布 

  平均分布: 把每一天的筹码,根据每天的最高最低价,平均分布到[最高,最低]的价格区间内, 然后把每一天的价格区间里的筹码累加, 就得到了筹码分布

  三角分布: 算法和平均分布一样, 只是把每天的筹码根据三角分布到[最高,最低]的价格区间内

 计算得到 一个二维数组 [价格][筹码]

获利比例: 遍历二维数组 [价格][筹码] 价格<当前K线上十字光标所在的日期收盘价 的筹码累加 / 一共的筹码

XX处获利盘: 遍历二维数组 [价格][筹码] 价格<当前K线上十字光标Y轴对应价格 的筹码累加 / 一共的筹码

平均成本:遍历二维数组 [价格][筹码] 价格*筹码累加 / 一共的筹码

实例代码:https://github.com/jones2000/HQChart

deom:https://opensource.zealink.com/hqweb/demo/phone18.html

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个基本的C++实现,同时也包含了深度优先搜索(DFS)和广度优先搜索(BFS)的实现: ```C++ #include <iostream> #include <vector> #include <queue> using namespace std; // 定义节点结构体 struct GraphNode { int val; vector<GraphNode*> neighbors; GraphNode(int _val) : val(_val) {} }; // 深度优先搜索 void DFS(GraphNode* node, vector<bool>& visited) { visited[node->val] = true; cout << node->val << " "; for (auto neighbor : node->neighbors) { if (!visited[neighbor->val]) { DFS(neighbor, visited); } } } // 广度优先搜索 void BFS(GraphNode* node, vector<bool>& visited) { queue<GraphNode*> q; q.push(node); visited[node->val] = true; while (!q.empty()) { GraphNode* cur = q.front(); q.pop(); cout << cur->val << " "; for (auto neighbor : cur->neighbors) { if (!visited[neighbor->val]) { visited[neighbor->val] = true; q.push(neighbor); } } } } int main() { // 构造 vector<GraphNode*> graph(5); for (int i = 0; i < 5; i++) { graph[i] = new GraphNode(i); } graph[0]->neighbors.push_back(graph[1]); graph[0]->neighbors.push_back(graph[2]); graph[1]->neighbors.push_back(graph[3]); graph[2]->neighbors.push_back(graph[3]); graph[3]->neighbors.push_back(graph[4]); // 遍历 vector<bool> visited(5, false); cout << "DFS: "; DFS(graph[0], visited); cout << endl; visited.assign(5, false); cout << "BFS: "; BFS(graph[0], visited); cout << endl; return 0; } ``` 输出结果为: ``` DFS: 0 1 3 4 2 BFS: 0 1 2 3 4 ``` 希望这个例子能够帮助你理解和搜索的基本实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HQChart

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

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

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

打赏作者

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

抵扣说明:

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

余额充值