//+------------------------------------------------------------------+ //| CSignal.mqh | //| Copyright 2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "SoloTrade Official, Solomon" #property link "https://www.mql5.com/en/users/SoloTradeOfficial" #property version "1.00" #property description "THE WORLD MOST INTELLIGENT FOREX AI/ALGO BOTS EVER IN" "HUMAN HISTORY OF FINTECH, BY SOLOMON ESHUN" "\nTrading Bots in MQL5" // Polymorphism // Base Class - The "Vehicle" class CSignal { public: // This is a virtual function. It's a placeholder. // We expect derived classes to provide their own real implementation. virtual bool checkCondition() { Print("This is the generic signal. It does nothing."); return false; // Default behavior } }; // Derived Class 1 - The "Car" class CMACrossoverSignal : public CSignal { public: // We OVERRIDE the base class function with our specific logic virtual bool override checkCondition() { // --- FAKE LOGIC FOR DEMONSTRATION --- // In a real EA, you'd calculate MAs here. // Let's pretend the fast MA just crossed above the slow MA. Print("MA Crossover Signal: BUY condition met!"); return true; } }; // Derived Class 2 - The "Boat" class CRsiSignal : public CSignal { public: // We OVERRIDE the base class function with our specific logic virtual bool override checkCondition() { // --- FAKE LOGIC FOR DEMONSTRATION --- // In a real EA, you'd calculate the RSI value. // Let's pretend RSI is oversold. Print("RSI Signal: BUY condition met! (RSI is oversold)"); return true; } }; // Putting it all together in the main part of the program void OnStart() { // Create a pointer to the BASE class type. // This pointer is flexible and can hold any object that INHERITS from CSignal. CSignal *myCurrentSignal; //--- Scenario 1: We decide to use the Moving Average Crossover signal --- Print("--- Using MA Crossover Strategy ---"); myCurrentSignal = new CMACrossoverSignal(); // The pointer now holds a CMACrossoverSignal object // We call the function. MQL5 sees it's a virtual function and // automatically calls the OVERRIDDEN version from CMACrossoverSignal. if (myCurrentSignal.checkCondition()) { // Place Buy Order Print("Placing trade based on the active signal."); } // Clean up memory delete myCurrentSignal; Print("\n--- Switching to RSI Strategy ---"); //--- Scenario 2: Now we want to use the RSI signal --- myCurrentSignal = new CRsiSignal(); // The SAME pointer now holds a CRsiSignal object! // We call the EXACT SAME line of code. But because myCurrentSignal now // points to a CRsiSignal object, the RSI version of checkCondition() is called. // This is polymorphism in action! if (myCurrentSignal.checkCondition()) { // Place Buy Order Print("Placing trade based on the active signal."); } // Clean up memory delete myCurrentSignal; } //+------------------------------------------------------------------+