问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

通达信CCI RSI KDJ多指标共振与C++源代码详解

创作时间:
作者:
@小白创作中心

通达信CCI RSI KDJ多指标共振与C++源代码详解

引用
1
来源
1.
http://www.360doc.com/content/25/0219/03/17132703_1147091321.shtml

本文将分享一段通达信软件中CCI、RSI、KDJ多指标共振的源代码。这些技术指标主要用于判断股票市场的买卖时机和底部信号。文章将详细解释这些指标的原理和计算方法,并提供具体的C++代码实现。

技术指标详解

通道线(CCI)

通道线(Commodity Channel Index,CCI)主要用于衡量价格与平均价格之间的偏离程度,帮助投资者识别市场趋势。其计算公式为:

CCI = (TYP - MA(TYP, M)) / (0.015 * AVEDEV(TYP, M))

其中,TYP是典型价格((最高价+最低价+收盘价)/3),MA是移动平均值,AVEDEV是平均偏差。

相对强弱指标(RSI)

相对强弱指标(Relative Strength Index,RSI)用于衡量市场强弱,其计算公式为:

RSI = (RSI1 - 50) * 5.3

其中,RSI1是通过比较一段时间内的平均涨跌幅度计算得出的。

随机指标(KDJ)

随机指标(Stochastic Oscillator,KDJ)通过计算一段时间内的最高价、最低价和收盘价来判断市场买卖信号。其计算公式为:

RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
K = SMA(RSV, 3, 1)
D = SMA(K, 3, 1)
J = 3 * K - 2 * D

指数平滑移动平均(EMA)

指数平滑移动平均(Exponential Moving Average,EMA)是对价格进行指数加权平滑处理,更看重近期的数据。其计算公式为:

EMA = alpha * data[i] + (1 - alpha) * EMA[i - 1]

其中,alpha是平滑系数。

加权移动平均(SMA)

加权移动平均(Simple Moving Average,SMA)是对价格进行加权平均处理,把价格波动给平滑了。其计算公式为:

SMA = sum(data) / period

判断底部的算法逻辑

这段代码通过多种条件组合来判断底部信号:

  1. 超卖判断
  • 当RSI值低于某个阈值(比如-100),可能说明市场超卖了。
  • 当K值和J2值低于某个阈值(比如-100),也可能说明市场到底部了。
  1. 趋势反转判断
  • 用RR(即RR1 > RR2)判断当前趋势是不是向上反转了。
  • 再结合CB1(指数平滑处理后的指标),看看是不是低于-100,进一步确认是不是底部。
  1. 共振条件
  • 通过SSTT1、SSTT2、SSTT3这些条件组合,当多个指标同时满足超卖且趋势反转时,就标记为底部信号。

源代码实现

以下是具体的C++代码实现:

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <numeric>

using namespace std;

// 计算简单移动平均线
double SMA(const vector<double>& data, int period) {
    vector<double> sma(data.size() - period + 1, 0.0);
    for (size_t i = period - 1; i < data.size(); ++i) {
        double sum = 0.0;
        for (int j = 0; j < period; ++j) {
            sum += data[i - j];
        }
        sma[i - period + 1] = sum / period;
    }
    return sma.back();
}

// 计算指数移动平均线
double EMA(const vector<double>& data, int period) {
    vector<double> ema(data.size(), 0.0);
    ema[0] = data[0];
    double alpha = 2.0 / (period + 1);
    for (size_t i = 1; i < data.size(); ++i) {
        ema[i] = alpha * data[i] + (1 - alpha) * ema[i - 1];
    }
    return ema.back();
}

// 计算平均偏差
double AVEDEV(const vector<double>& data, int period) {
    vector<double> avgdev(data.size() - period + 1, 0.0);
    for (size_t i = period - 1; i < data.size(); ++i) {
        double sum = 0.0;
        double mean = SMA(vector<double>(data.begin() + i - period + 1, data.begin() + i + 1), period);
        for (int j = 0; j < period; ++j) {
            sum += abs(data[i - j] - mean);
        }
        avgdev[i - period + 1] = sum / period;
    }
    return avgdev.back();
}

// 计算RSI指标
double RSI(const vector<double>& close, int period) {
    vector<double> gains, losses;
    for (size_t i = 1; i < close.size(); ++i) {
        double change = close[i] - close[i - 1];
        if (change > 0) {
            gains.push_back(change);
            losses.push_back(0);
        } else {
            gains.push_back(0);
            losses.push_back(abs(change));
        }
    }
    double avg_gain = SMA(gains, period);
    double avg_loss = SMA(losses, period);
    return avg_gain / avg_loss * 100;
}

风险提示

本指标仅供技术研究与学习交流使用。资本市场具有高度不确定性,任何基于本指标的投资决策都需要自行承担风险,不构成任何投资建议。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号