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! - 1. La información que se encuentra en línea dice que el indicador tiene aproximadamente tres formas diferentes. La fórmula anterior es dos de ellas. Pero la información no dice más detalles sobre las tres formas diferentes. - 2. Ver, comparar y comparar los gráficos de las distintas plataformas. Encontrar que las descripciones de este indicador varían. - 3. Introducción de los parámetros 14, 14, 3, 3 con la base de datos de talib Este conjunto de parámetros, la comparación de los datos obtenidos con otras plataformas, encontró grandes diferencias. - 4. un poco de ganas de mover la mano para cambiar el indicador... (un poco de miedo, no lo hago bien, soy maltratado por el código).
Después de una lucha dolorosa... En resumen: - 1, el indicador, sea cual sea su forma, el indicador RSI es la base de datos de este indicador. Contraste con otras plataformas descritas y las fórmulas anteriores. - 2, también encontramos diferentes descripciones de este indicador, algunas descripciones son que el indicador de salida es % K, % D dos líneas. Algunas descripciones son que la salida es STOCHRSI, MA ((3) (los parámetros de esta descripción son 14, 14, 3, 3) Si analizamos un poco, en realidad, aunque son dos formas diferentes, %K === STOCHRSI, %D === MA(3) la fórmula de cálculo de las dos líneas de salida ((datos) es la misma. Determinar que 3 de MA ((3) es un parámetro. Los dos parámetros restantes, que se introducen manualmente en la fórmula anterior, son M y P1. 14 y 3 se intentan. Finalmente, se encuentran los datos de indicadores filtrados, finalmente los datos de otras plataformas son correctos.
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.