Stochastic指标(KDJ)指标c++语言写法
下面是一个简单的C++实现 kdj 函数的示例。KDJ 指标是基于随机指标(Stochastic)的一种扩展,通常用于技术分析。它由 K、D 和 J 三个值组成。以下是一个基础实现:**** Hidden Message ***** 另一个版本计算方式:[code]
#include <iostream>
#include <vector>
#include <algorithm> // For std::min_element and std::max_element
using namespace std;
// 计算最低价和最高价的范围
void calculateHighLow(const vector<double>& highs, const vector<double>& lows, int period, vector<double>& highest, vector<double>& lowest) {
for (size_t i = 0; i < highs.size(); ++i) {
if (i < period - 1) {
highest.push_back(0);
lowest.push_back(0);
} else {
double maxHigh = *max_element(highs.begin() + i - period + 1, highs.begin() + i + 1);
double minLow = *min_element(lows.begin() + i - period + 1, lows.begin() + i + 1);
highest.push_back(maxHigh);
lowest.push_back(minLow);
}
}
}
// 计算 KDJ 指标
void calculateKDJ(const vector<double>& closes, const vector<double>& highs, const vector<double>& lows, int period, double smoothingFactor) {
vector<double> highest, lowest, rsv, kValues, dValues, jValues;
// 计算最高价和最低价
calculateHighLow(highs, lows, period, highest, lowest);
// 计算 RSV
for (size_t i = 0; i < closes.size(); ++i) {
if (i < period - 1) {
rsv.push_back(0);
} else {
double range = highest[i] - lowest[i];
rsv.push_back(range == 0 ? 0 : (closes[i] - lowest[i]) / range * 100);
}
}
// 初始化 K 和 D 值
kValues.push_back(50); // 通常初始值设置为 50
dValues.push_back(50);
// 迭代计算 K 和 D 值
for (size_t i = 1; i < rsv.size(); ++i) {
double k = smoothingFactor * rsv[i] + (1 - smoothingFactor) * kValues.back();
double d = smoothingFactor * k + (1 - smoothingFactor) * dValues.back();
kValues.push_back(k);
dValues.push_back(d);
}
// 计算 J 值
for (size_t i = 0; i < kValues.size(); ++i) {
double j = 3 * kValues[i] - 2 * dValues[i];
jValues.push_back(j);
}
// 输出结果
cout << "Index\tClose\tK\tD\tJ" << endl;
for (size_t i = 0; i < closes.size(); ++i) {
cout << i << "\t" << closes[i] << "\t" << kValues[i] << "\t" << dValues[i] << "\t" << jValues[i] << endl;
}
}
int main() {
// 示例数据
vector<double> closes = {1.0, 1.1, 1.2, 1.1, 1.0, 1.3, 1.4, 1.5, 1.6, 1.7};
vector<double> highs = {1.1, 1.2, 1.3, 1.2, 1.1, 1.4, 1.5, 1.6, 1.7, 1.8};
vector<double> lows = {0.9, 1.0, 1.1, 1.0, 0.9, 1.2, 1.3, 1.4, 1.5, 1.6};
// 参数
int period = 9; // 计算周期
double smoothingFactor = 1.0 / 3.0; // 平滑系数 (通常为 1/3)
// 计算 KDJ
calculateKDJ(closes, highs, lows, period, smoothingFactor);
return 0;
}
[/code]代码说明
calculateHighLow 函数:
用于计算每个点在周期内的最高价和最低价。
calculateKDJ 函数:
按公式计算 RSV、K、D 和 J 值。
平滑因子默认使用 1/3。
数据说明:
closes 是收盘价序列。
highs 和 lows 分别是最高价和最低价序列。
输出结果:
每一行输出对应的收盘价、K 值、D 值和 J 值。
注意事项
数据量较小时(如不足一个周期),KDJ 值可能无法有效计算。
smoothingFactor 可根据需求调整平滑程度(通常为 1/3 或 1/2)。
你可以根据实际需求修改输入数据和参数配置以适应不同场景。 能成功计算出KDJ的程式 码[code]
#include <iostream>
#include <vector>
#include <deque> // 用于双端队列维护滑动窗口
// 股票数据结构
struct StockData {
double closePrice; // 收盘价
double highPrice; // 最高价
double lowPrice; // 最低价
};
// 计算 KDJ 指标
void calculateKDJ(const std::vector<StockData>& stockData, int period,
std::vector<double>& K, std::vector<double>& D, std::vector<double>& J) {
if (stockData.size() < period) {
std::cerr << "数据不足以计算 KDJ!" << std::endl;
return;
}
std::deque<int> highDeque; // 双端队列维护最高价索引
std::deque<int> lowDeque; // 双端队列维护最低价索引
double k = 50.0, d = 50.0; // 初始 K 和 D 值
for (size_t i = 0; i < stockData.size(); ++i) {
// 移除滑动窗口外的元素
if (!highDeque.empty() && highDeque.front() < static_cast<int>(i) - period + 1) {
highDeque.pop_front();
}
if (!lowDeque.empty() && lowDeque.front() < static_cast<int>(i) - period + 1) {
lowDeque.pop_front();
}
// 更新双端队列中的最大值和最小值
while (!highDeque.empty() && stockData[highDeque.back()].highPrice <= stockData[i].highPrice) {
highDeque.pop_back();
}
highDeque.push_back(static_cast<int>(i));
while (!lowDeque.empty() && stockData[lowDeque.back()].lowPrice >= stockData[i].lowPrice) {
lowDeque.pop_back();
}
lowDeque.push_back(static_cast<int>(i));
// 计算 RSV
if (i >= period - 1) {
double highestHigh = stockData[highDeque.front()].highPrice;
double lowestLow = stockData[lowDeque.front()].lowPrice;
double rsv = 0.0;
if (highestHigh != lowestLow) {
rsv = (stockData[i].closePrice - lowestLow) / (highestHigh - lowestLow) * 100.0;
}
// 更新 K 和 D
k = 2.0 / 3.0 * k + 1.0 / 3.0 * rsv;
d = 2.0 / 3.0 * d + 1.0 / 3.0 * k;
// 计算 J
double j = 3.0 * k - 2.0 * d;
// 保存结果
K.push_back(k);
D.push_back(d);
J.push_back(j);
} else {
// 数据不足时填充默认值
K.push_back(k);
D.push_back(d);
J.push_back(3.0 * k - 2.0 * d);
}
}
}
int main() {
// 示例股票数据
std::vector<StockData> stockData = {
{10, 15, 8}, {11, 16, 9}, {12, 17, 10}, {13, 18, 11},
{14, 19, 12}, {15, 20, 13}, {16, 21, 14}, {17, 22, 15},
{18, 23, 16}, {19, 24, 17}
};
int period = 5; // 计算周期
std::vector<double> K, D, J;
// 计算 KDJ
calculateKDJ(stockData, period, K, D, J);
// 输出结果
std::cout << "K值: ";
for (const auto& k : K) std::cout << k << " ";
std::cout << "\nD值: ";
for (const auto& d : D) std::cout << d << " ";
std::cout << "\nJ值: ";
for (const auto& j : J) std::cout << j << " ";
std::cout << std::endl;
return 0;
}
[/code]
页:
[1]