鼎元C++期货量化/程序化教程【随机指标(Stochastic Oscillator,KDJ)的计算方法及调用方法】
第一部分、简介与计算原理KDJ指标的中文名称又叫随机指标,最早起源于期货市场,由乔治·莱恩(George Lane)首创。随机指标KDJ最早是以KD指标的形式出现,而KD指标是在威廉指标的基础上发展起来的。不过KD指标只判断股票的超买超卖的现象,在KDJ指标中则融合了移动平均线速度上的观念,形成比较准确的买卖信号依据。在实践中,K线与D线配合J线组成KDJ指标来使用。KDJ指标在设计过程中主要是研究最高价、最低价和收盘价之间的关系,同时也融合了动量观念、强弱指标和移动平均线的一些优点。因此,能够比较迅速、快捷、直观地研判行情,被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。
[img]http://p.algo2.net/2024/1218/dc258aeda9b19.png[/img]
[img]http://p.algo2.net/2024/1218/29f6991c57251.png[/img] 程式码部分:[code]
//KDJ指标
map<string, TKVALUE>::iterator it;
for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
{
pc.push_back(it->second.dClose); //将收盘价放入pc容器vector
}
int n = 0;
double hiprice = -99999;
double lowprice = 99999;
for (int i = 0; i < pc.size(); i++)
{
if(n <= 9)
{
double value1 = pc[i] -
}
}
double value1 = pc[pc.size() - 1] - lowest(sPeriod, sInst, 9);
double value2 = highest(sPeriod, sInst, 9) - lowest(sPeriod, sInst, 9);
double rsv = 100 * value1 / value2;
if (value2 <> 0)
{
double kvalue = (2 * kvalue/3) + rsv/3;
double dvalue = (2 * dvalue / 3) + kvalue / 3
double jvalue = 3 * kvalue - 2 * dvalue;
}
[/code] 存档的一个版本,以后有空再继续研究,不要加到鼎元里面,会死掉的。
头文件声明:[code]
void calculateHighLow(vector<double>highs, vector<double>lows, int period, vector<double>highest, vector<double>lowest);
void calculateKDJ(vector<double>pc, vector<double>highs, vector<double>lows, int period, double smoothingFactor);
[/code][code]
//KDJ指标参数
vector<double> closes,highest2, lowest2,highs,lows,rsv, kValues, dValues, jValues;
double smoothingFactor;
int period1;
[/code]源文件指标模块:[code]
#include <algorithm> // For std::min_element and std::max_element
[/code]头部增加一个这样的[code]
// 计算最低价和最高价范围
void test::calculateHighLow(vector<double>highs, vector<double>lows, int period1, vector<double>highest2, vector<double>lowest2)
{
for (int i = 0; i < highs.size(); ++i)
{
if (i < period1 - 1) {
highest2.push_back(0);
lowest2.push_back(0);
}
else {
double maxHigh = *max_element(highs.begin() + i - period1 + 1, highs.begin() + i + 1);
double minLow = *min_element(lows.begin() + i - period1 + 1, lows.begin() + i + 1);
highest2.push_back(maxHigh);
lowest2.push_back(minLow);
}
}
}
// 计算 KDJ 指标
void test::calculateKDJ(vector<double>closes, vector<double>highs,vector<double>lows, int period1, double smoothingFactor)
{
vector<double> highest2, lowest2, rsv, kValues, dValues, jValues;
// 计算最高价和最低价
calculateHighLow(highs, lows, period1, highest2, lowest2);
// 计算 RSV
for (int i = 0; i < closes.size(); ++i)
{
if (i < period1-1)
{
rsv.push_back(0);
}
else
{
double range = highest2[i] - lowest2[i];
rsv.push_back(iff(range == 0,0,closes[i] - lowest2[i])/range * 100);
}
}
// 初始化 K 和 D 值
kValues.push_back(50); // 通常初始值设置为 50
dValues.push_back(50);
// 迭代计算 K 和 D 值
for (int 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);
}
}
[/code]源文件策略test.cpp里面[code]
//计算KDJ
map<string, TKVALUE>::iterator it;
for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
{
closes.push_back(it->second.dClose);
highs.push_back(it->second.dHigh);
lows.push_back(it->second.dLow);
}
// 参数
period1 = 9; // 计算周期
smoothingFactor = 1.0/3.0; // 平滑系数 (通常为 1/3)
calculateHighLow(highs, lows, period1, highest2, lowest2);
// 计算 KDJ
calculateKDJ(closes, highs, lows, period1, smoothingFactor);//获得DVALUE,KVALUE,JVALUE的 VECTOR形式数值
double value1 = kValues[kValues.size() - 1];
double value2 = dValues[dValues.size() - 1];
double value3 = jValues[jValues.size() - 1];
InsertLog("Kvalue: " + to_string(value1) + "Dvalue: " + to_string(value2) + "Jvalue: " + to_string(value3));
[/code]我测试的会崩溃,大家不要再试了,以后我优化好了在这里贴出来。
页:
[1]