1000 lines
39 KiB
MQL5
1000 lines
39 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ChartObject.mqh |
|
|
//| Copyright 2000-2025, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#include <Object.mqh>
|
|
//+------------------------------------------------------------------+
|
|
//| 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;i++)
|
|
result&=ShiftPoint(i,d_time,d_price);
|
|
//--- result
|
|
return(result);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Relative movement of the specified achor point of object |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObject::ShiftPoint(const int point,const datetime d_time,const double d_price) const
|
|
{
|
|
//--- check
|
|
if(m_chart_id==-1)
|
|
return(false);
|
|
if(point>=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<m_num_points;i++)
|
|
{
|
|
if(FileWriteLong(file_handle,ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIME,i))!=sizeof(long))
|
|
return(false);
|
|
if(FileWriteDouble(file_handle,ObjectGetDouble(m_chart_id,m_name,OBJPROP_PRICE,i))!=sizeof(double))
|
|
return(false);
|
|
}
|
|
//--- write number of levels
|
|
levels=(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELS);
|
|
if(FileWriteInteger(file_handle,levels,INT_VALUE)!=INT_VALUE)
|
|
return(false);
|
|
//--- write levels
|
|
for(i=0;i<levels;i++)
|
|
{
|
|
//--- level color
|
|
if(FileWriteLong(file_handle,ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,i))!=sizeof(long))
|
|
return(false);
|
|
//--- level line style
|
|
if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,i))!=sizeof(int))
|
|
return(false);
|
|
//--- level line width
|
|
if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,i))!=sizeof(int))
|
|
return(false);
|
|
//--- level value
|
|
if(FileWriteDouble(file_handle,ObjectGetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,i))!=sizeof(double))
|
|
return(false);
|
|
//--- level name
|
|
str=ObjectGetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,i);
|
|
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);
|
|
}
|
|
//--- successful
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Reading object parameters from file |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObject::Load(const int file_handle)
|
|
{
|
|
int i,len,num;
|
|
string str;
|
|
//--- check
|
|
if(file_handle==INVALID_HANDLE || m_chart_id==-1)
|
|
return(false);
|
|
//--- read and check start marker - 0xFFFFFFFFFFFFFFFF
|
|
if(FileReadLong(file_handle)!=-1)
|
|
return(false);
|
|
//--- read and check object type
|
|
if(FileReadInteger(file_handle,INT_VALUE)!=Type())
|
|
return(false);
|
|
//--- read object name
|
|
len=FileReadInteger(file_handle,INT_VALUE);
|
|
str=(len!=0) ? FileReadString(file_handle,len) : "";
|
|
if(!ObjectSetString(m_chart_id,m_name,OBJPROP_NAME,str))
|
|
return(false);
|
|
//--- read object color
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_COLOR,FileReadLong(file_handle)))
|
|
return(false);
|
|
//--- read object line style
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_STYLE,FileReadInteger(file_handle)))
|
|
return(false);
|
|
//--- read object line style
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_WIDTH,FileReadInteger(file_handle)))
|
|
return(false);
|
|
//--- read the property value "Background"
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_BACK,FileReadInteger(file_handle,CHAR_VALUE)))
|
|
return(false);
|
|
//--- read the property value "Selectable"
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE,FileReadInteger(file_handle,CHAR_VALUE)))
|
|
return(false);
|
|
//--- read the property value "Timeframes"
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES,FileReadInteger(file_handle,INT_VALUE)))
|
|
return(false);
|
|
//--- read comment
|
|
len=FileReadInteger(file_handle,INT_VALUE);
|
|
str=(len!=0) ? FileReadString(file_handle,len) : "";
|
|
if(!ObjectSetString(m_chart_id,m_name,OBJPROP_TEXT,str))
|
|
return(false);
|
|
//--- read number of point
|
|
num=FileReadInteger(file_handle,INT_VALUE);
|
|
//--- read points
|
|
if(num!=0)
|
|
{
|
|
for(i=0;i<num;i++)
|
|
{
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIME,i,FileReadLong(file_handle)))
|
|
return(false);
|
|
if(!ObjectSetDouble(m_chart_id,m_name,OBJPROP_PRICE,i,FileReadDouble(file_handle)))
|
|
return(false);
|
|
}
|
|
}
|
|
//--- read number of levels
|
|
num=FileReadInteger(file_handle,INT_VALUE);
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELS,0,num))
|
|
return(false);
|
|
//--- read levels
|
|
if(num!=0)
|
|
{
|
|
for(i=0;i<num;i++)
|
|
{
|
|
//--- level color
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,i,FileReadLong(file_handle)))
|
|
return(false);
|
|
//--- levelline style
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,i,FileReadInteger(file_handle)))
|
|
return(false);
|
|
//--- level line width
|
|
if(!ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,i,FileReadInteger(file_handle)))
|
|
return(false);
|
|
//--- level value
|
|
if(!ObjectSetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,i,FileReadDouble(file_handle)))
|
|
return(false);
|
|
//--- level name
|
|
len=FileReadInteger(file_handle,INT_VALUE);
|
|
str=(len!=0) ? FileReadString(file_handle,len) : "";
|
|
if(!ObjectSetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,i,str))
|
|
return(false);
|
|
}
|
|
}
|
|
//--- successful
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|