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!
Après une lutte acharnée... Résumé:
Le vert est la ligne rapide %K, l'orange est la ligne rapide %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];
}
Je vous en prie.fonction main (()) Je ne sais pas. Exchange.SetContractType (("swap") // est défini comme un contrat permanent Var records = exchange.GetRecords ((PERIOD_M15)) est un fichier enregistré par le système d'exploitation. let [k, d, rsi] = FstochRSI ((records, 14, 14, 3, 3); Log (("K", k[k.length-2]) Log (("D", d[d.length-2]) Je ne sais pas. - Je ne sais pas. En somme, j'ai appelé cette fonction, et les données imprimées ne correspondent pas à la valeur réelle de StochRsi sur Binance.
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.
L'inventeur de la quantification - un petit rêveIl peut s'agir d'un problème de comparaison, de déterminer si les données de comparaison sont de la même espèce, de la même période, des mêmes paramètres, de la même position BAR.
L'inventeur de la quantification - un 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
L'inventeur de la quantification - un 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.
L'inventeur de la quantification - un 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!
L'inventeur de la quantification - un 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.
L'inventeur de la quantification - un 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.