FuzzyNet - una libreria per lavorare con la logica fuzzy:
Autore: MetaQuotes Software Corp.
1. E' fantastico che questo sia ora disponibile in mt5. Ho capito bene che la matematica è matematica in Africa e funzionerà in MT4?
2. Ho provato Fuzzi per la prima volta in Matlab, ma ad essere onesti, è stato molto tempo fa e non ho mai capito come applicarlo al trading sul forex con un profitto garantito. Di conseguenza, mi sono orientato verso wavelets, statistiche e così via.
3. Può suggerire letteratura su come applicare la logica di Fuzzi nella pratica? Anche se non nel trading.
4. Sono interessato all'argomento, il sito ha bisogno di un articolo su questo argomento?
1. E' fantastico che questo sia ora disponibile in mt5. Ho capito bene che la matematica è matematica in Africa e funzionerà in MT4?
2. Ho provato per la prima volta Fuzzi in Matlab, ma, ad essere onesti, è stato molto tempo fa e non ho mai capito come applicarlo al trading forex con un profitto garantito. Di conseguenza, mi sono orientato verso le wavelets, la statistica e così via.
3. Può suggerire letteratura su come applicare la logica di Fuzzi nella pratica? Anche se non nel trading.
4. Sono interessato all'argomento, il sito ha bisogno di un articolo su questo argomento?
Salve.
1. Faremo l'adattamento per MT4 (un po' più tardi).
3. 4. Presto pubblicheremo un articolo sull'uso di FuzzyNet. Dopodiché, scrivete al Service Desk per discutere l'argomento in modo più concreto.
L'argomento merita attenzione. L'applicazione richiede una comprensione dell'argomento. Da questo punto di vista, gli esempi di punta non sono seri. La differenza tra i sistemi Mamdani e Sugeno dovrebbe essere spiegata almeno di sfuggita. E i concetti di base della logica fuzzy sarebbero utili per coloro che sentono parlare di questo concetto per la prima volta.
Da qualche parte nell'archivio c'è un libro sulla logica fuzzy in russo (descrizione del programma Fuzzy Logic System). Quindi, con un colpo di mano nell'archivio non lo troverò. Più tardi lo pubblicherò.
Buona fortuna
Ciao,
Mi piacciono questi sistemi come Fuzzy, SVM, Neural, così guardando in giro ho trovato questa lib, ho provato. Gli script inclusi sono abbastanza per capire, ma pochi errori di compilazione vorrei solo notare - così sullo script cruise_control_sample_sugeno.mq5 con sugeno sarebbe :
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementazione della libreria FuzzyNet in MetaQuotes Language 5(MQL5)|
//||
//| Le caratteristiche della libreria FuzzyNet comprendono: |
//| - Creare il modello fuzzy di Mamdani|
//| - Creare il modello fuzzy di Sugeno|
//| - Funzione associativa normale|
//| - Funzione associativa triangolare|
//| - Funzione associativa trapezoidale|
//| - Funzione associativa costante|
//| - Metodo di defuzzificazione del centro di gravità (COG) |
//| - Metodo di defuzzificazione della bisettrice dell'area (BOA) |
//| - Metodo di defuzzificazione della media dei massimi (MeOM) |
//||
//| Se si riscontrano differenze funzionali tra FuzzyNet per MQL5 |
//| e il progetto FuzzyNet originale, si prega di contattare gli sviluppatori di |
//| MQL5 sul forum di www.mql5.com.|
//||
//| È possibile segnalare i bug riscontrati negli algoritmi di calcolo del programma.
//| biblioteca FuzzyNet notificando i coordinatori del progetto FuzzyNet |
//+------------------------------------------------------------------+
//| LICENZA D'ORIGINE|
//||
//| Questo programma è software libero; è possibile ridistribuirlo e/o |
//| modificarlo secondo i termini della GNU General Public License come |
//| pubblicato dalla Free Software Foundation(www.fsf.org); o |
//| versione 2 della Licenza, o (a scelta dell'utente) qualsiasi versione successiva. |
//||
//| Questo programma è distribuito con la speranza che sia utile, ||
//| ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di
//| COMMERCIABILITÀ o IDONEITÀ PER UNO SCOPO PARTICOLARE. Si veda la sezione
//| Licenza Pubblica Generica GNU per maggiori dettagli. |
//||
//|Una copia della Licenza Pubblica Generica GNU è disponibile all'indirizzo |
//| 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
//+------------------------------------------------------------------+
//| Collegare le librerie|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- parametri di ingresso
input double Speed_Error;
input double Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
{
//--- Sistema Fuzzy Sugeno
CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Creare le prime variabili di input per il 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);
//--- Creare le seconde variabili di input per il 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);
//--- Creare l'uscita
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);
//--- Regola fuzzy di 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)");
//--- Aggiungere la regola fuzzy di Sugeno nel 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);
//--- Impostare il valore di ingresso e ottenere il risultato
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);
//--- Ottenere il risultato
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 lo script con il mamdani :
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
//| Implementazione della libreria FuzzyNet in MetaQuotes Language 5(MQL5)|
//||
//| Le caratteristiche della libreria FuzzyNet comprendono: |
//| - Creare il modello fuzzy di Mamdani|
//| - Creare il modello fuzzy di Sugeno|
//| - Funzione associativa normale|
//| - Funzione associativa triangolare|
//| - Funzione associativa trapezoidale|
//| - Funzione associativa costante|
//| - Metodo di defuzzificazione del centro di gravità (COG) |
//| - Metodo di defuzzificazione della bisettrice dell'area (BOA) |
//| - Metodo di defuzzificazione della media dei massimi (MeOM) |
//||
//| Se si riscontrano differenze funzionali tra FuzzyNet per MQL5 |
//| e il progetto FuzzyNet originale, si prega di contattare gli sviluppatori di |
//| MQL5 sul forum di www.mql5.com.|
//||
//| È possibile segnalare i bug riscontrati negli algoritmi di calcolo del programma.
//| biblioteca FuzzyNet notificando i coordinatori del progetto FuzzyNet |
//+------------------------------------------------------------------+
//| LICENZA D'ORIGINE|
//||
//| Questo programma è software libero; è possibile ridistribuirlo e/o |
//| modificarlo secondo i termini della GNU General Public License come |
//| pubblicato dalla Free Software Foundation(www.fsf.org); o |
//| versione 2 della Licenza, o (a scelta dell'utente) qualsiasi versione successiva. |
//||
//| Questo programma è distribuito con la speranza che sia utile, ||
//| ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di
//| COMMERCIABILITÀ o IDONEITÀ PER UNO SCOPO PARTICOLARE. Si veda la sezione
//| Licenza Pubblica Generica GNU per maggiori dettagli. |
//||
//|Una copia della Licenza Pubblica Generica GNU è disponibile all'indirizzo |
//| 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
//+------------------------------------------------------------------+
//| Collegare le librerie|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- parametri di ingresso
input double Service;
input double Food;
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
{
//--- Sistema Fuzzy Mamdani
CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Creare le prime variabili di input per il 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);
//--- Creare le seconde variabili di input per il 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);
//--- Creare l'uscita
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);
//--- Creare tre regole fuzzy di 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)");
//--- Aggiungere tre regole fuzzy Mamdani nel sistema
fsTips.Rules().Add(rule1);
fsTips.Rules().Add(rule2);
fsTips.Rules().Add(rule3);
//--- Impostare il valore di ingresso
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);
//--- Ottenere il risultato
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;
}
//+------------------------------------------------------------------+
Grazie per la tua condivisione!
Caro chi sostiene il lib, bene, o semplicemente chiunque aiuti plz.... :) Voglio velocizzare i calcoli. Nell'esempio allegato lo script crea oggetti di classi fuzzy logic, calcola il risultato e lo cancella. Voglio fare in modo che gli oggetti possano essere creati una sola volta, e in Calculate() passare solo i nuovi valori e prendere i risultati, con la logica fuzzy già configurata.
Ecco l'esempio originale, che funziona correttamente:
//+------------------------------------------------------------------+ //|suggerimenti di esempio.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> //--- parametri di ingresso input double Service; input double Food; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ void OnTick() { //--- //--- Sistema Fuzzy di Mamdani CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem(); //--- Creare le prime variabili di input per il 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); //--- Creare le seconde variabili di input per il 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); //--- Creare l'uscita 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); //--- Creare tre regole fuzzy di 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)"); //--- Aggiungere tre regole fuzzy Mamdani nel sistema fsTips.Rules().Add(rule1); fsTips.Rules().Add(rule2); fsTips.Rules().Add(rule3); //--- Impostare il valore di ingresso 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); //--- Ottenere il risultato 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; } //+------------------------------------------------------------------+
Ed ecco il mio esempio che dà un errore:
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)
Il codice stesso:
//+------------------------------------------------------------------+ //|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; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ 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); //--- Creare le seconde variabili di input per il 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); //--- Creare l'uscita 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); //--- Creare tre regole fuzzy di 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); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ 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); //--- Ottenere il risultato result=fsTips.Calculate(in); Print("Error"); p_od_Tips=result.GetNodeAtIndex(0); Print("Tips, %: ",p_od_Tips.Value()); } } //+------------------------------------------------------------------+
In generale, la libreria è progettata per essere in grado di creare oggetti e poi ottenere solo i risultati, ad esempio, su ogni nuova barra? Perché è lento e non economico ricreare la logica ogni volta.
Versione della libreria con correzioni, ora gli oggetti logici fuzzie possono essere creati una sola volta e poi chiamare solo Calculate()
Esempio di controllo:
//+------------------------------------------------------------------+ //|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; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ 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); //--- Creare le prime variabili di input per il 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); //--- Creare le seconde variabili di input per il 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); //--- Creare l'uscita 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); //--- Creare tre regole fuzzy di 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); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- cancellare il sistema fuzzy In.FreeMode(true); delete In; delete FSTips; } //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ 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); //--- Ottenere il risultato CList *result=FSTips.Calculate(In); Dic_Tips=result.GetNodeAtIndex(0); Print("Tips, %: ",Dic_Tips.Value()); delete result; } } //+------------------------------------------------------------------+
h
quando ho aggiornato metatrader alla build 2342
tutti i campioni con la libreria fuzzy logic
restituiscono l'errore "casting errato dei puntatori" su MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Linea 712
per favore aiutatemi a risolvere il bug
grazie mille

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Fuzzy - libreria per lo sviluppo di modelli fuzzy:
La libreria FuzzyNet per lo sviluppo di modelli fuzzy è stata scritta in C#. Durante la conversione a MQL5, sono state aggiunte alla libreria 8 funzioni di appartenenza e 4 metodi di defuzzificazione per i sistemi di tipo Mamdani.
Autore: MetaQuotes