Bibliotecas: FuzzyNet - Biblioteca de Lógica Fuzzy

 

FuzzyNet - Biblioteca de Lógica Fuzzy:

FuzzyNet é uma das bibliotecas matemáticas mais populares para a criação de modelos fuzzy

Biblioteca Lógica Fuzzy para Microsoft.Net (FuzzyNet) é um componente de uso fácil que implementa sistemas de inferência fuzzy Mamdani e Sugeno.

FuzzyNet inclui:

  • 5 funções de pertinência.
  • Forma flexível para o desenvolvimento de regras do sistema fuzzy.
  • Sistema de inferência fuzzy Mamdani .
  • Sistema de inferência fuzzy Sugeno.
  • Um método de defuzificação para sistemas do tipo Mamdani.
  • Uma quantidade ilimitada de variáveis ​​para entrada e saída.

As seguintes adições foram feitas ao converter a biblioteca para MQL5:

  • 8 novas funções de pertinência.
  • 4 novos métodos de defuzificação para sistemas do tipo Mamdani.

Autor: MetaQuotes Software Corp.

 

1. É ótimo que isso agora esteja disponível no MT5. Entendi corretamente que a matemática é matemática na África e funcionará no MT4?

2. Experimentei o Fuzzi pela primeira vez no Matlab, mas, para ser sincero, isso foi há muito tempo e nunca entendi realmente como aplicá-lo à negociação forex com lucro garantido. Como resultado, fui em direção às wavelets, estatísticas e assim por diante.

3) Você poderia sugerir literatura sobre como aplicar a lógica Fuzzi na prática? Mesmo que não seja na negociação.

4. Estou interessado no tópico, o site precisa de um artigo sobre esse tópico?

 
Alexey Volchanskiy:

1. É ótimo que isso agora esteja disponível no MT5. Entendi corretamente que a matemática é matemática na África e funcionará no MT4?

2. Experimentei o Fuzzi pela primeira vez no Matlab, mas, para ser sincero, foi há muito tempo e nunca entendi realmente como aplicá-lo à negociação forex com lucro garantido. Como resultado, fui em direção às wavelets, estatísticas e assim por diante.

3) Você poderia sugerir literatura sobre como aplicar a lógica Fuzzi na prática? Mesmo que não seja na negociação.

4. Estou interessado no tópico, o site precisa de um artigo sobre esse tópico?

Olá.

1. Faremos a adaptação para o MT4 (um pouco mais tarde)

3. 4. Em breve lançaremos um artigo sobre o uso do FuzzyNet. Depois disso, escreva para o Service Desk para discutir o tópico de forma mais concreta.

 

O tópico merece atenção. A aplicação requer uma compreensão do assunto. E, desse ponto de vista, os exemplos das dicas não são sérios. A diferença entre os sistemas Mamdani e Sugeno deve ser explicada pelo menos de passagem. E conceitos básicos de lógica difusa seriam úteis para aqueles que ouvem falar desse conceito pela primeira vez.

Em algum lugar do arquivo, há um livro sobre lógica difusa em russo (descrição do programa Fuzzy Logic System). Portanto, com um golpe no arquivo, não o encontrarei. Mais tarde eu o publicarei.

Boa sorte.

 
Algumas fontes com conhecimento básico do assunto.
Arquivos anexados:
FuzLog.zip  1062 kb
 

Hi,

Gosto de sistemas como Fuzzy, SVM, Neural, então, pesquisando, descobri essa biblioteca e tentei. Os scripts incluídos são suficientes para entender, mas alguns erros na compilação que eu gostaria de observar - assim, no script cruise_control_sample_sugeno.mq5 com sugeno seria :

//+------------------------------------------------------------------+
//|fuzzynet.mqh
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementação da biblioteca FuzzyNet na MetaQuotes Language 5 (MQL5)
//||
//| Os recursos da biblioteca FuzzyNet incluem
//| - Criar modelo fuzzy Mamdani|
//| - Criar modelo fuzzy Sugeno|
//| - Função de associação normal|
//| - Função de associação triangular|
//| - Função de associação trapezoidal|
//| - Função de associação constante|
//| - Método de defuzzificação do centro de gravidade (COG)
//| - Método de defuzzificação do bissetor de área (BOA)
//| - Método de defuzzificação da média dos máximos (MeOM)
//||
//| Se você encontrar alguma diferença funcional entre o FuzzyNet for MQL5
//| e o projeto FuzzyNet original, entre em contato com os desenvolvedores de |
//| MQL5 no Fórum em www.mql5.com.|
//||
//| Você pode relatar erros encontrados nos algoritmos computacionais do
//| Biblioteca FuzzyNet, notificando os coordenadores do projeto FuzzyNet
//+------------------------------------------------------------------+
//| LICENÇA DE ORIGEM|
//||
//| Este programa é um software livre; você pode redistribuí-lo e/ou
//| Modificá-lo de acordo com os termos da Licença Pública Geral GNU, como
//| publicado pela Free Software Foundation(www.fsf.org); ou |
//| Versão 2 da Licença ou (a seu critério) qualquer versão posterior. |
//||
//| Esse programa é distribuído na esperança de que seja útil.
//| mas SEM QUALQUER GARANTIA; sem nem mesmo a garantia implícita de
//| COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO. Consulte a seção
//| GNU General Public License para obter mais detalhes.
//||
//| Uma cópia da Licença Pública Geral GNU está disponível em
//| 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
//+------------------------------------------------------------------+
//| Conexão de bibliotecas|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- parâmetros de entrada
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sistema Fuzzy Sugeno
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Criar as primeiras variáveis de entrada para o 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);
//--- Criar segundas variáveis de entrada para o 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);
//--- Criar saída
   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);
