//+------------------------------------------------------------------+ //| helper.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 "InferenceMethod.mqh" //+------------------------------------------------------------------+ //| Purpose: Analysis of the fuzzy rules | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| This class must be implemented by values in parsable rules | //+------------------------------------------------------------------+ class INamedValue : public CObject { public: //--- method to check type virtual bool IsTypeOf(EnType type) { return(type==TYPE_CLASS_INamedValue); } //--- methods gets or sets the name virtual string Name(void) { return(""); } virtual void Name(const string name) { } }; //+------------------------------------------------------------------+ //| This class must be implemented by values in parsable rules | //+------------------------------------------------------------------+ class INamedVariable : public INamedValue { public: //--- method to check type virtual bool IsTypeOf(EnType type) { return(type==TYPE_CLASS_INamedValue); } //--- get list of values that belongs to the variable virtual CList *Values(void) { return(NULL); } }; //+------------------------------------------------------------------+ //| Named variable | //+------------------------------------------------------------------+ class CNamedVariableImpl : public INamedVariable { private: string m_name; // Name of the variable public: //--- method to check type virtual bool IsTypeOf(EnType type) { return(type==TYPE_CLASS_NamedVariableImpl); } //--- methods gets or sets varriable name virtual void Name(const string name); virtual string Name(void) { return(m_name); } //--- get list of values that belongs to the variable virtual CList *Values(void) { return(NULL); } }; //+------------------------------------------------------------------+ //| Set variable name | //+------------------------------------------------------------------+ void CNamedVariableImpl::Name(const string name) { if(!CNameHelper::IsValidName(name)) { Print("Invalid variable name."); } m_name=name; } //+------------------------------------------------------------------+ //| Named value of variable | //+------------------------------------------------------------------+ class CNamedValueImpl : public INamedValue { private: string m_name; // Name of the value public: //--- method to check type virtual bool IsTypeOf(EnType type) { return(type==TYPE_CLASS_NamedVariableImpl); } //--- methods gets or sets varriable name virtual void Name(const string name); virtual string Name(void) { return(m_name); } }; //+------------------------------------------------------------------+ //| Set variable name | //+------------------------------------------------------------------+ void CNamedValueImpl::Name(const string name) { if(!CNameHelper::IsValidName(name)) { Print("Invalid term name."); } m_name=name; } //+------------------------------------------------------------------+ //| Keywords: | //+------------------------------------------------------------------+ static string KEYWORDS[]={ "if","then","is","and","or","not","(",")","slightly","somewhat","very","extremely" }; // Keywords in rules //+------------------------------------------------------------------+ //| Class NameHelper checks the availability of names | //+------------------------------------------------------------------+ class CNameHelper { public: //+------------------------------------------------------------------+ //| Check the name of variable/term | //+------------------------------------------------------------------+ static bool IsValidName(const string name) { //--- Empty names are not allowed if(StringLen(name)==0) { //--- return false return (false); } for(int i=0; i=48 && s<=57) // Not numbers and symbol '_' && !( s >= 65 && s <= 90 ) // Not capital letters && !( s >= 97 && s <= 122 )) // Not letters { //--- return false return (false); } } //--- Identifier cannot be a keword for(int i=0; i