//+------------------------------------------------------------------+ //| ChartObject.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| Class CChartObject. | //| Pupose: Base class of chart objects. | //| Derives from class CObject. | //+------------------------------------------------------------------+ class CChartObject : public CObject { protected: long m_chart_id; // identifier of chart the object belongs to int m_window; // number of subwindow (0 - main window) string m_name; // unique name object name int m_num_points; // number of anchor points of object public: CChartObject(void); ~CChartObject(void); //--- method of identifying the object virtual int Type(void) const { return(0x8888); } //--- methods of access to protected data long ChartId(void) const { return(m_chart_id); } int Window(void) const { return(m_window); } string Name(void) const { return(m_name); } bool Name(const string name); int NumPoints(void) const { return(m_num_points); } //--- methods of filling the object bool Attach(long chart_id,const string name,const int window,const int points); bool SetPoint(const int point,const datetime time,const double price) const; //--- methods of deleting bool Delete(void); void Detach(void); //--- methods of access to properties of the object datetime Time(const int point) const; bool Time(const int point,const datetime time) const; double Price(const int point) const; bool Price(const int point,const double price) const; color Color(void) const; bool Color(const color new_color) const; ENUM_LINE_STYLE Style(void) const; bool Style(const ENUM_LINE_STYLE new_style) const; int Width(void) const; bool Width(const int new_width) const; bool Background(void) const; bool Background(const bool new_back) const; bool Fill(void) const; bool Fill(const bool new_fill) const; long Z_Order(void) const; bool Z_Order(const long value) const; bool Selected(void) const; bool Selected(const bool new_sel) const; bool Selectable(void) const; bool Selectable(const bool new_sel) const; string Description(void) const; bool Description(const string new_text) const; string Tooltip(void) const; bool Tooltip(const string new_text) const; int Timeframes(void) const; virtual bool Timeframes(const int timeframes) const; datetime CreateTime(void) const; int LevelsCount(void) const; bool LevelsCount(const int new_count) const; //--- methods to access the properties of levels of objects color LevelColor(const int level) const; bool LevelColor(const int level,const color new_color) const; ENUM_LINE_STYLE LevelStyle(const int level) const; bool LevelStyle(const int level,const ENUM_LINE_STYLE new_style) const; int LevelWidth(const int level) const; bool LevelWidth(const int level,const int new_width) const; double LevelValue(const int level) const; bool LevelValue(const int level,const double new_value) const; string LevelDescription(const int level) const; bool LevelDescription(const int level,const string new_text) const; //--- access methods to the API functions of MQL5 long GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier=-1) const; bool GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,long &value) const; bool SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,const long value) const; bool SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const long value) const; double GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier=-1) const; bool GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,double &value) const; bool SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,const double value) const; bool SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const double value) const; string GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier=-1) const; bool GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,string &value) const; bool SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,const string value) const; bool SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const string value) const; //--- methods of moving bool ShiftObject(const datetime d_time,const double d_price) const; bool ShiftPoint(const int point,const datetime d_time,const double d_price) const; //--- methods for working with files virtual bool Save(const int file_handle); virtual bool Load(const int file_handle); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CChartObject::CChartObject(void) { //--- initialize protected data Detach(); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CChartObject::~CChartObject(void) { if(m_chart_id!=-1) ObjectDelete(m_chart_id,m_name); } //+------------------------------------------------------------------+ //| Changing name of the object | //+------------------------------------------------------------------+ bool CChartObject::Name(const string name) { //--- check if(m_chart_id==-1) return(false); //--- change if(ObjectSetString(m_chart_id,m_name,OBJPROP_NAME,name)) { m_name=name; return(true); } //--- failure return(false); }; //+------------------------------------------------------------------+ //| Attach object | //+------------------------------------------------------------------+ bool CChartObject::Attach(long chart_id,const string name,const int window,const int points) { //--- check if(ObjectFind(chart_id,name)<0) return(false); //--- attach if(chart_id==0) chart_id=ChartID(); m_chart_id =chart_id; m_window =window; m_name =name; m_num_points=points; //--- successful return(true); } //+------------------------------------------------------------------+ //| Setting new coordinates of anchor point of an object | //+------------------------------------------------------------------+ bool CChartObject::SetPoint(const int point,const datetime time,const double price) const { //--- check if(m_chart_id==-1) return(false); if(point>=m_num_points) return(false); //--- result return(ObjectMove(m_chart_id,m_name,point,time,price)); } //+------------------------------------------------------------------+ //| Delete an object | //+------------------------------------------------------------------+ bool CChartObject::Delete(void) { //--- checki if(m_chart_id==-1) return(false); //--- actions bool result=ObjectDelete(m_chart_id,m_name); Detach(); //--- result return(result); } //+------------------------------------------------------------------+ //| Detach object | //+------------------------------------------------------------------+ void CChartObject::Detach(void) { m_chart_id =-1; m_window =-1; m_name =NULL; m_num_points=0; } //+------------------------------------------------------------------+ //| Get the time coordinate of the specified anchor point of object | //+------------------------------------------------------------------+ datetime CChartObject::Time(const int point) const { //--- check if(m_chart_id==-1) return(0); if(point>=m_num_points) return(0); //--- result return((datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIME,point)); } //+------------------------------------------------------------------+ //| Set the time coordinate of the specified anchor point of object | //+------------------------------------------------------------------+ bool CChartObject::Time(const int point,const datetime time) const { //--- check if(m_chart_id==-1) return(false); if(point>=m_num_points) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIME,point,time)); } //+------------------------------------------------------------------+ //| Get the price coordinate of the specified anchor point of object.| //+------------------------------------------------------------------+ double CChartObject::Price(const int point) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); if(point>=m_num_points) return(EMPTY_VALUE); //--- result return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_PRICE,point)); } //+------------------------------------------------------------------+ //| Set the price coordinate of the specified anchor point of object.| //+------------------------------------------------------------------+ bool CChartObject::Price(const int point,const double price) const { //--- check if(m_chart_id==-1) return(false); if(point>=m_num_points) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_PRICE,point,price)); } //+------------------------------------------------------------------+ //| Get object color | //+------------------------------------------------------------------+ color CChartObject::Color(void) const { //--- check if(m_chart_id==-1) return(clrNONE); //--- result return((color)ObjectGetInteger(m_chart_id,m_name,OBJPROP_COLOR)); } //+------------------------------------------------------------------+ //| Set object color | //+------------------------------------------------------------------+ bool CChartObject::Color(const color new_color) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_COLOR,new_color)); } //+------------------------------------------------------------------+ //| Get style of line of object | //+------------------------------------------------------------------+ ENUM_LINE_STYLE CChartObject::Style(void) const { //--- check if(m_chart_id==-1) return(WRONG_VALUE); //--- result return((ENUM_LINE_STYLE)ObjectGetInteger(m_chart_id,m_name,OBJPROP_STYLE)); } //+------------------------------------------------------------------+ //| Set style of line of object | //+------------------------------------------------------------------+ bool CChartObject::Style(const ENUM_LINE_STYLE new_style) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_STYLE,new_style)); } //+------------------------------------------------------------------+ //| Get width of line of object | //+------------------------------------------------------------------+ int CChartObject::Width(void) const { //--- check if(m_chart_id==-1) return(-1); //--- result return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_WIDTH)); } //+------------------------------------------------------------------+ //| Set width of line of object | //+------------------------------------------------------------------+ bool CChartObject::Width(const int new_width) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_WIDTH,new_width)); } //+------------------------------------------------------------------+ //| Get the "Draw object as background" flag | //+------------------------------------------------------------------+ bool CChartObject::Background(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_BACK)); } //+------------------------------------------------------------------+ //| Set the "Draw object as background" flag | //+------------------------------------------------------------------+ bool CChartObject::Background(const bool new_back) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_BACK,new_back)); } //+------------------------------------------------------------------+ //| Get the "Filling" flag | //+------------------------------------------------------------------+ bool CChartObject::Fill(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_FILL)); } //+------------------------------------------------------------------+ //| Set the "Filling" flag | //+------------------------------------------------------------------+ bool CChartObject::Fill(const bool new_fill) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_FILL,new_fill)); } //+------------------------------------------------------------------+ //| Get the "Z-order" property | //+------------------------------------------------------------------+ long CChartObject::Z_Order(void) const { //--- check if(m_chart_id==-1) return(0); //--- result return(ObjectGetInteger(m_chart_id,m_name,OBJPROP_ZORDER)); } //+------------------------------------------------------------------+ //| Set the "Z-order" property | //+------------------------------------------------------------------+ bool CChartObject::Z_Order(const long value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_ZORDER,value)); } //+------------------------------------------------------------------+ //| Get the "selected" flag | //+------------------------------------------------------------------+ bool CChartObject::Selected(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTED)); } //+------------------------------------------------------------------+ //| Set the "selected" flag | //+------------------------------------------------------------------+ bool CChartObject::Selected(const bool new_sel) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_SELECTED,new_sel)); } //+------------------------------------------------------------------+ //| Get the "selectable" flag | //+------------------------------------------------------------------+ bool CChartObject::Selectable(void) const { //--- check if(m_chart_id==-1) return(false); //--- result return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE)); } //+------------------------------------------------------------------+ //| Set flag the "selectable" flag | //+------------------------------------------------------------------+ bool CChartObject::Selectable(const bool new_sel) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE,new_sel)); } //+------------------------------------------------------------------+ //| Get comment of object | //+------------------------------------------------------------------+ string CChartObject::Description(void) const { //--- check if(m_chart_id==-1) return(""); //--- result return(ObjectGetString(m_chart_id,m_name,OBJPROP_TEXT)); } //+------------------------------------------------------------------+ //| Set comment of object | //+------------------------------------------------------------------+ bool CChartObject::Description(const string new_text) const { //--- check if(m_chart_id==-1) return(false); //--- tune if(new_text=="") return(ObjectSetString(m_chart_id,m_name,OBJPROP_TEXT," ")); //--- result return(ObjectSetString(m_chart_id,m_name,OBJPROP_TEXT,new_text)); } //+------------------------------------------------------------------+ //| Get tooltip of object | //+------------------------------------------------------------------+ string CChartObject::Tooltip(void) const { //--- check if(m_chart_id==-1) return(""); //--- result return(ObjectGetString(m_chart_id,m_name,OBJPROP_TOOLTIP)); } //+------------------------------------------------------------------+ //| Set tooltip of object | //+------------------------------------------------------------------+ bool CChartObject::Tooltip(const string new_text) const { //--- check if(m_chart_id==-1) return(false); //--- tune if(new_text=="") return(ObjectSetString(m_chart_id,m_name,OBJPROP_TOOLTIP," ")); //--- result return(ObjectSetString(m_chart_id,m_name,OBJPROP_TOOLTIP,new_text)); } //+------------------------------------------------------------------+ //| Get the "Timeframes" (visibility) flag | //+------------------------------------------------------------------+ int CChartObject::Timeframes(void) const { //--- check if(m_chart_id==-1) return(0); //--- result return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES)); } //+------------------------------------------------------------------+ //| Set the "Timeframes" (visibility) flag | //+------------------------------------------------------------------+ bool CChartObject::Timeframes(const int timeframes) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES,timeframes)); } //+------------------------------------------------------------------+ //| Get time of object creation | //+------------------------------------------------------------------+ datetime CChartObject::CreateTime(void) const { //--- check if(m_chart_id==-1) return(0); //--- result return((datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_CREATETIME)); } //+------------------------------------------------------------------+ //| Get number of levels of object | //+------------------------------------------------------------------+ int CChartObject::LevelsCount(void) const { //--- check if(m_chart_id==-1) return(0); //--- result return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELS)); } //+------------------------------------------------------------------+ //| Set number of levels of object | //+------------------------------------------------------------------+ bool CChartObject::LevelsCount(const int new_count) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELS,new_count)); } //+------------------------------------------------------------------+ //| Get color of the specified level of object | //+------------------------------------------------------------------+ color CChartObject::LevelColor(const int level) const { //--- check if(m_chart_id==-1) return(clrNONE); if(level>=LevelsCount()) return(clrNONE); //--- result return((color)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,level)); } //+------------------------------------------------------------------+ //| Set color of the specified level of object | //+------------------------------------------------------------------+ bool CChartObject::LevelColor(const int level,const color new_color) const { //--- check if(m_chart_id==-1) return(false); if(level>=LevelsCount()) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,level,new_color)); } //+------------------------------------------------------------------+ //| Get line style of the specified level of object | //+------------------------------------------------------------------+ ENUM_LINE_STYLE CChartObject::LevelStyle(const int level) const { //--- check if(m_chart_id==-1) return(WRONG_VALUE); if(level>=LevelsCount()) return(WRONG_VALUE); //--- result return((ENUM_LINE_STYLE)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,level)); } //+------------------------------------------------------------------+ //| Set line style of the specified level of object | //+------------------------------------------------------------------+ bool CChartObject::LevelStyle(const int level,const ENUM_LINE_STYLE new_style) const { //--- check if(m_chart_id==-1) return(false); if(level>=LevelsCount()) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,level,new_style)); } //+------------------------------------------------------------------+ //| Get line width of the specified level of object | //+------------------------------------------------------------------+ int CChartObject::LevelWidth(const int level) const { //--- check if(m_chart_id==-1) return(-1); if(level>=LevelsCount()) return(-1); //--- result return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,level)); } //+------------------------------------------------------------------+ //| Set line width of the specified level of object | //+------------------------------------------------------------------+ bool CChartObject::LevelWidth(const int level,const int new_width) const { //--- check if(m_chart_id==-1) return(false); if(level>=LevelsCount()) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,level,new_width)); } //+------------------------------------------------------------------+ //| Get value of the specified level of object | //+------------------------------------------------------------------+ double CChartObject::LevelValue(const int level) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); if(level>=LevelsCount()) return(EMPTY_VALUE); //--- result return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,level)); } //+------------------------------------------------------------------+ //| Set value of the specified level of object | //+------------------------------------------------------------------+ bool CChartObject::LevelValue(const int level,const double new_value) const { //--- check if(m_chart_id==-1) return(false); if(level>=LevelsCount()) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,level,new_value)); } //+------------------------------------------------------------------+ //| Get comment of of the specified level of object | //+------------------------------------------------------------------+ string CChartObject::LevelDescription(const int level) const { //--- check if(m_chart_id==-1) return(""); if(level>=LevelsCount()) return(""); //--- result return(ObjectGetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,level)); } //+------------------------------------------------------------------+ //| Set comment to the specified level of object | //+------------------------------------------------------------------+ bool CChartObject::LevelDescription(const int level,const string new_text) const { //--- checking if(m_chart_id==-1) return(false); if(level>=LevelsCount()) return(false); //--- result return(ObjectSetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,level,new_text)); } //+------------------------------------------------------------------+ //| Access function long ObjectGetInteger(...) | //+------------------------------------------------------------------+ long CChartObject::GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier) const { //--- check if(m_chart_id==-1) return(0); //--- if(modifier==-1) return(ObjectGetInteger(m_chart_id,m_name,prop_id)); //--- result return(ObjectGetInteger(m_chart_id,m_name,prop_id,modifier)); } //+------------------------------------------------------------------+ //| Access function bool ObjectGetInteger(...) | //+------------------------------------------------------------------+ bool CChartObject::GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,long &value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectGetInteger(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetInteger(.,modifier,.) | //+------------------------------------------------------------------+ bool CChartObject::SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,const long value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetInteger(...) | //+------------------------------------------------------------------+ bool CChartObject::SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const long value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetInteger(m_chart_id,m_name,prop_id,value)); } //+------------------------------------------------------------------+ //| Access function double ObjectGetDouble(...) | //+------------------------------------------------------------------+ double CChartObject::GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier) const { //--- check if(m_chart_id==-1) return(EMPTY_VALUE); //--- if(modifier==-1) return(ObjectGetDouble(m_chart_id,m_name,prop_id)); //--- result return(ObjectGetDouble(m_chart_id,m_name,prop_id,modifier)); } //+------------------------------------------------------------------+ //| Access function bool ObjectGetDouble(...) | //+------------------------------------------------------------------+ bool CChartObject::GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,double &value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectGetDouble(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetDouble(.,modifier,.) | //+------------------------------------------------------------------+ bool CChartObject::SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,const double value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetDouble(...) | //+------------------------------------------------------------------+ bool CChartObject::SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const double value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetDouble(m_chart_id,m_name,prop_id,value)); } //+------------------------------------------------------------------+ //| Access function string ObjectGetString (...) | //+------------------------------------------------------------------+ string CChartObject::GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier) const { //--- check if(m_chart_id==-1) return(""); //--- if(modifier==-1) return(ObjectGetString(m_chart_id,m_name,prop_id)); //--- result return(ObjectGetString(m_chart_id,m_name,prop_id,modifier)); } //+------------------------------------------------------------------+ //| Access function bool ObjectGetString(...) | //+------------------------------------------------------------------+ bool CChartObject::GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,string &value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectGetString(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetString(.,modifier,.) | //+------------------------------------------------------------------+ bool CChartObject::SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,const string value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetString(m_chart_id,m_name,prop_id,modifier,value)); } //+------------------------------------------------------------------+ //| Access function ObjectSetString(...) | //+------------------------------------------------------------------+ bool CChartObject::SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const string value) const { //--- check if(m_chart_id==-1) return(false); //--- result return(ObjectSetString(m_chart_id,m_name,prop_id,value)); } //+------------------------------------------------------------------+ //| Relative movement of object | //+------------------------------------------------------------------+ bool CChartObject::ShiftObject(const datetime d_time,const double d_price) const { bool result=true; int i; //--- check if(m_chart_id==-1) return(false); //--- move for(i=0;i=m_num_points) return(false); //--- move datetime time=(datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIME,point); double price=ObjectGetDouble(m_chart_id,m_name,OBJPROP_PRICE,point); //--- result return(ObjectMove(m_chart_id,m_name,point,time+d_time,price+d_price)); } //+------------------------------------------------------------------+ //| Writing object parameters to file | //+------------------------------------------------------------------+ bool CChartObject::Save(const int file_handle) { int i,len; int levels; string str; //--- check if(file_handle==INVALID_HANDLE || m_chart_id==-1) return(false); //--- write start marker - 0xFFFFFFFFFFFFFFFF if(FileWriteLong(file_handle,-1)!=sizeof(long)) return(false); //--- write object type if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) return(false); //--- write object name str=ObjectGetString(m_chart_id,m_name,OBJPROP_NAME); len=StringLen(str); if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) return(false); if(len!=0) if(FileWriteString(file_handle,str,len)!=len) return(false); //--- write object color if(FileWriteLong(file_handle,ObjectGetInteger(m_chart_id,m_name,OBJPROP_COLOR))!=sizeof(long)) return(false); //--- write object line style if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_STYLE))!=sizeof(int)) return(false); //--- write object line width if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_WIDTH))!=sizeof(int)) return(false); //--- write the property value "Background" if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_BACK),CHAR_VALUE)!=sizeof(char)) return(false); //--- write the property value "Selectable" if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE),CHAR_VALUE)!=sizeof(char)) return(false); //--- write the property value "Timeframes" if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES),INT_VALUE)!=sizeof(int)) return(false); //--- write comment str=ObjectGetString(m_chart_id,m_name,OBJPROP_TEXT); len=StringLen(str); if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) return(false); if(len!=0) if(FileWriteString(file_handle,str,len)!=len) return(false); //--- write number of points if(FileWriteInteger(file_handle,m_num_points,INT_VALUE)!=INT_VALUE) return(false); //--- write points for(i=0;i