//+------------------------------------------------------------------+
//|                                       FixedMonetaryModel.mqh     |
//+------------------------------------------------------------------+

#ifndef FIXED_MONETARY_MODEL_MQH
#define FIXED_MONETARY_MODEL_MQH

#include "RiskTypes.mqh"
#include "LotConverter.mqh"

//+------------------------------------------------------------------+
//| CFixedMonetaryModel                                              |
//+------------------------------------------------------------------+
class CFixedMonetaryModel
  {
private:
   CLotConverter     m_converter;   // shared money-per-point and normalization helper

public:
                     CFixedMonetaryModel(void);
                    ~CFixedMonetaryModel(void);

   CSizingResult     Calculate(const string symbol,const ENUM_ORDER_TYPE order_type,const double risk_amount,const double stop_points);
  };

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CFixedMonetaryModel::CFixedMonetaryModel(void)
  {
  }

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CFixedMonetaryModel::~CFixedMonetaryModel(void)
  {
  }

//+------------------------------------------------------------------+
//| Calculate                                                        |
//+------------------------------------------------------------------+
CSizingResult CFixedMonetaryModel::Calculate(const string symbol,const ENUM_ORDER_TYPE order_type,const double risk_amount,const double stop_points)
  {
   CSizingResult result;
   result.model_used  = RISK_MODEL_FIXED_MONETARY;
   result.stop_points = stop_points;

   if(risk_amount <= 0.0)
     {
      result.success = false;
      result.reason  = "risk_amount must be positive";
      return(result);
     }

   if(stop_points <= 0.0)
     {
      result.success = false;
      result.reason  = "stop_points must be positive";
      return(result);
     }

   double actual_risk_amount = 0.0;
   double lots               = m_converter.LotsForRisk(symbol,order_type,risk_amount,stop_points,actual_risk_amount);

   if(lots <= 0.0)
     {
      result.success = false;
      result.reason  = "unable to compute a valid lot size for the requested risk";
      return(result);
     }

   result.success             = true;
   result.lots                = lots;
   result.risk_amount         = risk_amount;
   result.actual_risk_amount  = actual_risk_amount;
   result.scaling_factor      = 1.0;
   result.reason              = "fixed monetary sizing at a flat risk of " + DoubleToString(risk_amount,2);

   return(result);
  }

#endif // FIXED_MONETARY_MODEL_MQH
//+------------------------------------------------------------------+