//--- Regra fuzzy Craete Sugeno
   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)");
//--- Adicionar a regra fuzzy Sugeno no 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);
//--- Definir o valor de entrada e obter o 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);
//--- Obter 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;
  }
//+------------------------------------------------------------------+

E o script com o mamdani :

//+------------------------------------------------------------------+
//|fuzzynet.mqh
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementação da biblioteca FuzzyNet na MetaQuotes Language 5 (MQL5)
//||
//| Os recursos da biblioteca FuzzyNet incluem
//| - Criar modelo fuzzy Mamdani|
//| - Criar modelo fuzzy Sugeno|
//| - Função de associação normal|
//| - Função de associação triangular|
//| - Função de associação trapezoidal|
//| - Função de associação constante|
//| - Método de defuzzificação do centro de gravidade (COG)
//| - Método de defuzzificação do bissetor de área (BOA)
//| - Método de defuzzificação da média dos máximos (MeOM)
//||
//| Se você encontrar alguma diferença funcional entre o FuzzyNet for MQL5
//| e o projeto FuzzyNet original, entre em contato com os desenvolvedores de |
//| MQL5 no Fórum em www.mql5.com.|
//||
//| Você pode relatar erros encontrados nos algoritmos computacionais do
//| Biblioteca FuzzyNet, notificando os coordenadores do projeto FuzzyNet
//+------------------------------------------------------------------+
//| LICENÇA DE ORIGEM|
//||
//| Este programa é um software livre; você pode redistribuí-lo e/ou
//| Modificá-lo de acordo com os termos da Licença Pública Geral GNU, como
//| publicado pela Free Software Foundation(www.fsf.org); ou |
//| Versão 2 da Licença ou (a seu critério) qualquer versão posterior. |
//||
//| Esse programa é distribuído na esperança de que seja útil.
//| mas SEM QUALQUER GARANTIA; sem nem mesmo a garantia implícita de
//| COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO. Consulte a seção
//| GNU General Public License para obter mais detalhes.
//||
//| Uma cópia da Licença Pública Geral GNU está disponível em
//| 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
//+------------------------------------------------------------------+
//| Conexão de bibliotecas|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- parâmetros de entrada
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sistema Fuzzy Mamdani
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Criar as primeiras variáveis de entrada para o 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);
//--- Criar segundas variáveis de entrada para o 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);
//--- Criar saída
   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);
//--- Criar três regras fuzzy 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)");
//--- Adicionar três regras fuzzy Mamdani no sistema
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Definir 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);
//--- Obter 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;
  }
//+------------------------------------------------------------------+

Obrigado por compartilhar!

 
É possível criar um modelo Mandani com mais de 02 variáveis de entrada? Estou cometendo erros quando insiro uma terceira variável de entrada.
[Excluído]  

Prezados, aqueles que apóiam a lib, bem, ou qualquer pessoa que ajude, por favor .... :) Quero acelerar os cálculos. No exemplo anexo, o script cria objetos de classes de lógica difusa, calcula o resultado e exclui. Quero fazer com que os objetos possam ser criados uma vez e, em Calculate(), passar apenas novos valores e obter os resultados, com a lógica fuzzy já configurada.

Aqui está o exemplo original, que funciona corretamente:

//+------------------------------------------------------------------+
//|amostra de dicas.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;

//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- Sistema Fuzzy Mamdani 
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Criar as primeiras variáveis de entrada para o 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);
//--- Criar segundas variáveis de entrada para o 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);
//--- Criar saída
   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);
//--- Criar três regras fuzzy 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)");
//--- Adicionar três regras fuzzy Mamdani no sistema
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Definir 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);
//--- Obter 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;
  }
//+------------------------------------------------------------------+

E aqui está o meu exemplo que apresenta um erro:

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)

O código em si:

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
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);
//--- Criar segundas variáveis de entrada para o 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);
//--- Criar saída
  
   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);
//--- Criar três regras fuzzy 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);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
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);
//--- Obter resultado
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

Em geral, a biblioteca foi projetada para poder criar objetos e, em seguida, apenas obter os resultados, digamos, em cada nova barra? Porque é lento e não é econômico recriar a lógica todas as vezes.

[Excluído]  

Versão da biblioteca com correções; agora, os objetos lógicos do fuzzie podem ser criados uma única vez e, em seguida, chamar apenas Calculate()

Verificar exemplo:

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
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);
//--- Criar as primeiras variáveis de entrada para o 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);
//--- Criar segundas variáveis de entrada para o 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);
//--- Criar saída

   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);
//--- Criar três regras fuzzy 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);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- excluir o sistema fuzzy
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
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);
      //--- Obter resultado
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
Arquivos anexados:
Fuzzy.zip  33 kb
 

h

quando atualizei o metatrader para a versão 2342

todos os exemplos com a biblioteca de lógica fuzzy

retornam o erro "incorrect casting of pointers" no MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Line 712

Por favor, ajude a corrigir o erro

Muito obrigado