FuzzyNet - uma biblioteca para trabalhar com lógica fuzzy:
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?
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.
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 |
//+------------------------------------------------------------------+
#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!
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.
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; } } //+------------------------------------------------------------------+
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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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:
As seguintes adições foram feitas ao converter a biblioteca para MQL5:
Autor: MetaQuotes Software Corp.