//+------------------------------------------------------------------+
//|                                          ChartObjectsElliott.mqh |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//| All Elliott tools.                                               |
//+------------------------------------------------------------------+
#include "ChartObject.mqh"
//+------------------------------------------------------------------+
//| Class CChartObjectElliottWave3.                                  |
//| Purpose: Class of the "ElliottCorrectiveWave" object of chart.   |
//|          Derives from class CChartObject.                        |
//+------------------------------------------------------------------+
class CChartObjectElliottWave3 : public CChartObject
  {
public:
                     CChartObjectElliottWave3(void);
                    ~CChartObjectElliottWave3(void);
   //--- methods of access to properties of the object
   ENUM_ELLIOT_WAVE_DEGREE Degree(void) const;
   bool              Degree(const ENUM_ELLIOT_WAVE_DEGREE degree) const;
   bool              Lines(void) const;
   bool              Lines(const bool lines) const;
   //--- method of creating the object
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);
   //--- method of identifying the object
   virtual int       Type(void) const { return(OBJ_ELLIOTWAVE3); }
   //--- methods for working with files
   virtual bool      Save(const int file_handle);
   virtual bool      Load(const int file_handle);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CChartObjectElliottWave3::CChartObjectElliottWave3(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChartObjectElliottWave3::~CChartObjectElliottWave3(void)
  {
  }
//+------------------------------------------------------------------+
//| Create object "ElliottCorrectiveWave"                            |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Create(long chart_id,const string name,const int window,
                                      const datetime time1,const double price1,
                                      const datetime time2,const double price2,
                                      const datetime time3,const double price3)
  {
   if(!ObjectCreate(chart_id,name,OBJ_ELLIOTWAVE3,window,time1,price1,time2,price2,time3,price3))
      return(false);
   if(!Attach(chart_id,name,window,3))
      return(false);
//--- successful
   return(true);
  }
//+------------------------------------------------------------------+
//| Get value of the "Degree" property                               |
//+------------------------------------------------------------------+
ENUM_ELLIOT_WAVE_DEGREE CChartObjectElliottWave3::Degree(void) const
  {
//--- check
   if(m_chart_id==-1)
      return(WRONG_VALUE);
//--- result
   return((ENUM_ELLIOT_WAVE_DEGREE)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DEGREE));
  }
//+------------------------------------------------------------------+
//| Set value for the "Degree" property                              |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Degree(const ENUM_ELLIOT_WAVE_DEGREE degree) const
  {
//--- check
   if(m_chart_id==-1)
      return(false);
//--- result
   return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_DEGREE,degree));
  }
//+------------------------------------------------------------------+
//| Get value of the "Lines" property                                |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Lines(void) const
  {
//--- check
   if(m_chart_id==-1)
      return(false);
//--- result
   return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DRAWLINES));
  }
//+------------------------------------------------------------------+
//| Set value for the "Lines" property                               |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Lines(const bool lines) const
  {
//--- check
   if(m_chart_id==-1)
      return(false);
//--- result
   return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_DRAWLINES,lines));
  }
//+------------------------------------------------------------------+
//| Writing parameters of object to file                             |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Save(const int file_handle)
  {
   bool result;
//--- check
   if(file_handle==INVALID_HANDLE || m_chart_id==-1)
      return(false);
//--- write
   result=CChartObject::Save(file_handle);
   if(result)
     {
      //--- write value of the "Degree" property
      if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DEGREE),INT_VALUE)!=sizeof(int))
         return(false);
      //--- write value of the "Lines" property
      if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DRAWLINES),INT_VALUE)!=sizeof(int))
         return(false);
     }
//--- result
   return(result);
  }
//+------------------------------------------------------------------+
//| Reading parameters of object from file                           |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave3::Load(const int file_handle)
  {
   bool result;
//--- check
   if(file_handle==INVALID_HANDLE || m_chart_id==-1)
      return(false);
//--- read
   result=CChartObject::Load(file_handle);
   if(result)
     {
      //--- read value of the "Degree" property
      if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_DEGREE,FileReadInteger(file_handle,INT_VALUE)))
         return(false);
      //--- read value of the "Lines" property
      if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_DRAWLINES,FileReadInteger(file_handle,INT_VALUE)))
         return(false);
     }
//--- result
   return(result);
  }
//+------------------------------------------------------------------+
//| Class CChartObjectElliottWave5.                                  |
//| Purpose: Class of the "ElliottMotiveWave" object of chart.       |
//|          Derives from class CChartObjectElliottWave3.            |
//+------------------------------------------------------------------+
class CChartObjectElliottWave5 : public CChartObjectElliottWave3
  {
public:
                     CChartObjectElliottWave5(void);
                    ~CChartObjectElliottWave5(void);
   //--- method of creating the object
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3,
                            const datetime time4,const double price4,
                            const datetime time5,const double price5);
   //--- method of identifying the object
   virtual int       Type(void) const { return(OBJ_ELLIOTWAVE5); }
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CChartObjectElliottWave5::CChartObjectElliottWave5(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChartObjectElliottWave5::~CChartObjectElliottWave5(void)
  {
  }
//+------------------------------------------------------------------+
//| Create object "ElliottMotiveWave"                                |
//+------------------------------------------------------------------+
bool CChartObjectElliottWave5::Create(long chart_id,const string name,const int window,
                                      const datetime time1,const double price1,
                                      const datetime time2,const double price2,
                                      const datetime time3,const double price3,
                                      const datetime time4,const double price4,
                                      const datetime time5,const double price5)
  {
   if(!ObjectCreate(chart_id,name,OBJ_ELLIOTWAVE5,window,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5))
      return(false);
   if(!Attach(chart_id,name,window,5))
      return(false);
//--- successful
   return(true);
  }
//+------------------------------------------------------------------+
