//+------------------------------------------------------------------+
//|                                                 LadderLevel.mqh  |
//+------------------------------------------------------------------+
#ifndef LADDERLEVEL_MQH
#define LADDERLEVEL_MQH

//+------------------------------------------------------------------+
//| CLadderLevel                                                     |
//| Holds one rung of a profit ladder used by CPartialCloseEngine.   |
//| A ladder level is defined purely in R-multiples so it applies    |
//| to any instrument and any stop distance without modification.    |
//+------------------------------------------------------------------+
class CLadderLevel
  {
private:
   double            m_r_multiple;
   double            m_close_pct;
   bool              m_move_to_breakeven;
   bool              m_hit;

public:
                     CLadderLevel(void);
                     CLadderLevel(const double r_multiple,
                                  const double close_pct,
                                  const bool move_to_breakeven);
                    ~CLadderLevel(void);

   double            RMultiple(void) const { return(m_r_multiple); }
   double            ClosePct(void) const { return(m_close_pct); }
   bool              MoveToBreakeven(void) const { return(m_move_to_breakeven); }
   bool              Hit(void) const { return(m_hit); }
   void              SetHit(const bool hit) { m_hit = hit; }
  };

//+------------------------------------------------------------------+
//| Default constructor                                              |
//+------------------------------------------------------------------+
CLadderLevel::CLadderLevel(void)
  {
   m_r_multiple        = 0.0;
   m_close_pct         = 0.0;
   m_move_to_breakeven = false;
   m_hit               = false;
  }

//+------------------------------------------------------------------+
//| Parameterized constructor                                        |
//| r_multiple    - trigger point expressed as a multiple of R       |
//| close_pct     - percentage of the ORIGINAL entry volume to close |
//| move_to_breakeven - whether hitting this level moves the SL      |
//+------------------------------------------------------------------+
CLadderLevel::CLadderLevel(const double r_multiple,
                            const double close_pct,
                            const bool move_to_breakeven)
  {
   m_r_multiple        = r_multiple;
   m_close_pct         = close_pct;
   m_move_to_breakeven = move_to_breakeven;
   m_hit               = false;
  }

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CLadderLevel::~CLadderLevel(void)
  {
  }

#endif // LADDERLEVEL_MQH
//+------------------------------------------------------------------+