Bibliotecas: FuzzyNet - biblioteca para trabajar con lógica difusa

 

FuzzyNet - biblioteca para trabajar con lógica difusa:

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:

  • 5 funciones de pertenencia.
  • Forma flexible de escritura de normas para los sistemas difusos.
  • Sistema de deducción de lógica difusa Mamdani.
  • Sistema de deducción de lógica difusa Sugeno.
  • 1 método de defusificación para los sistemas del tipo Mamdani.
  • Cantidad ilimitada de variables de entrada y salida.

Al pasar la biblioteca a MQL5 se ha añadido a la biblioteca de manera adicional:

  • 8 nuevas funciones de pertenencia.
  • 4 nuevos métodos de defusificación para los sistemas del tipo Mamdani.

Autor: MetaQuotes Software Corp.

 

1. Es genial que esto esté ahora disponible en mt5. ¿Entiendo correctamente que es matemática en África y funcionará en MT4?

2. Primero probé Fuzzi en Matlab, pero para ser honesto, fue hace mucho tiempo y nunca entendí realmente cómo aplicarlo al comercio de divisas con ganancias garantizadas. Como resultado, me fui en la dirección de ondículas, estadísticas y así sucesivamente.

3. ¿Puede usted sugerir la literatura sobre cómo aplicar la lógica de Fuzzi en la práctica? Incluso si no en el comercio.

4. Estoy interesado en el tema, ¿el sitio necesita un artículo sobre este tema?

 
Alexey Volchanskiy:

1. Es genial que esto ya está disponible en mt5. ¿Entiendo correctamente que las matemáticas son matemáticas en África y funcionará en MT4?

2. Primero probé Fuzzi en Matlab, pero, para ser honesto, fue hace mucho tiempo y nunca entendí realmente cómo aplicarlo al comercio de divisas con ganancias garantizadas. Como resultado, me fui en la dirección de ondículas, estadísticas y así sucesivamente.

3. ¿Puede usted sugerir la literatura sobre cómo aplicar la lógica de Fuzzi en la práctica? Incluso si no en el comercio.

4. Estoy interesado en el tema, ¿el sitio necesita un artículo sobre este tema?

Hola.

1. Vamos a hacer la adaptación para MT4 (un poco más tarde)

3. 4. Pronto publicaremos un artículo sobre el uso de FuzzyNet. Después de eso escriba a Service Desk para discutir el tema más concretamente.

 

El tema merece atención. En la aplicación requiere una comprensión del tema. Y desde este punto de vista, los ejemplos de consejos no son serios. La diferencia entre los sistemas Mamdani y Sugeno debería explicarse al menos de pasada. Y los conceptos básicos de la lógica difusa serían útiles para los que oyen hablar de tal concepto por primera vez.

En algún lugar en el archivo hay un libro sobre la lógica difusa en ruso (descripción del programa Fuzzy Logic System). Así que con un golpe en el archivo no encontrará. Más tarde voy a publicar.

Suerte

 
Algunas fuentes con conocimientos básicos sobre el tema.
Archivos adjuntos:
FuzLog.zip  1062 kb
 

Hola,

Me gustan esos sistemas como Fuzzy, SVM, Neural, así que mirando a mi alrededor me encontré con que lib, lo intenté. Las secuencias de comandos incluidos son suficientes para entender, sin embargo, pocos errores en la compilación sólo me gustaría notar de - por lo que en la secuencia de comandos cruise_control_sample_sugeno.mq5 con sugeno sería :

