Ich habe im Internet einige Rechenformeln für diesen Indikator gefunden.
/*
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;
*/
Mein Gott, ich war so geduldig, dass ich es gesehen habe. Diese Beschreibung ist eine allgemeine Formel. Aber auch ich, mit etwas Programmiererfahrung, kann nur raten!
Nach einem schmerzhaften Kampf... Zusammenfassung:
Grün ist die Schnelllinie %K, Orange ist die Schnelllinie %D.
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];
}
- Das ist nicht wahr.Funktion main (() - Was ist los? exchange.SetContractType (("swap") // als dauerhafter Vertrag eingestellt Var records = exchange.GetRecords ((PERIOD_M15)) ist eine von den folgenden Websites: let [k, d, rsi] = FstochRSI ((records, 14, 14, 3, 3); Log (("K", k[k.length-2]) Log (("D", d[d.length-2]) Wir sind hier. - Ich weiß. Ich habe diese Funktion aufgerufen, und die Daten, die ich ausgedruckt habe, entsprechen nicht dem tatsächlichen Wert von StochRsi auf Binance.
JBei der Wiederholung wurde festgestellt, dass diese Funktion sehr langsam ist und verbessert werden muss.
JIch bin mir nicht sicher, was ich mit talib.STOCHRSI (WEB tun soll, um die Daten von Bitcoinwisdom zu korrigieren.
Die Erfinder quantifizieren - Kleine TräumeEs kann ein Vergleichsproblem sein, um festzustellen, dass die Daten der gleichen Art, Periode, Parameter, BAR-Position sind.
Die Erfinder quantifizieren - Kleine Träumetalib ist eine Indikator-Datenbank. Open Source. In BotVS wird so verwendet, z. B. für die Periode der gewünschten Durchschnittslinie. Die Berechnung erfolgt mit einer Durchschnittslinie von 10 bar in der Linie K der Records.
Die Erfinder quantifizieren - Kleine TräumeFstochRSI ((records,n,m,p1,p2)) entspricht den gleichen OKCoin-Parametern, außer dass der erste records, der K-Liniendaten ist, die Datenquelle für die Berechnung der Indikatoren ist, und ich habe die gleichen Daten für die Berechnung des OK-Graphs verglichen, weil der Algorithmus etwas langsam ist.
Die Erfinder quantifizieren - Kleine TräumeVielleicht müssen die Algorithmen oder der Code optimiert werden.
JDas ist sehr gut, jetzt ist alles normal.
Die Erfinder quantifizieren - Kleine TräumeDer Code ist bereits in einem Beitrag geschrieben, und Sie können einen Vergleich hier sehen.
JWir haben die Funktion STOCH benutzt.
Die Erfinder quantifizieren - Kleine TräumeIch habe selbst STOCHRSI geschrieben und später gepostet.