Autor real
Dmitry Kalyuzhny. Página del proyecto FuzzyNet - http://sourceforge.net/projects/fuzzynet/
Para que funcione, es necesario el archivo en la carpeta catálogo_de_datos_del_terminal.
Los códigos de la biblioteca se colocan en la carpeta: <catálogo_de_datos_del_terminal>\MQL5\Include\Math\FuzzyNet\
Es posible encontrar ejemplos de scripts de prueba en la carpeta: <catálogo_de_datos_del_terminal>\MQL5\Scripts\FuzzyNet\
FuzzyNet es una de la bibliotecas matemáticas más populares para crear modelos difusos
Fuzzy Logic Library Microsoft.Net (FuzzyNet) es una biblioteca de lógica difusa fácil de usar, en la que están implementados los sistemas de deducción de lógica difusa Mamdani y Sugeno.
FuzzyNet incluye:
Al pasar la biblioteca a MQL5 se ha añadido a la biblioteca de manera adicional:
Orden de trabajo con la biblioteca
Advertencia: Es posible producir los ajustes del sistema de deducción lógica del tipo Mamdani en cualquier etapa después de su creación y hasta la llamada de la función de cálculo del sistema. Si después de crear el sistema sus parámetros no han cambiado, entonces el sistema funcionará con los parámetros por defecto. Que serían, precisamente:
Aquí presentamos la conversión de la biblioteca FuzzyNet de la versión 1.2.0.
Para trabajar con con la biblioteca, es imprescindible conectar los archivos MamdaniFuzzySystem.mqh o SugenoFuzzySystem.mqh, dependiendo del sistema creado.
Más información sobre los paquetes de la biblioteca portada FuzzyNet:| Paquetes | Descripción |
|---|---|
| Dictionary.mqh | El paquete incluye las clases auxiliares necesarias para otros paquetes. |
| FuzzyRule.mqh | Clases para la creación de normas difusas:
El paquete también contiene las clases auxiliares para la implementación de las normas difusas. |
| FuzzyTerm.mqh | Paquete para la creación de términos difusos. |
| FuzzyVariable.mqh | Paquete para la creación de variables difusas |
| GenericFuzzySystem.mqh | Clase que realiza la parte funcional general para los sistemas Mamdani y Sugeno. |
| Helper.mqh | El paquete incluye las clases auxiliares necesarias para otros paquetes. |
| InferenceMethod.mqh | El paquete incluye las clases auxiliares necesarias para otros paquetes. |
| MamdaniFuzzySystem.mqh | Clase para la creación de un sistema difuso del tipo Mamdani. |
| MembershipFunction.mqh | Clases de las funciones de pertenencia:
|
| RuleParser.mqh | Clase para el análisis de normas difusas. |
| SugenoFuzzySystem.mqh | Clase para la creación de un sistema difuso del tipo Sugeno. |
| SugenoVariable.mqh | El paquete contiene las clases:
Las variables difusas del tipo Sugeno se usan al escribir las normas para un sistema del tipo Sugeno. |
Régimen de trabajo con la biblioteca FuzzyNet en MQL5
Antes de escribir un sistema difuso, es necesario presentarlo de forma detallada. Que serían, precisamente:
Proceso de creación del sistema y su cálculo:
Para el sistema del tipo Mamdani:
MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();Para el sistema del tipo Sugeno:
SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
SugenoVariable *sugeno_variable=new SugenoVariable(const string name);En lugar de los términos difusos, a la variable difusa del tipo Sugeno se añaden funciones lineales que interpretan la combinación lineal de los valores de entrada. Los parámetros de la función lineal serán su nombre y la matriz de los coeficientes. En base a esta matriz se creará una ecuación lineal, por eso es importante respetar el orden de los elementos en la matriz. La longitud de la matriz de los coeficientes deberá ser igual o superior en una unidad a la cantidad de valores de entrada. Si las longitudes son iguales, entonces el miembro libre de la ecuación será igual a cero. Si la longitud de la matriz es superior en una unidad, entonces el miembro libre será igual al valor del último elemento. A todos los demás elementos de la matriz, comenzando por el primero, se les da de la forma correspondiente una variable de entrada difusa, de acuerdo con el orden en el que se introdujeron en el sistema.
sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
Para el sistema del tipo Mamdani:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Para el sistema del tipo Sugeno:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Para el sistema del tipo Mamdani:
MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
Para el sistema del tipo Sugeno:
SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
Para el sistema del tipo Mamdani:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
Para el sistema del tipo Sugeno:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;Esta clase realiza en sí mismo el método SetAll(CObject *key, const double value), que adopta dos parámetros: una variable difusa y un valor numérico. Este elemento es el que supone el valor de entrada del sistema.
p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);Según esta misma tecnología, rellenamos el resto de los valores de entrada. Creamos una lista y los introducimos todos en ella:
CList *in=new CList; in.Add(p_od_in);
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
out=fuzzy_system.Calculate(in);Después de esto, en la lista out se guardarán todos los valores de salida calculados en el mismo orden en el que se introdujeron en el sistema. Lo único que nos queda es obtener estos valores:
p_od_out=out.GetNodeAtIndex(int index); double result=p_od_out.Value();Ahora, en la varible result se guardará el resultado del cálculo del sistema para el valor de entrada introducido en el sistema, con el número que se haya indicado en index.
Tips Sample (Mamdani)
El script de prueba Tips_Sample_Mamdani.mq5 calcula el tanto por ciento de propina que hay que dejar en un establecimiento, partiendo de la calidad del servicio y la comida.
Introducimos los parámetros de entrada:

El resultado del cálculo será:

Cruise Control Sample (Sugeno)
El script de prueba Cruise_Control_Sample_Sugeno.mq5 es un ejemplo de un regulador difuso. Representa el sistema de cruise-control de un automóvil que calcula la aceleración necesaria para el automóvil, para que este salga a la velocidad establecida, apoyándose en los datos sobre la desviación y velocidad actual de cambio de esta desviación.
Introducimos los parámetros de entrada:

El resultado del cálculo será:

Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/13697
ColorSchaffMomentumTrendCycle_HTF
Indicador ColorSchaffMomentumTrendCycle con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.
ColorSchaffMFITrendCycle_HTF
Indicador ColorSchaffMFITrendCycle con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.
ColorSchaffRSITrendCycle_HTF
Indicador ColorSchaffRSITrendCycle con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.
ColorSchaffRVITrendCycle_HTF
Indicador ColorSchaffRVITrendCycle con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.