En la red encontré algunas fórmulas de cálculo para este indicador.
/*
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;
*/
¡Dios mío! ¡He terminado de verlo con paciencia! ((Cuando vi esto, me sentí como si hubiera tocado un clavo.)) Esta descripción es una fórmula general. Pero con un poco de experiencia en programación, sólo puedo adivinar! Adivinar!
Después de una lucha dolorosa... En resumen:
El verde es la línea rápida %K, el naranja es %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];
}
- ¿ Qué es eso?Función principal ¿Qué quieres decir? exchange.SetContractType (("swap") // Se ha establecido como un contrato permanente Var records = exchange.GetRecords ((PERIOD_M15)) es el nombre de un archivo de datos que se encuentra en el sitio web de Exchange. Let [k, d, rsi] = FstochRSI (records, 14, 14, 3, 3); y Log (("K", k[k.length-2]) Log (("D", d[d.length-2]) ¿Por qué no? - ¿Qué es eso? En resumen, he llamado a esta función, y los datos que se imprimen no coinciden con el valor real de StochRsi en Binance.
J.Cuando lo revisamos, encontramos que la velocidad de esta función es muy lenta y que hay que mejorar.
J.¿Qué es lo que se va a hacer con los datos de talib.STOCHRSI???? para corregir los datos de Bitcoinwisdom?
Los inventores cuantifican - sueños pequeñosPuede ser un problema de contraste, que determina que los datos de contraste son de la misma variedad, ciclo, parámetro, ubicación BAR. Esto se ha probado antes y debería ser lo mismo.
Los inventores cuantifican - sueños pequeñostalib es una base de datos de indicadores abierta. En BotVS se usa como tal, por ejemplo, para buscar la línea media talib.MA ((records, 10); // records para buscar la línea media de datos de la línea K del ciclo. Se calcula que los registros K son una línea media de 10 bares. Puede ir a BotVS QQ grupo: 608262365
Los inventores cuantifican - sueños pequeñosFstochRSI ((records, n, m, p1, p2) corresponde a los parámetros de OKCoin son los mismos, excepto que el primer records que es la línea de datos de K, es la fuente de datos de los indicadores de cálculo, que he comparado con el gráfico de OK es el mismo, es que el algoritmo de repetición es un poco más lento.
Los inventores cuantifican - sueños pequeñosPuede que el algoritmo o el código necesiten ser optimizados.
J.Muy bien, ahora es normal. Gracias.
Los inventores cuantifican - sueños pequeñosEl código ya está escrito en el post, puedes compararlo con el siguiente.
J.Primero usamos la función STOCH, que es casi lo mismo.
Los inventores cuantifican - sueños pequeñosTalib no está de acuerdo, el cálculo interno es un poco diferente. Yo mismo escribí STOCHRSI y lo publicé más adelante.