龙听期货论坛's Archiver

龙听 发表于 2024-12-18 16:59

鼎元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]

龙听 发表于 2024-12-18 18:48

第一部分:头文件:[code]
        double hhv(vector<double> pc, int num);
        double llv(vector<double> pc, int num);
[/code][code]
        vector<double>highs, lows,rsv, KValue, DValue, JValue,highesthigh,lowestlow;
        int period;
        double smoothingFactor;
        vector<double> K, D, J ;
[/code]ode]

第二部分:源文件主程序部分:[code]
double k1 = 50, d1 = 50, j1 = 0, r1 = 0;
        RsqBar(sPeriod, sInst);
        map<string, TKVALUE >::iterator it;
        for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
        {
                pc.push_back(it->second.dClose);
                if (pc.size() <= 9)
                {
                        r1 = 0;
                        k1 = 50;
                        d1 = 50;
                        j1 = 50;
                }
                else
                {
                        rsv = (it->second.dClose - llv(pc,9))/(hhv(pc,9) - llv(pc,9)) * 100;
                        k1 = 2 / 3 * k1 + rsv / 3;
                        d1 = 2 / 3 * d1 + rsv / 3;
                        j1 = 3 * d1 - 2 * rsv;
                }
                KValue.push_back(k1);
                DValue.push_back(d1);
                JValue.push_back(j1);
        }
        for (int i = 1; i <= 9; i++)
        {
                InsertLog("Jvalue" + to_string(JValue[JValue.size() - i]));
        }
             InsertLog("最新Kvalue " + to_string(KValue[KValue.size() - 1]) + "最新Dvalue " + to_string(DValue[DValue.size() - 1]) + "最新Jvalue " + to_string(JValue[JValue.size() - 1]));
[/code]第三部分:指标区主要核心部分:[code]

////////////////////////////////////////////////////////////////////////////////////////////////////////////KDJ公式计算
double test::hhv(vector<double> pc, int num)
{
        double d = 0;
        for (int i = pc.size()-1; i >= pc.size() - num; i--)
        {
                d = max2(d, pc[i]);
        }
        return d;
}

double test::llv(vector<double> pc, int num)
{
        double d1 = 999999;
        for (int i = pc.size()-1; i >= pc.size() - num; i--)
        {
                d1 = min2(d1, pc[i]);
        }
        return d1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////KDJ公式计算
[/code]

龙听 发表于 2024-12-24 10:12

这里面的难点是计算rsv的部分,这个指标还是有些问题我没有搞明白,大家可以先放一下,我弄好了会在这里做说明。

页: [1]