avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

STOCHRSI 지표 이해

만든 날짜: 2016-08-24 19:25:22, 업데이트 날짜: 2017-10-11 11:07:31
comments   14
hits   12429

STOCHRSI 지표 이해

  • 지난 몇일 동안 한 친구에게 STOCHRSI라는 지표에 대한 질문을 해줬습니다. 인터넷에서 많은 자료를 찾아봤는데, 중국어로는 거의 없습니다. 거래는 작은 일이지만, 그냥 천상의 책이다. 그러나 연구하는 만큼 조금은 수확할 수 있다. 아래에서 경험을 공유하고, 이 친구에게 배울 수 있다.

인터넷에서 이 지표에 대한 계산 공식을 찾아봤습니다.

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

! 참을성 넘쳐 ᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲᅲ 이 설명은 일반적인 공식입니다. 하지만 약간의 프로그래밍 경험이 있는 저 역시 추측할 수 밖에 없습니다.

  • 1. 인터넷에서 찾은 자료에 따르면, 이 지표는 대략 3가지의 다른 형태가 있다. 위의 공식은 그 중 2가지이다. 하지만 자료는 이 3가지의 다른 형태에 대한 다른 자세한 정보는 말하지 않는다.
  • 2. 각 플랫폼의 차트 실태를 보고 비교한다. 이 지표에 대한 설명이 서로 다르다는 것을 발견한다. 플랫폼의 talib 지표 저장소에서의 지표 함수 STOCHRSI의 파라미터 설명도 완전히 이해되지 않는다.
  • 3. talib 지표 저장소를 사용하여 14,14,3,3 인 매개 변수를 입력합니다. 이 매개 변수 그룹은 다른 플랫폼과 비교하여 큰 차이를 발견했습니다. 매개 변수 설명을 살펴보면 다르다는 것을 발견했습니다. 그래서 기존의 매개 변수를 포기했습니다.
  • 4. 조금은 이 지표를 움직이고 싶네요… (약간 겁이 났어요, 잘못하면 코드가 괴롭혔어요) ᅲ

그리고 그 후로, 저는 제 인생을 다시 시작하게 되었습니다. 결론:

  • 1. 이 지표가 어떤 형태를 취하든, RSI 지표는 이 지표의 기본 데이터이다. 다른 플랫폼 설명과 위의 공식을 비교한다. STOCHRSI 지표의 파라미터를 결정하는 것은 반드시 RSI의 파라미터가 있어야 한다.
  • 2, 이 지표에 대한 다른 설명이 있습니다, 어떤 설명은 지표 출력이 %K, %D 두 줄입니다. 어떤 설명은 출력이 STOCHRSI, MA(3) (이 설명의 변수는 14,14,3,3) 분석해보자, 사실 2가지의 다른 형태임에도 불구하고, %K === STOCHRSI, %D === MA(3) 출력된 2개의 줄 ((데이터) 의 계산 공식은 동일하다. MA(3) 중 3개가 하나의 변수임을 확인한다. 나머지 2개의 변수는, 위의 공식에 들어가게 되는데, M와 P1입니다. 14와 3 모두 시도해 보겠습니다. 결국 아낸 지표 데이터는, 결국 다른 플랫폼의 데이터와 일치합니다.

초록색은 %K, 오렌지색은 %D입니다. STOCHRSI 지표 이해

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