avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Compréhension de l'indicateur STOCHRSI

Créé le: 2016-08-24 19:25:22, Mis à jour le: 2017-10-11 11:07:31
comments   14
hits   12429

Compréhension de l’indicateur STOCHRSI

  • Ces derniers jours, j’ai aidé un ami à résoudre une question sur l’indicateur, l’indicateur est STOCHRSI. Le trading est un jeu d’enfant, c’est un jeu d’enfant, mais il y a des bénéfices à en tirer si l’on étudie un peu, partagez l’expérience ci-dessous et utilisez-la pour aider vos amis.

J’ai trouvé sur le net des formules pour calculer cet indicateur.

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

Mon Dieu, j’ai fini de regarder avec patience. Quand j’ai vu ça, j’ai senti que j’avais touché le clou. Cette description est une formule générale. Mais moi aussi, avec un peu d’expérience en programmation, je ne peux que deviner !

  • 1. Selon les informations disponibles en ligne, l’indicateur a environ 3 formes différentes. La formule ci-dessus en est une des deux. Mais les informations ne donnent pas d’autres détails sur ces 3 formes différentes.
  • 2. En regardant et en comparant les graphiques de chaque plate-forme, nous avons découvert que les descriptions de cet indicateur diffèrent. La description des paramètres de la fonction indicateur STOCHRSI dans la base de données des indicateurs talib de la plate-forme n’est pas entièrement comprise.
  • 3. Utilisez la base de données d’indicateurs de talib pour entrer les paramètres 14,14,3,3. Ce groupe de paramètres, les données obtenues et la comparaison avec d’autres plates-formes ont révélé des différences importantes.
  • 4. J’ai un peu envie de faire bouger les doigts de l’indicateur… ((j’ai un peu peur, si je ne fais pas bien, je suis maltraité par le code))

Il y a eu des luttes et des souffrances… Résumé:

  • 1. Quel que soit le format de l’indicateur, l’indicateur RSI est la base de données de l’indicateur. Comparé à d’autres plates-formes décrites et à la formule ci-dessus. Pour déterminer le paramètre de l’indicateur STOCHRSI, il est nécessaire qu’il y ait un paramètre de RSI.
  • On trouve aussi une description différente de cet indicateur, une description qui indique que l’indicateur sort deux lignes %K, %D. Une autre description qui indique que la sortie est STOCHRSI, MA(3) (les paramètres de cette description sont 14,14,3,3) En fait, bien qu’il s’agisse de deux formes différentes, le calcul de la formule est le même pour les deux lignes de données de sortie. Déterminer que 3 de MA est un paramètre. Les 2 paramètres restants, qui sont introduits dans la formule ci-dessus, sont M et P1. Les 14 et 3 ont été essayés. Les données de l’indicateur finalement découvertes ont finalement été comparées aux données des autres plates-formes.

Le vert représente la ligne rapide %K, l’orange représente %D. Compréhension de l’indicateur STOCHRSI

  • Si vous avez des questions, n’hésitez pas à nous le dire ^^

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