K線圖指標(biāo)算法(KDJ RSI )

算法代碼傳到這github
demo:StockChart

五鸳惯、KDJ

通過一個(gè)特定的周期(常為9日、9周等)內(nèi)出現(xiàn)過的最高價(jià)韩玩、最低價(jià)及最后一個(gè)計(jì)算周期的收盤價(jià)及這三者之間的比例關(guān)系蔬胯,來計(jì)算最后一個(gè)計(jì)算周期的未成熟隨機(jī)值RSV,然后根據(jù)平滑移動(dòng)平均線的方法來計(jì)算K值重贺、D值與J值

計(jì)算方式 (摘抄自百度百科)

KDJ的計(jì)算比較復(fù)雜暑脆,首先要計(jì)算周期(n日、n周等)的RSV值跛锌,即未成熟值,然后再計(jì)算K值届惋、D值髓帽、J值等。以n日KDJ數(shù)值的計(jì)算為例脑豹,其計(jì)算公式為

n日RSV=(Cn-Ln)/(Hn-Ln)×100
公式中郑藏,Cn為第n日收盤價(jià)Ln為n日內(nèi)的最低價(jià)晨缴;Hn為n日內(nèi)的最高價(jià)
其次峡捡,計(jì)算K值與D值:
當(dāng)日K值=2/3×前一日K值+1/3×當(dāng)日RSV
當(dāng)日D值=2/3×前一日D值+1/3×當(dāng)日K值
若無前一日K 值與D值击碗,則可分別用50來代替筑悴。
J值=3當(dāng)日K值-2當(dāng)日D值

以9日為周期的KD線為例,即未成熟隨機(jī)值稍途,計(jì)算公式為
9日RSV=(C-L9)÷(H9-L9)×100
公式中阁吝,C為第9日的收盤價(jià);L9為9日內(nèi)的最低價(jià)械拍;H9為9日內(nèi)的最高價(jià)突勇。
K值=2/3×第8日K值+1/3×第9日RSV
D值=2/3×第8日D值+1/3×第9日K值
J值=3第9日K值-2第9日D值

/**
     * kdj 9,3,3
     * N:=9; P1:=3; P2:=3;
     * RSV:=(CLOSE-L(LOW,N))/(H(HIGH,N)-L(LOW,N))*100;
     * K:SMA(RSV,P1,1);
     * D:SMA(K,P2,1);
     * J:3*K-2*D;
     * @param entries 數(shù)據(jù)集合
     * @param n 指標(biāo)周期 9
     * @param m 權(quán)重 1
     * @param P1 參數(shù)值為3
     * @param P2 參數(shù)值為3
     * @return 
     */
    public static List[] getKDJ(List<CandleEntry> entries, int n, int P1, int P2, int m) {
        List<Entry> kValue = new ArrayList();
        List<Entry> dValue = new ArrayList();
        List<Entry> jValue = new ArrayList();

        List<Entry> maxs = getPeriodHighest(entries, n);
        List<Entry> mins = getPeriodLowest(entries, n);
        //確保和 傳入的list size一致,
        int size = entries.size() - maxs.size();
        for (int i = 0; i < size; i++) {
            maxs.add(0, new Entry());
            mins.add(0, new Entry());
        }
        float rsv = 0;
        float lastK = 50;
        float lastD = 50;

        for (int i = n - 1; i < entries.size(); i++) {
            float x = entries.get(i).getX();
            if (i >= maxs.size())
                break;
            if (i >= mins.size())
                break;
            float div = maxs.get(i).getY() - mins.get(i).getY();
            if (div == 0) {
                //使用上一次的
            } else {
                rsv = ((entries.get(i).getClose() - mins.get(i).getY())
                        / (div)) * 100;
            }

            float k = countSMA(rsv, P1, m, lastK);
            float d = countSMA(k, P2, m, lastD);
            float j = 3 * k - 2 * d;
            lastK = k;
            lastD = d;
            kValue.add(new Entry(x, k));
            dValue.add(new Entry(x, d));
            jValue.add(new Entry(x, j));
        }

        return new List[]{kValue, dValue, jValue};
    }

    /**
     * SMA(C,N,M) = (M*C+(N-M)*Y')/N
     * C=今天收盤價(jià)-昨天收盤價(jià)    N=就是周期比如 6或者12或者24坷虑, M=權(quán)重甲馋,一般取1
     *
     * @param c   今天收盤價(jià)-昨天收盤價(jià)
     * @param n   周期
     * @param m   1
     * @param sma 上一個(gè)周期的sma
     * @return
     */
    private static float countSMA(float c, float n, float m, float sma) {
        return (m * c + (n - m) * sma) / n;
    }

   /**
     * n周期內(nèi)最低值集合
     * @param entries
     * @param n
     * @return
     */
    private static List<Entry> getPeriodLowest(List<CandleEntry> entries, int n) {
        List<Entry> result = new ArrayList<>();
        float minValue = 0;
        for (int i = n - 1; i < entries.size(); i++) {
            float x = entries.get(i).getX();
            for (int j = i - n + 1; j <= i; j++) {
                if (j == i - n + 1) {
                    minValue = entries.get(j).getLow();
                } else {
                    minValue = Math.min(minValue, entries.get(j).getLow());
                }
            }
            result.add(new Entry(x, minValue));
        }
        return result;
    }

    /**
     *  N周期內(nèi)最高值集合
     * @param entries
     * @param n
     * @return
     */
    private static List<Entry> getPeriodHighest(List<CandleEntry> entries, int n) {
        List<Entry> result = new ArrayList<>();
        float maxValue = entries.get(0).getHigh();
        for (int i = n - 1; i < entries.size(); i++) {
            float x = entries.get(i).getX();
            for (int j = i - n + 1; j <= i; j++) {
                if (j == i - n + 1) {
                    maxValue = entries.get(j).getHigh();
                } else {
                    maxValue = Math.max(maxValue, entries.get(j).getHigh());
                }
            }
            result.add(new Entry(x, maxValue));
        }
        return result;
    }

