//+------------------------------------------------------------------+ //| ChartObjectsGann.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ //| All Gann tools. | //+------------------------------------------------------------------+ #include "ChartObjectsLines.mqh" //+------------------------------------------------------------------+ //| Class CChartObjectGannLine. | //| Purpose: Class of the "Gann Line" object of chart. | //| Derives from class CChartObjectTrendByAngle. | //+------------------------------------------------------------------+ class CChartObjectGannLine : public CChartObjectTrendByAngle { public: CChartObjectGannLine(void); ~CChartObjectGannLine(void); //--- methods of access to properties of the object double PipsPerBar(void) const; bool PipsPerBar(const double ppb) 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 ppb); //--- method of identifying the object virtual int Type(void) const { return(OBJ_GANNLINE); } //--- methods for working with files virtual bool Save(const int file_handle); virtual bool Load(const int file_handle); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CChartObjectGannLine::CChartObjectGannLine(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CChartObjectGannLine::~CChartObjectGannLine(void) { } //+------------------------------------------------------------------+ //| Create object "Gann Line" | //+------------------------------------------------------------------+ bool CChartObjectGannLine::Create(long chart_id,const string name,const int window, const datetime time1,const double price1, const datetime time2,const double ppb) { if(!ObjectCreate(chart_id,name,OBJ_GANNLINE,window,time1,price1,time2,0.0)) return(false); if(!Attach(chart_id,name,window,2)) return(false); if(!PipsPerBar(ppb)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Get value of the "PipsPerBar" property | //+------------------------------------------------------------------+ double CChartObjectGannLine::PipsPerBar(void) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); //--- result return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE)); } //+------------------------------------------------------------------+ //| Set value for the "PipsPerBar" property | //+------------------------------------------------------------------+ bool CChartObjectGannLine::PipsPerBar(const double ppb) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,ppb)); } //+------------------------------------------------------------------+ //| Writing parameters of object to file | //+------------------------------------------------------------------+ bool CChartObjectGannLine::Save(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- write if(!CChartObjectTrend::Save(file_handle)) return(false); //--- write value of the "PipsPerBar" if(FileWriteDouble(file_handle,ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE))!=sizeof(double)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Reading parameters of object from file | //+------------------------------------------------------------------+ bool CChartObjectGannLine::Load(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- read if(!CChartObjectTrend::Load(file_handle)) return(false); //--- read value of the "PipsPerBar" property if(!ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,FileReadDouble(file_handle))) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Class CChartObjectGannFan. | //| Purpose: Class of the "Gann Fan" object of chart. | //| Derives from class CChartObjectTrend. | //+------------------------------------------------------------------+ class CChartObjectGannFan : public CChartObjectTrend { public: CChartObjectGannFan(void); ~CChartObjectGannFan(void); //--- methods of access to properties of the object double PipsPerBar(void) const; bool PipsPerBar(const double ppb) const; bool Downtrend(void) const; bool Downtrend(const bool downtrend) const; //--- method of create the object bool Create(long chart_id,const string name,const int window, const datetime time1,const double price1, const datetime time2,const double ppb); //--- method of identifying the object virtual int Type(void) const { return(OBJ_GANNFAN); } //--- methods for working with files virtual bool Save(const int file_handle); virtual bool Load(const int file_handle); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CChartObjectGannFan::CChartObjectGannFan(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CChartObjectGannFan::~CChartObjectGannFan(void) { } //+------------------------------------------------------------------+ //| Create object "Gann Fan" | //+------------------------------------------------------------------+ bool CChartObjectGannFan::Create(long chart_id,const string name,const int window, const datetime time1,const double price1, const datetime time2,const double ppb) { if(!ObjectCreate(chart_id,name,OBJ_GANNFAN,window,time1,price1,time2,0.0)) return(false); if(!Attach(chart_id,name,window,2)) return(false); if(!PipsPerBar(ppb)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Get value of the "PipsPerBar" property | //+------------------------------------------------------------------+ double CChartObjectGannFan::PipsPerBar(void) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); //--- result return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE)); } //+------------------------------------------------------------------+ //| Set value for the "PipsPerBar" property | //+------------------------------------------------------------------+ bool CChartObjectGannFan::PipsPerBar(const double ppb) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,ppb)); } //+------------------------------------------------------------------+ //| Get value of the "Downtrend" property | //+------------------------------------------------------------------+ bool CChartObjectGannFan::Downtrend(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DIRECTION)); } //+------------------------------------------------------------------+ //| Set value for the "Downtrend" property | //+------------------------------------------------------------------+ bool CChartObjectGannFan::Downtrend(const bool downtrend) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_DIRECTION,downtrend)); } //+------------------------------------------------------------------+ //| Writing parameters of object to file | //+------------------------------------------------------------------+ bool CChartObjectGannFan::Save(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- write if(!CChartObjectTrend::Save(file_handle)) return(false); //--- write value of the "PipsPerBar" property if(FileWriteDouble(file_handle,ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE))!=sizeof(double)) return(false); //--- write value of the "Downtrend" property if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DIRECTION),CHAR_VALUE)!=sizeof(char)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Reading object parameters from file | //+------------------------------------------------------------------+ bool CChartObjectGannFan::Load(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- read if(!CChartObjectTrend::Load(file_handle)) return(false); //--- read value of the "PipsPerBar" property if(!ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,FileReadDouble(file_handle))) return(false); //--- read value of the "Downtrend" property if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_DIRECTION,FileReadInteger(file_handle,CHAR_VALUE))) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Class CChartObjectGannGrid. | //| Purpose: Class of the "Gann Grid" object of chart. | //| Derives from class CChartObjectTrend. | //+------------------------------------------------------------------+ class CChartObjectGannGrid : public CChartObjectTrend { public: CChartObjectGannGrid(void); ~CChartObjectGannGrid(void); //--- methods of access to properties of the object double PipsPerBar(void) const; bool PipsPerBar(const double ppb) const; bool Downtrend(void) const; bool Downtrend(const bool downtrend) 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 ppb); //--- method of identifying the object virtual int Type(void) const { return(OBJ_GANNGRID); } //--- methods for working with files virtual bool Save(const int file_handle); virtual bool Load(const int file_handle); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CChartObjectGannGrid::CChartObjectGannGrid(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CChartObjectGannGrid::~CChartObjectGannGrid(void) { } //+------------------------------------------------------------------+ //| Create object "Gann Grid" | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::Create(long chart_id,const string name,const int window, const datetime time1,const double price1, const datetime time2,const double ppb) { if(!ObjectCreate(chart_id,name,OBJ_GANNGRID,window,time1,price1,time2,0.0)) return(false); if(!Attach(chart_id,name,window,2)) return(false); if(!PipsPerBar(ppb)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Get value of the"PipsPerBar" property | //+------------------------------------------------------------------+ double CChartObjectGannGrid::PipsPerBar(void) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); //--- result return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE)); } //+------------------------------------------------------------------+ //| Set value for the "PipsPerBar" property | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::PipsPerBar(const double ppb) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,ppb)); } //+------------------------------------------------------------------+ //| Get the property value "Downtrend" | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::Downtrend(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DIRECTION)); } //+------------------------------------------------------------------+ //| Set the property value "Downtrend" | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::Downtrend(const bool downtrend) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_DIRECTION,downtrend)); } //+------------------------------------------------------------------+ //| Writing parameters of object to file | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::Save(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- write if(!CChartObjectTrend::Save(file_handle)) return(false); //--- write value of the "PipsPerBar" property if(FileWriteDouble(file_handle,ObjectGetDouble(m_chart_id,m_name,OBJPROP_SCALE))!=sizeof(double)) return(false); //--- write value of the "Downtrend" property if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_DIRECTION),CHAR_VALUE)!=sizeof(char)) return(false); //--- successful return(true); } //+------------------------------------------------------------------+ //| Reading paprameters of object from file | //+------------------------------------------------------------------+ bool CChartObjectGannGrid::Load(const int file_handle) { //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- read if(!CChartObjectTrend::Load(file_handle)) return(false); //--- read value of the "PipsPerBar" property if(!ObjectSetDouble(m_chart_id,m_name,OBJPROP_SCALE,FileReadDouble(file_handle))) return(false); //--- read value of the "Downtrend" property if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_DIRECTION,FileReadInteger(file_handle,CHAR_VALUE))) return(false); //--- successful return(true); } //+------------------------------------------------------------------+