FuzzyNet - una librería para trabajar con lógica difusa:
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?
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
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 |
//+------------------------------------------------------------------+
#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 !
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; } } //+------------------------------------------------------------------+
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
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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:
Al pasar la biblioteca a MQL5 se ha añadido a la biblioteca de manera adicional:
Autor: MetaQuotes Software Corp.