Comprendre les indicateurs STOCHRSI

Auteur:Le petit rêve, Créé: 2016-08-24 19:25:22, mis à jour: 2017-10-11 11:07:31

Comprendre les indicateurs STOCHRSI

  • Ces derniers jours, j'ai aidé un ami à résoudre un problème concernant un indicateur, qui s'appelle STOCHRSI. J'ai cherché beaucoup d'informations en ligne, il y en a très peu en chinois. Les négociations sont simples, c'est un livre sacré. Mais si vous faites plus d'études, vous en retirerez un peu de profit.

Il y a des formules de calcul pour ce facteur que j'ai trouvées en ligne.

/*
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 patiemment. Je me sentais comme frappé par un clou quand j'ai vu ça. Cette description est une formule générale. Mais même avec un peu d'expérience en programmation, je ne peux que deviner!

  • 1. Selon les informations trouvées en ligne, il existe environ trois formes différentes de cet indicateur. La formule ci-dessus est deux d'entre elles. Mais aucune autre information détaillée sur ces trois formes n'est mentionnée.
  • 2. Regardez, comparez et comparez les indicateurs des différentes plateformes. Notez que les descriptions de cet indicateur varient.
  • 3. Envoyer les paramètres 14, 14, 3, 3 à l'aide de la base d'indicateurs talib. Cette série de paramètres, les données obtenues par rapport à d'autres plateformes, a révélé une différence plus grande.
  • 4.有点想动手撸这个指标…(有点怕怕,弄不好就被代码虐了)。

Après une lutte acharnée... Résumé:

  • 1, quel que soit le format de l'indicateur, l'indicateur RSI est la base de données de cet indicateur.
  • 2, on a également découvert différentes descriptions de cet indicateur, certaines des descriptions sont que l'indicateur est produit par %K, %D deux lignes. En fait, bien qu'il s'agisse de deux formes différentes, %K === STOCHRSI et %D === MA ((3) sont deux lignes de données. La formule de calcul est la même. Les deux paramètres restants, introduits manuellement dans la formule ci-dessus, sont M et P1.

Le vert est la ligne rapide %K, l'orange est la ligne rapide %Dimg

  • L'indicateur que j'ai écrit peut être comparé à celui d'OKCoin ci-dessous.

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

Plus de

JeLa réévaluation montre que cette fonction est très lente et qu'elle doit être améliorée.

JeJe ne comprends pas comment on peut utiliser talib.STOCHRSI))) pour corriger les données de Bitcoinwisdom.

Le petit rêvetalib est une bibliothèque d'indicateurs open source. On l'utilise dans BotVS, par exemple pour rechercher la ligne moyenne talib.MA ((records, 10); // records pour rechercher la période de données de ligne moyenne K. Il s'agit de la ligne moyenne des records K de 10 bar. Vous pouvez vous rendre au groupe BotVS QQ: 608262365

Le petit rêveFstochRSI ((records, n, m, p1, p2) correspondant aux paramètres OKCoin est le même, sauf que le premier records, qui est la source de données de la ligne K, qui est la source de données du calcul de l'indicateur, est le même que celui que j'ai comparé avec le graphique OK, c'est-à-dire que l'algorithme est un peu plus lent.

Le petit rêvePeut-être que l'algorithme ou le code a besoin d'être optimisé.

JeC'est très bien, maintenant c'est normal. Merci!

Le petit rêveLe code est déjà écrit dans le post, vous pouvez le comparer ci-dessous.

JeLa fonction STOCH est la même chose.

Le petit rêveTalib est différent, ses calculs internes sont différents. J'ai écrit STOCHRSI moi-même et je le publierai plus tard.