Comprensión del indicador STOCHRSI

El autor:Un sueño pequeño., Creado: 2016-08-24 19:25:22, Actualizado: 2017-10-11 11:07:31

Comprensión del indicador STOCHRSI

  • Hace unos días ayudé a un amigo a resolver una pregunta sobre un indicador, este indicador se llama STOCHRSI. Los negocios son pequeños y son un libro sagrado. Sin embargo, si uno estudia mucho, obtendrá un poco de ganancia. Comparte la experiencia a continuación y puedes aprender de un amigo que necesita usar esto.

En la red 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! ¡He terminado de verlo con paciencia! ((Cuando vi esto, me sentí como si hubiera tocado un clavo.)) Esta descripción es una fórmula general. Pero con un poco de experiencia en programación, sólo puedo adivinar! Adivinar!

  • 1. La información que se encuentra en línea dice que el indicador tiene aproximadamente tres formas diferentes. La fórmula anterior es dos de ellas.
  • 2. Ver, comparar y comparar los gráficos de las distintas plataformas. Encontrar que las descripciones de este indicador varían. La descripción de los parámetros de la función de indicador STOCHRSI en la biblioteca de indicadores talib de la plataforma no está completamente clara.
  • 3. Introducción de los parámetros 14, 14, 3, 3 con la base de datos de talib. Este conjunto de parámetros, comparando los datos obtenidos con otras plataformas, encontró grandes diferencias.
  • 4.有点想动手撸这个指标…(有点怕怕,弄不好就被代码虐了)。

Después de una lucha dolorosa... En resumen:

  • 1, el indicador RSI es la base de datos de este indicador, sea cual sea su forma. Se compara con otras plataformas descritas y las fórmulas anteriores.
  • 2, también se descubren diferentes descripciones de este indicador, algunas descripciones son que el indicador de salida es %K, %D dos líneas. Algunas descripciones son que la salida es STOCHRSI, MA ((3) (los parámetros de esta descripción son 14, 14, 3, 3) Si analizamos un poco, en realidad, aunque son dos formas diferentes, %K === STOCHRSI, %D === MA(3) la fórmula de cálculo de las dos líneas de salida ((datos) es la misma. Determinar 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 intentan. Finalmente, se encuentran los datos de indicadores filtrados, finalmente se correctan los datos de otras plataformas.

El verde es la línea rápida %K, el naranja es %D.img

  • El indicador que escribí yo mismo, puede compararse con el siguiente 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];
}

Más.

J.Cuando lo revisamos, encontramos que la velocidad de esta función es muy lenta y que hay que mejorar.

J.¿Qué es lo que se va a hacer con los datos de talib.STOCHRSI???? para corregir los datos de Bitcoinwisdom?

Un sueño pequeño.talib es una base de datos de indicadores abierta. En BotVS se usa como tal, por ejemplo, para buscar la línea media talib.MA ((records, 10); // records para buscar la línea media de datos de la línea K del ciclo. Se calcula que los registros K son una línea media de 10 bares. Puede ir a BotVS QQ grupo: 608262365

Un sueño pequeño.FstochRSI ((records, n, m, p1, p2) corresponde a los parámetros de OKCoin son los mismos, excepto que el primer records que es la línea de datos de K, es la fuente de datos de los indicadores de cálculo, que he comparado con el gráfico de OK es el mismo, es que el algoritmo de repetición es un poco más lento.

Un sueño pequeño.Puede que el algoritmo o el código necesiten ser optimizados.

J.Muy bien, ahora es normal. Gracias.

Un sueño pequeño.El código ya está escrito en el post, puedes compararlo con el siguiente.

J.Primero usamos la función STOCH, que es casi lo mismo.

Un sueño pequeño.Talib no está de acuerdo, el cálculo interno es un poco diferente. Yo mismo escribí STOCHRSI y lo publicé más adelante.