六、RSI

相對強(qiáng)弱指數(shù)RSI是根據(jù)一定時(shí)期內(nèi)上漲點(diǎn)數(shù)和漲跌點(diǎn)數(shù)之和的比率制作出的一種技術(shù)曲線迄损。能夠反映出市場在一定時(shí)期內(nèi)的景氣程度定躏。

計(jì)算方式

RSI:= SMA(MAX(Close-LastClose,0),N,1)/SMA(ABS(Close-LastClose),N,1)*100
(看下面的算法似乎很簡單,但是個(gè)人覺得這個(gè)指標(biāo)計(jì)算反而是比較難纏的一個(gè)芹敌。痊远。。)

   /**
     * RSI(n)
     * RSI(N):= SMA(MAX(Close-LastClose,0),N,1)/SMA(ABS(Close-LastClose),N,1)*100
     *
     * @param entries
     * @param n
     * @param m 加權(quán) 1
     * @return
     */
    public static List<Entry> getRSI(List<CandleEntry> entries, int n, int m) {
        List<Entry> result = new ArrayList();
        float preIn = 0;
        float preAll = 0;
        for (int i = 1; i < entries.size(); i++) {
            float diff = entries.get(i).getClose() - entries.get(i - 1).getClose();
            preIn = countSMA(Math.max(diff, 0), n, m, preIn);
            preAll = countSMA(Math.abs(diff), n, m, preAll);
            if (i >= n) {
                float x = entries.get(i).getX();
                result.add(new Entry(x, preIn / preAll * 100));
            }
        }
        return result;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氏捞,一起剝皮案震驚了整個(gè)濱河市碧聪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌液茎,老刑警劉巖逞姿,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豁护,居然都是意外死亡哼凯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門楚里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來断部,“玉大人,你說我怎么就攤上這事班缎『猓” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵达址,是天一觀的道長蔑祟。 經(jīng)常有香客問我,道長沉唠,這世上最難降的妖魔是什么疆虚? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上径簿,老公的妹妹穿的比我還像新娘罢屈。我一直安慰自己,他們只是感情好篇亭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布缠捌。 她就那樣靜靜地躺著,像睡著了一般译蒂。 火紅的嫁衣襯著肌膚如雪曼月。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天柔昼,我揣著相機(jī)與錄音哑芹,去河邊找鬼。 笑死岳锁,一個(gè)胖子當(dāng)著我的面吹牛绩衷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播激率,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼咳燕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乒躺?” 一聲冷哼從身側(cè)響起招盲,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉冒,沒想到半個(gè)月后曹货,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讳推,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年顶籽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片银觅。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礼饱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出究驴,到底是詐尸還是另有隱情镊绪,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布洒忧,位于F島的核電站蝴韭,受9級特大地震影響膨俐,放射性物質(zhì)發(fā)生泄漏忘瓦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一渡贾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庆尘,春花似錦蹬耘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惩系。三九已至位岔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堡牡,已是汗流浹背抒抬。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晤柄,地道東北人擦剑。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像芥颈,于是被迫代替她去往敵國和親惠勒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容