資源の読み込みに... 荷物...

STOCHRSI指標を理解する

作者: リン・ハーン発明者 量化 - 微かな夢作成日:2016年8月24日 19:25:22 更新日:2017年10月11日 11:07:31

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つである. しかし,他の詳細は記載されていない.
  • 2. 各プラットフォームのチャート市場を見て,比較して,この指標の記述が異なることに気づきました.また,プラットフォームのタリブ指標データベースの指標関数STOCHRSIのパラメータ説明も完全に理解されていません.
  • 3. タリブ指標庫でパラメータを入力 14,14,3,3 このパラメータのセットは,データと他のプラットフォームとの比較で,大きな差異を見つけました. パラメータの説明を見て,異なることがわかりました.
  • 4.有点想动手撸这个指标…(有点怕怕,弄不好就被代码虐了)。

苦戦の末に... 概要:

  • 1,この指標の形状に関係なく,RSI指標は,この指標の基礎データである. 他のプラットフォームの記述と上記の公式を比較する.STOCHRSI指標を決定するパラメータには必ずRSIのパラメータがある.
  • 2、また,この指標の異なる記述が発見され,いくつかの記述は指標の出力%K,%Dの2行である. 分析すると,実際には,2つの異なる形ですが,%K === STOCHRSI,%D === MA(3) の出力2行 (データ) の計算式は同じです. MA(3) の3をパラメータとして決定します. 余った2つのパラメータは,上記の式に手動で入力します. MとP1です. 14、3も試してみました. 最終的には,漏れた指標データを発見し,最終的に他のプラットフォーム上のデータを正しました.

緑色は快線 %K オレンジ色は %Dimg

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

もっと

リジングXfdjmain function (メイン) {cH00ffff} exchange.SetContractType (("swap") // 永続契約として設定 var records = exchange.GetRecords ((PERIOD_M15)) について let [k, d, rsi] = FstochRSI (記録, 14, 14, 3, 3); ログ (K,k[k.length-2]) ログ (D,d[d.length-2]) {cH00ffff} --- この関数を呼び出すと, プリントされたデータは, バイナンのStochRsiの実際の値と一致します.

Jこの関数は,この関数に対して,非常に遅い速度で,改善が待っています

Jこのタリブ.STOCHRSI (STOCHRSI) は,Bitcoinwisdomのデータを正しく処理するために,何ができるのかわからない.

発明者 量化 - 微かな夢比較の問題かもしれません. 比較データは同じ品種,周期,パラメータ,BAR位置です. これは以前テストしましたが,同じでなければなりません.

発明者 量化 - 微かな夢talibは指標データベースです. Open Source です. BotVSでは,例えば,平均線を求める talib.MA ((records, 10); // records は平均線の周期を求めるK線データです. 計算すると records K 線が 10 バーの平均線である.

発明者 量化 - 微かな夢FstochRSI ((records,n,m,p1,p2) は OKCoin に対応するパラメータは同じです.ただし,最初の records は,K線データであり,指標の計算のデータ源です.

発明者 量化 - 微かな夢アルゴリズムやコードの最適化が必要かもしれません

J素晴らしい,今は正常です.ありがとう.

発明者 量化 - 微かな夢この記事のコードは既に投稿されているので,以下で比較してみてください.

Jストック関数を使って,

発明者 量化 - 微かな夢タリブには,内部の計算が違います. 私はSTOCHRSIを書いて,後で貼りました.