//+------------------------------------------------------------------+
//|                                         TradeQualityTypes.mqh    |
//|                   Data structures for trade quality analytics    |
//+------------------------------------------------------------------+
#ifndef TRADEQUALITYTYPES_MQH
#define TRADEQUALITYTYPES_MQH

//+------------------------------------------------------------------+
//| Trade direction, kept independent of position/order enums so     |
//| the analytics layer does not depend on live position state       |
//+------------------------------------------------------------------+
enum ENUM_TRADE_DIRECTION
  {
   TRADE_DIRECTION_BUY = 0,
   TRADE_DIRECTION_SELL = 1
  };

//+------------------------------------------------------------------+
//| CTradeRecord                                                     |
//| One completed round-trip trade, built from one or more deals     |
//| that share the same position identifier.                         |
//+------------------------------------------------------------------+
class CTradeRecord
  {
public:
   ulong                 m_position_id;
   string                m_symbol;
   ENUM_TRADE_DIRECTION  m_direction;
   double                m_entry_price;
   double                m_exit_price;
   datetime              m_entry_time;
   datetime              m_close_time;
   double                m_net_profit;
   double                m_pip_result;
   bool                  m_pip_result_defined;

                     CTradeRecord(void);
                    ~CTradeRecord(void);
  };

//+------------------------------------------------------------------+
//| Constructor: every field starts at a neutral, explicit default   |
//+------------------------------------------------------------------+
CTradeRecord::CTradeRecord(void)
  {
   m_position_id        = 0;
   m_symbol             = "";
   m_direction          = TRADE_DIRECTION_BUY;
   m_entry_price        = 0.0;
   m_exit_price         = 0.0;
   m_entry_time         = 0;
   m_close_time         = 0;
   m_net_profit         = 0.0;
   m_pip_result         = 0.0;
   m_pip_result_defined = false;
  }

//+------------------------------------------------------------------+
//| Destructor: no owned resources                                   |
//+------------------------------------------------------------------+
CTradeRecord::~CTradeRecord(void)
  {
  }

//+------------------------------------------------------------------+
//| CQualityMetrics                                                  |
//| Full set of metrics produced by CTradeQualityCalculator::Compute |
//| for one trade set (full universe or a filtered subset).          |
//+------------------------------------------------------------------+
class CQualityMetrics
  {
public:
   int               m_trade_count;
   int               m_win_count;
   int               m_loss_count;
   int               m_breakeven_count;

   double            m_win_rate;
   double            m_loss_rate;

   double            m_avg_win_currency;
   bool              m_avg_win_currency_defined;
   double            m_avg_loss_currency;
   bool              m_avg_loss_currency_defined;

   double            m_avg_win_pips;
   bool              m_avg_win_pips_defined;
   double            m_avg_loss_pips;
   bool              m_avg_loss_pips_defined;

   double            m_expectancy_currency;
   double            m_expectancy_pips;

   double            m_expectancy_r_multiple;
   bool              m_expectancy_r_multiple_defined;

   double            m_wilson_lower;
   double            m_wilson_upper;

   double            m_quality_score;
   bool              m_quality_score_defined;

   string            m_quality_rating;
   string            m_sample_adequacy;

                     CQualityMetrics(void);
                    ~CQualityMetrics(void);
  };

//+------------------------------------------------------------------+
//| Constructor: nothing defaults to zero as a stand-in for          |
//| "not computed"; every optional figure is paired with a flag      |
//+------------------------------------------------------------------+
CQualityMetrics::CQualityMetrics(void)
  {
   m_trade_count                    = 0;
   m_win_count                      = 0;
   m_loss_count                     = 0;
   m_breakeven_count                = 0;

   m_win_rate                       = 0.0;
   m_loss_rate                      = 0.0;

   m_avg_win_currency               = 0.0;
   m_avg_win_currency_defined       = false;
   m_avg_loss_currency              = 0.0;
   m_avg_loss_currency_defined      = false;

   m_avg_win_pips                   = 0.0;
   m_avg_win_pips_defined           = false;
   m_avg_loss_pips                  = 0.0;
   m_avg_loss_pips_defined          = false;

   m_expectancy_currency            = 0.0;
   m_expectancy_pips                = 0.0;

   m_expectancy_r_multiple          = 0.0;
   m_expectancy_r_multiple_defined  = false;

   m_wilson_lower                   = 0.0;
   m_wilson_upper                   = 0.0;

   m_quality_score                  = 0.0;
   m_quality_score_defined          = false;

   m_quality_rating                 = "N/A";
   m_sample_adequacy                = "N/A";
  }

//+------------------------------------------------------------------+
//| Destructor: no owned resources                                   |
//+------------------------------------------------------------------+
CQualityMetrics::~CQualityMetrics(void)
  {
  }

#endif // TRADEQUALITYTYPES_MQH
//+------------------------------------------------------------------+