//+------------------------------------------------------------------+
//|fuzzynet.mqh
//| Derechos de autor 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementación de la librería FuzzyNet en MetaQuotes Language 5(MQL5)||
//||
//| Las características de la librería FuzzyNet incluyen: ||
//| - Crear modelo difuso Mamdani|
//| - Crear el modelo difuso de Sugeno|
//| - Función de pertenencia normal|
//| - Función de pertenencia triangular|
//| - Función de pertenencia trapezoidal|
//| - Función de pertenencia constante|
//| - Método de defuzzificación del centro de gravedad (COG) |
//| - Método de defuzzificación de bisectriz de área (BOA) |
//| Método de defuzzificación de la media de los máximos (MeOM).
//||
//| Si encuentras alguna diferencia funcional entre FuzzyNet para MQL5 |
//| y el proyecto FuzzyNet original , póngase en contacto con los desarrolladores de ||.
//| MQL5 en el Foro en www.mql5.com.|
//||
//| Puedes informar de errores encontrados en los algoritmos computacionales del |
//| Biblioteca FuzzyNet notificando a los coordinadores del proyecto FuzzyNet |
//+------------------------------------------------------------------+
//| LICENCIA DE ORIGEN|
//||
//| Este programa es software libre; puede redistribuirlo y/o |.
//| modificarlo bajo los términos de la Licencia Pública General GNU como |
//| publicado por la Free Software Foundation(www.fsf.org); o bien |
//| versión 2 de la Licencia, o (a su elección) cualquier versión posterior. |
//||
//| Este programa se distribuye con la esperanza de que sea útil.
//| pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de |
//| COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Véase el
//| Licencia Pública General GNU para más detalles. ||
//||
//| Una copia de la Licencia Pública General GNU está disponible en ||
//| http://www.fsf.org/licensing/licenses                            |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| Conexión de bibliotecas|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- parámetros de entrada
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sistema Sugeno Fuzzy
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Crear las primeras variables de entrada para el sistema
   CFuzzyVariable *fvSpeedError=new CFuzzyVariable("SpeedError",-20.0,20.0);
   fvSpeedError.Terms().Add(new CFuzzyTerm("slower",new CTriangularMembershipFunction(-35.0,-20.0,-5.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-15.0, -0.0, 15.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(5.0, 20.0, 35.0)));
   fsCruiseControl.Input().Add(fvSpeedError);
//--- Crear segundas variables de entrada para el sistema
   CFuzzyVariable *fvSpeedErrorDot=new CFuzzyVariable("SpeedErrorDot",-5.0,5.0);
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("slower", new CTriangularMembershipFunction(-9.0, -5.0, -1.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-4.0, -0.0, 4.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(1.0, 5.0, 9.0)));
   fsCruiseControl.Input().Add(fvSpeedErrorDot);
//--- Crear salida
   CSugenoVariable *svAccelerate=new CSugenoVariable("Accelerate");
   double coeff1[3]={0.0,0.0,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("zero",coeff1));
   double coeff2[3]={0.0,0.0,1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("faster",coeff2));
   double coeff3[3]={0.0,0.0,-1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("slower",coeff3));
   double coeff4[3]={-0.04,-0.1,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("func",coeff4));
   fsCruiseControl.Output().Add(svAccelerate);
//--- Craete Sugeno regla difusa
   CSugenoFuzzyRule *rule1 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule2 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is zero) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule3 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is faster) then (Accelerate is zero)");
   CSugenoFuzzyRule *rule4 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule5 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is zero) then (Accelerate is func)");
   CSugenoFuzzyRule *rule6 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is faster) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule7 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule8 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is zero) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule9 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is faster) then (Accelerate is slower)");
//--- Añadir regla difusa Sugeno en el sistema
   fsCruiseControl.Rules().Add(rule1);
   fsCruiseControl.Rules().Add(rule2);
   fsCruiseControl.Rules().Add(rule3);
   fsCruiseControl.Rules().Add(rule4);
   fsCruiseControl.Rules().Add(rule5);
   fsCruiseControl.Rules().Add(rule6);
   fsCruiseControl.Rules().Add(rule7);
   fsCruiseControl.Rules().Add(rule8);
   fsCruiseControl.Rules().Add(rule9);
//--- Establecer el valor de entrada y obtener el resultado
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Error=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_ErrorDot=new CDictionary_Obj_Double;
   p_od_Error.SetAll(fvSpeedError,Speed_Error);
   p_od_ErrorDot.SetAll(fvSpeedErrorDot,Speed_ErrorDot);
   in.Add(p_od_Error);
   in.Add(p_od_ErrorDot);
//--- Obtener resultado
   CList *result;
   CDictionary_Obj_Double *p_od_Accelerate;
   result=fsCruiseControl.Calculate(in);
   p_od_Accelerate=result.GetNodeAtIndex(0);
   Alert("Accelerate, %: ",p_od_Accelerate.Value()*100);
   delete in;
   delete result;
   delete fsCruiseControl;
  }
//+------------------------------------------------------------------+

Y el script con el mamdani :

