//+------------------------------------------------------------------+ //| fuzzyvariable.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ //| Implementation of Fuzzy library in MetaQuotes Language 5 | //| | //| The features of the library include: | //| - Create Mamdani fuzzy model | //| - Create Sugeno fuzzy model | //| - Normal membership function | //| - Triangular membership function | //| - Trapezoidal membership function | //| - Constant membership function | //| - Defuzzification method of center of gravity (COG) | //| - Defuzzification method of bisector of area (BOA) | //| - Defuzzification method of mean of maxima (MeOM) | //| | //| This file is free software; you can redistribute it and/or | //| modify it under the terms of the GNU General Public License as | //| published by the Free Software Foundation (www.fsf.org); either | //| version 2 of the License, or (at your option) any later version. | //| | //| This program is distributed in the hope that it will be useful, | //| but WITHOUT ANY WARRANTY; without even the implied warranty of | //| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | //| GNU General Public License for more details. | //+------------------------------------------------------------------+ #include #include "FuzzyTerm.mqh" //+------------------------------------------------------------------+ //| Purpose: creating fuzzy variable | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Fuzzy or linguistic variable. | //+------------------------------------------------------------------+ class CFuzzyVariable : public CNamedVariableImpl { private: double m_min; // Minimum value of the variable double m_max; // Maximum value of the variable CList *m_terms; // List of terms in a variable public : CFuzzyVariable(const string name,const double min,const double max); ~CFuzzyVariable(void); //--- method to check type virtual bool IsTypeOf(EnType type) { return(type==TYPE_CLASS_FuzzyVariable); } //--- methods gets or sets parameters of varriable void Max(const double max) { m_max=max; } double Max(void) { return (m_max); } void Min(const double min) { m_min=min; } double Min(void) { return (m_min); } //--- methods gets or sets the terms CList *Terms() { return(m_terms); } void Terms(CList *terms) { m_terms=terms; } //--- add fuzzy term void AddTerm(CFuzzyTerm *term); //--- get membership function by name CFuzzyTerm *GetTermByName(const string name); //--- overload CList *Values() { return(m_terms); } }; //+------------------------------------------------------------------+ //| Constructor with parameters | //+------------------------------------------------------------------+ CFuzzyVariable::CFuzzyVariable(const string name,const double min,const double max) { CNamedVariableImpl::Name(name); m_terms=new CList(); if(min>max) { Print("Incorrect parameters! Maximum value must be greater than minimum one."); } else { m_min = min; m_max = max; } } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CFuzzyVariable::~CFuzzyVariable(void) { delete m_terms; } //+------------------------------------------------------------------+ //| Add fuzzy term to list terms in a variable | //+------------------------------------------------------------------+ void CFuzzyVariable::AddTerm(CFuzzyTerm *term) { m_terms.Add(term); } //+------------------------------------------------------------------+ //| Get membership function (term) by name | //+------------------------------------------------------------------+ CFuzzyTerm *CFuzzyVariable::GetTermByName(const string name) { for(int i=0; i