//+------------------------------------------------------------------+ //| CRiskManager.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" // CRiskManager.mqh class CRiskManager { // ---------------- PUBLIC INTERFACE ---------------- // The simple controls that the outside world can use. public: // Constructor: How we set up our risk rules. void CRiskManager(double maxRiskPercent, int maxOpenTrades) { m_max_risk_percent = maxRiskPercent; m_max_open_trades = maxOpenTrades; } // The main, simple question anyone can ask this class. bool isTradeAllowed(double stopLossPips) { // This public function calls its own private, complex helper functions. if (isMaxTradesExceeded()) { Print("Risk check failed: Maximum number of trades exceeded."); return false; } if (isRiskTooHigh(stopLossPips)) { Print("Risk check failed: Potential loss is too high for this trade."); return false; } Print("Risk check passed. Trade is allowed."); return true; } // ---------------- PRIVATE IMPLEMENTATION ---------------- // The hidden "engine" that the outside world cannot see or touch. private: // Member variables to store our rules and state. double m_max_risk_percent; int m_max_open_trades; // A private helper function to check trade count. bool isMaxTradesExceeded() { // In a real EA, this would check PositionsTotal() int currentTrades = PositionsTotal(); // Assuming we are checking current open positions return (currentTrades >= m_max_open_trades); } // A private helper function for the complex risk calculation. bool isRiskTooHigh(double stopLossPips) { double account_balance = AccountInfoDouble(ACCOUNT_BALANCE); double tick_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // This is the kind of complex logic you want to hide! double potential_loss_per_lot = stopLossPips * (tick_value / tick_size); double max_allowed_loss = account_balance * (m_max_risk_percent / 100.0); // For this example, we'll check based on a standard lot size of 1.0. // A more advanced version would calculate the lot size itself. if (potential_loss_per_lot > max_allowed_loss) { return true; // Risk is too high } return false; // Risk is acceptable } }; //+------------------------------------------------------------------+