Compreensão do indicador STOCHRSI

Autora:Sonhos pequenos, Criado: 2016-08-24 19:25:22, Atualizado: 2017-10-11 11:07:31

Compreensão do indicador STOCHRSI

  • Recentemente, ajudei um amigo a resolver um problema sobre um indicador chamado STOCHRSI. Pesquisei muito na internet, e há muito pouco em chinês. O negócio é pequeno e simplesmente é um livro de leis. Mas basta pesquisar um pouco para obter um pouco, compartilhe a experiência abaixo e os amigos que precisam usar isso podem aprender.

A pesquisa foi realizada em uma área de pesquisa da Universidade de São Paulo, onde foi encontrado um conjunto de 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;
*/

Meu Deus, eu acabei de assistir pacientemente. Esta descrição é uma fórmula geral. Mas eu, com um pouco de experiência em programação, só posso adivinhar!

  • Os dados encontrados na internet dizem que o indicador tem cerca de três formas diferentes. A fórmula acima é apenas duas delas.
  • 2. Veja e compare os gráficos de cada plataforma; note que as descrições sobre o indicador variam; e a descrição dos parâmetros da função de indicador STOCHRSI na biblioteca de índices talib da plataforma também não é completamente clara.
  • 3. Utilizando o banco de dados de indicadores talib. Introdução de parâmetros 14,14,3,3 Este conjunto de parâmetros, os dados obtidos em comparação com outras plataformas, encontrou uma grande diferença.
  • 4.有点想动手撸这个指标…(有点怕怕,弄不好就被代码虐了)。

Depois de uma luta dolorosa... Resumo:

  • 1, independentemente da forma do indicador, o indicador RSI é a base de dados do indicador. Comparação com outras plataformas descritas e as fórmulas acima.
  • 2, também descobrimos diferentes descrições deste indicador, algumas descrições são que o indicador é produzido por %K, %D duas linhas. Outras descrições são que o produto é STOCHRSI, MA ((3) (o parâmetro deste descrito é 14,14,3,3) Analisando, na verdade, embora sejam duas formas diferentes, %K === STOCHRSI e %D === MA ((3) são as mesmas. Os dois parâmetros restantes são M e P1, que são introduzidos na fórmula acima. 14 e 3 são tentados. Finalmente, os dados de indicadores encontrados são corretos.

O verde é a linha rápida %K, o laranja é a linha rápida %D.img

  • O indicador é meu e pode ser comparado com o OKCoin abaixo.

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

Mais.

JQuando o teste foi feito, descobriu-se que a função é muito lenta e precisa ser melhorada.

JAinda não entendi, o que é que isso vai fazer com o talib.STOCHRSI????) para corrigir os dados do Bitcoinwisdom?

Sonhos pequenoso talib é uma base de dados de indicadores aberta. No BotVS é usado como tal, por exemplo, para a busca de linhas médias talib.MA ((records, 10); // records para a busca de linhas médias do ciclo de dados de linhas K. O cálculo é a linha média de 10 bares da linha de registros K. Pode ir para o BotVS QQ grupo: 608262365

Sonhos pequenosFstochRSI ((records, n, m, p1, p2) correspondem a parâmetros OKCoin são os mesmos, exceto que o primeiro records que são dados da linha K, ou seja, a fonte de dados do indicador de cálculo, que eu comparado com os dados do gráfico de OK são os mesmos, que é o algoritmo de repetição é um pouco lento.

Sonhos pequenosTalvez seja preciso melhorar o algoritmo ou o código.

JMuito bem, agora é normal.

Sonhos pequenosO código já está escrito na postagem, veja a comparação abaixo.

JA função STOCH é a primeira função a ser usada.

Sonhos pequenosO talib é diferente, o cálculo interno é um pouco diferente. Eu escrevi o STOCHRSI e coloquei mais tarde.