STOCHRSI 指標理解 原

STOCHRSI 指標理解

這幾天幫一個朋友解決一個關於指標的問題 ,這個指標就是 STOCHRSI 。在網上查了很多資料,中文的真是甚少。而且僅有的也不是講的很清楚。對於我這樣的 交易小白,簡直是天書。 不過只要研究多少會有點收穫的,下面分享下經驗,需要用這個的朋友可以借鑑。

在網上找到了一些 關於這個指標的計算公式。

/*
LC := REF(CLOSE,1); //REF(C,1) 上一週期的收盤價
RSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1) *100;
%K:     MA(RSI-LLV(RSI,M),P1)/MA(HHV(RSI,M)-LLV(RSI,M),P1)*100;  LLV(l,60)表示:檢索60天內的最低價,可適應於檢索任何股票
%D:MA(%K,P2);

LC := REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1) *100;
STOCHRSI:MA(RSI-LLV(RSI,M),P1)/MA(HHV(RSI,M)-LLV(RSI,M),P1)*100;
*/

 

天哪! 我竟然耐心看完了。(當時看見這個的時候,就感覺碰到釘子了。) 這個描述是通用 公式。但是有點編程經驗的我也只能 猜!猜!猜!

  • 在網上找到的資料說,這個指標有大概3個不同形態。上面的公式是其中2個。 但是資料也沒說,這3個不同形態的其他詳細信息。
  • 在各個平臺的圖表行情中看、對比。發現,關於這個指標的描述各不相同。平臺上的 talib指標庫 中的指標函數 STOCHRSI 的參數描述也沒有完全明白。
  • 用talib指標庫 傳入參數 14,14,3,3 這組參數,得出的數據和其他平臺的對比,發現差異較大。看了看參數描述發現不一樣。於是放棄現成的。
  • 有點想動手擼這個指標…(有點怕怕,弄不好就被代碼虐了)。

 

經過了一番痛苦掙扎…

總結:

  1. 這個指標不管哪種形態,RSI 指標是這個指標的基礎數據。對比了其他平臺描述和上述公式。確定STOCHRSI指標的參數必然有一個是RSI的參數。

  2. 又發現 這個指標的不同描述,有的描述是指標輸出的是 %K , %D兩條線。 有的描述是 輸出的爲 STOCHRSI , MA(3) (這個描述的參數是14,14,3,3) 分析了一下, 其實 雖然是2種不同形態, %K === STOCHRSI , %D === MA(3) 輸出的2條線(數據)計算公式是一樣的。 確定 MA(3)中的3是一個參數。 剩下2個參數,動手往上面的公式裏面帶入,就是M 和 P1了 。14、3 都試試。最終發現擼出來的指標數據 ,終於對的上其他平臺上的數據了。

綠色是快線 %K ,橙色是 %D

自己寫的指標,可以對比下 OKCoin的 。 如有問題歡迎留言 ^^

function LLV(array,period){
    if(!array || array.length - period < 0){
        throw "error:" + array;
    }
    var min = array[array.length - period];
    for(var i = array.length - period; i < array.length; i++){
        if( array[i] < min ){
            min = array[i];
        }
    }
    return min;
}

function HHV(array,period){
    if(!array || array.length - period < 0){
        throw "error:" + array;
    }
    var max = array[array.length - period];
    for(var i = array.length - period; i < array.length; i++){
        if( array[i] > max){
            max = array[i];
        }
    }
    return max;
}

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
        if(initArr[i] === null || isNaN(initArr[i]) ){
            j--;
            continue;
        }
        dealArr[j] = initArr[i];
    }
    return dealArr;
}

/*
LC := REF(CLOSE,1); //REF(C,1) 上一週期的收盤價
RSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1) *100;
%K:     MA(RSI-LLV(RSI,M),P1)/MA(HHV(RSI,M)-LLV(RSI,M),P1)*100;  LLV(l,60)表示:檢索60天內的最低價,可適應於檢索任何股票
%D:MA(%K,P2);

LC := REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1) *100;
STOCHRSI:MA(RSI-LLV(RSI,M),P1)/MA(HHV(RSI,M)-LLV(RSI,M),P1)*100;
*/
function FstochRSI(records,n,m,p1,p2){
    var len = records.length;
    //var LC = records[len-2];//上一週期收盤價
    //var rsi = TA.RSI(records,n);// RSI 數組   ,talib
    var rsi = talib.RSI(records,n);
    rsi = DeleteNullEle(rsi);//ceshi

    var arr1 = [];
    var arr2 = [];
    var arr3 = [];
    var arr4 = [];
    var rsi_a = [];
    var rsi_b = [];
    var k = [];
    var d = null;

    /*不包含當前柱
    for(var a = 0 ;a < rsi.length ; a++ ){//改造 不用 LLV
        for(var aa = 0 ; aa <= a; aa++ ){
            rsi_a.push(rsi[aa]);
        }
        arr1.push(rsi[a] - TA.Lowest(rsi_a,m));
    }
    for(var b = 0 ;b < rsi.length ; b++ ){//改造 不用 HHV
        for(var bb = 0 ; bb <= b; bb++ ){
            rsi_b.push(rsi[bb]);
        }
        arr2.push(TA.Highest(rsi_b,m) - TA.Lowest(rsi_b,m));
    }
    */
    for(var a = 0 ;a < rsi.length ; a++ ){//改造 不用 LLV
        if(a < m){
            continue;
        }
        for(var aa = 0 ; aa <= a; aa++ ){
            rsi_a.push(rsi[aa]);
        }
        arr1.push(rsi[a] - LLV(rsi_a,m));
    }
    for(var b = 0 ;b < rsi.length ; b++ ){//改造 不用 HHV
        if(b < m){
            continue;
        }
        for(var bb = 0 ; bb <= b; bb++ ){
            rsi_b.push(rsi[bb]);
        }
        arr2.push(HHV(rsi_b,m) - LLV(rsi_b,m));
    }

    arr1 = DeleteNullEle(arr1);
    arr2 = DeleteNullEle(arr2);
    //Log("arr1:",arr1.length,"-",arr1);//ceshi
    //Log("arr2:",arr2.length,"-",arr2);//ceshi

    arr3 = talib.MA(arr1,p1);
    arr4 = talib.MA(arr2,p1);

    arr3 = DeleteNullEle(arr3);
    arr4 = DeleteNullEle(arr4);

    //Log("ceshi");//ceshi
    var c = 0;
    var diff = 0;
    if(arr3.length !== arr4.length){//實測 長度不相等
        throw "error: !=" + arr3.length + "----" + arr4.length;
        diff = arr4.length - arr3.length; //example   diff  =   10  -   6
    }else{
        //throw "error:" + arr3.length + "----" + arr4.length;
    }

    for( ;c < arr3.length ; c++ ){
        k.push(arr3[c] / arr4[c + diff] * 100);
    }

    d = talib.MA(k,p2);

    return [k,d,rsi];
}

 

原文地址:https://quant.la/Article/View/43/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章