//+------------------------------------------------------------------+
//|fuzzynet.mqh
//| Derechos de autor 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementación de la librería FuzzyNet en MetaQuotes Language 5(MQL5)||
//||
//| Las características de la librería FuzzyNet incluyen: ||
//| - Crear modelo difuso Mamdani|
//| - Crear el modelo difuso de Sugeno|
//| - Función de pertenencia normal|
//| - Función de pertenencia triangular|
//| - Función de pertenencia trapezoidal|
//| - Función de pertenencia constante|
//| - Método de defuzzificación del centro de gravedad (COG) |
//| - Método de defuzzificación de bisectriz de área (BOA) |
//| Método de defuzzificación de la media de los máximos (MeOM).
//||
//| Si encuentras alguna diferencia funcional entre FuzzyNet para MQL5 |
//| y el proyecto FuzzyNet original , póngase en contacto con los desarrolladores de ||.
//| MQL5 en el Foro en www.mql5.com.|
//||
//| Puedes informar de errores encontrados en los algoritmos computacionales del |
//| Biblioteca FuzzyNet notificando a los coordinadores del proyecto FuzzyNet |
//+------------------------------------------------------------------+
//| LICENCIA DE ORIGEN|
//||
//| Este programa es software libre; puede redistribuirlo y/o |.
//| modificarlo bajo los términos de la Licencia Pública General GNU como |
//| publicado por la Free Software Foundation(www.fsf.org); o bien |
//| versión 2 de la Licencia, o (a su elección) cualquier versión posterior. |
//||
//| Este programa se distribuye con la esperanza de que sea útil.
//| pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de |
//| COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Véase el
//| Licencia Pública General GNU para más detalles. ||
//||
//| Una copia de la Licencia Pública General GNU está disponible en ||
//| http://www.fsf.org/licensing/licenses&nbsp;                           |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| Conexión de bibliotecas|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- parámetros de entrada
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sistema difuso Mamdani
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Crear las primeras variables de entrada para el sistema
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Crear segundas variables de entrada para el sistema
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Crear salida
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Crear tres reglas difusas Mamdani
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- Añadir tres reglas difusas Mamdani en el sistema
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Establecer valor de entrada
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Obtener resultado
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Alert("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

¡Gracias por compartir !

 
¿Es posible crear un modelo mandani con más de 02 variables de entrada? Estoy cometiendo errores cuando introduzco una tercera variable de entrada.
 

Queridos aquellos que apoyan la lib, así, o simplemente cualquier persona ayuda plz.... :) Quiero acelerar los cálculos. En el ejemplo adjunto script que crea objetos de clases de lógica difusa, calcula el resultado y borra. Quiero hacer que los objetos se puedan crear 1 vez, y en Calculate() pasar solo valores nuevos y tomar los resultados, con la logica difusa ya configurada.

Aquí está el ejemplo original, que funciona correctamente:

//+------------------------------------------------------------------+
//|tips sample.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>
//--- parámetros de entrada
input double   Service;
input double   Food;

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- Sistema difuso Mamdani 
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Crear las primeras variables de entrada para el sistema
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Crear segundas variables de entrada para el sistema
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Crear salida
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Crear tres reglas difusas de Mamdani
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- Añadir tres reglas difusas Mamdani en el sistema
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Establecer valor de entrada
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Obtener resultado
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

Y aquí mi ejemplo que da error:

2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   Input values count is incorrect.
2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   invalid pointer access in 'MamdaniFuzzySystem.mqh' (172,42)

El código en sí:

//+------------------------------------------------------------------+
//|TipsSample.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *rule1, *rule2, *rule3;

CList *in=new CList;
CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;

CList *result;
CDictionary_Obj_Double *p_od_Tips;
   
int OnInit()
  {
//---
   
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Crear segundas variables de entrada para el sistema
   
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Crear salida
  
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Crear tres reglas difusas de Mamdani
   rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
   
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  { 
   int ir; 
   for(ir=1; ir<10; ir++)
   { 
   p_od_Service.SetAll(fvService, ir);
   p_od_Food.SetAll(fvFood, ir);
   Print(CheckPointer(in));
   in.Clear();
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Obtener resultado
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

En general, ¿la lib está diseñada para poder crear objetos y luego sólo obtener los resultados, digamos, en cada nueva barra? Porque es lento y poco económico recrear la lógica cada vez.

 

Versión de la librería con correcciones, ahora los objetos fuzzie logic pueden ser creados 1 vez y luego solo llamar a Calculate()

Comprobar ejemplo:

//+------------------------------------------------------------------+
//|TipsSample.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *FSTips=new CMamdaniFuzzySystem();
CFuzzyVariable *FVService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *FVFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *FVTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *Rule1,*Rule2,*Rule3;

CList *In=new CList;
CDictionary_Obj_Double *Dic_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Food=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Tips;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit()
  {
   In.FreeMode(false);
//--- Crear las primeras variables de entrada para el sistema

   FVService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   FVService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   FSTips.Input().Add(FVService);
//--- Crear segundas variables de entrada para el sistema

   FVFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   FVFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   FSTips.Input().Add(FVFood);
//--- Crear salida

   FVTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   FVTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   FSTips.Output().Add(FVTips);
//--- Crear tres reglas difusas de Mamdani
   Rule1 = FSTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   Rule2 = FSTips.ParseRule("if ((service is good)) then tips is average");
   Rule3 = FSTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");

   FSTips.Rules().Add(Rule1);
   FSTips.Rules().Add(Rule2);
   FSTips.Rules().Add(Rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- borrar sistema difuso
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int ir=1; ir<10; ir++)
     {
      Dic_Service.SetAll(FVService,ir);
      Dic_Food.SetAll(FVFood,ir);
      In.Clear();
      In.Add(Dic_Service);
      In.Add(Dic_Food);
      //--- Obtener resultado
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
Fuzzy.zip  33 kb
 

h

cuando actualice metatrader a build 2342

todos los ejemplos con la libreria fuzzy logic

devuelven error "incorrect casting of pointers" en MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Line 712

por favor ayuda para corregir el error

muchas gracias