Comprensión de los indicadores STOCHRSI

Creado el: 2016-08-24 19:25:22, Actualizado el: 2017-10-11 11:07:31
comments   14
hits   11968

Comprensión de los indicadores STOCHRSI

  • En estos días he estado ayudando a un amigo a resolver una pregunta sobre un indicador, el STOCHRSI. He buscado mucha información en la red, pero la verdad es que hay muy poca información en chino. El comercio es un libro de magia, pero siempre y cuando se estudia un poco, se obtiene un poco de ganancia, a continuación se comparte la experiencia, se puede aprender con este amigo.

En la web encontré algunas fórmulas de cálculo para este indicador.

/*
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;
*/

¡Dios mío! ¡Me he quedado sin paciencia para ver! (Cuando vi esto, sentí que había tocado un clavo). Esta descripción es una fórmula general. Pero yo, con un poco de experiencia en programación, sólo puedo adivinar. ¡Adivina!

  • 1. La información encontrada en la red dice que el indicador tiene aproximadamente 3 formas diferentes. La fórmula de arriba es 2 de ellas. Pero la información no dice que haya más detalles de las 3 formas diferentes.
  • 2. Comparar las gráficas de las distintas plataformas. Descubrir que las descripciones de este indicador varían. La descripción de los parámetros de la función indicador STOCHRSI en la biblioteca de indicadores talib de la plataforma tampoco se entiende completamente.
  • 3. Utiliza la base de indicadores de talib para introducir los parámetros 14,14,3,3 Este conjunto de parámetros, los datos obtenidos en comparación con otras plataformas, encontró una gran diferencia. Miró la descripción de los parámetros y descubrió que no era el mismo. Por lo tanto, abandonó el estándar.
  • 4. un poco de miedo a mover el indicador… (un poco de miedo a ser maltratado por el código si no lo haces bien)

Después de una lucha dolorosa… En resumen:

  • 1. Cualquiera que sea la forma de este indicador, el indicador RSI es el dato básico de este indicador. Comparando la descripción de otras plataformas con la fórmula anterior. Determinar el parámetro del indicador STOCHRSI requiere un parámetro que sea el RSI.
  • 2), y encontramos diferentes descripciones de este indicador, algunas descripciones de que el indicador es la salida de %K, %D dos líneas. Algunas descripciones de que la salida es STOCHRSI, MA(3) (los parámetros de esta descripción son 14,14,3,3) Analizando un poco, de hecho, aunque son dos formas diferentes, %K === STOCHRSI, %D === MA(3) La fórmula de cálculo de las 2 líneas de datos de salida es la misma. Determina que 3 de MA(3) es un parámetro. Los dos parámetros restantes, que se introducen en la fórmula anterior, son M y P1. 14, 3 se prueban. Finalmente, los datos del indicador se encuentran, y finalmente los datos de otras plataformas se encuentran.

El verde es la línea rápida %K, el naranja es la línea rápida %D Comprensión de los indicadores STOCHRSI

  • Los indicadores que escribo yo mismo pueden ser comparados con los de OKCoin. Si tienes alguna pregunta, por favor, deja un comentario ^^

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];
}