225 lines
7.8 KiB
MQL5
225 lines
7.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Custom.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "Indicator.mqh"
| |||
//+------------------------------------------------------------------+
| |||
//| Class CiCustom. |
| |||
//| Purpose: Class of custom indicators. |
| |||
//| Derives from class CIndicator. |
| |||
//+------------------------------------------------------------------+
| |||
class CiCustom : public CIndicator
| |||
{
| |||
protected:
| |||
int m_num_params; // number of creation parameters
| |||
MqlParam m_params[]; // creation parameters
| |||
| |||
public:
| |||
CiCustom(void);
| |||
~CiCustom(void);
| |||
//--- methods of access to protected data
| |||
bool NumBuffers(const int buffers);
| |||
int NumParams(void) const { return(m_num_params); }
| |||
ENUM_DATATYPE ParamType(const int ind) const;
| |||
long ParamLong(const int ind) const;
| |||
double ParamDouble(const int ind) const;
| |||
string ParamString(const int ind) const;
| |||
//--- method of identifying
| |||
virtual int Type(void) const { return(IND_CUSTOM); }
| |||
| |||
protected:
| |||
//--- methods of tuning
| |||
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CiCustom::CiCustom(void) : m_num_params(0)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CiCustom::~CiCustom(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set number of buffers of indicator |
| |||
//+------------------------------------------------------------------+
| |||
bool CiCustom::NumBuffers(const int buffers)
| |||
{
| |||
bool result=true;
| |||
//---
| |||
if(m_buffers_total==0)
| |||
{
| |||
m_buffers_total=buffers;
| |||
return(true);
| |||
}
| |||
if(m_buffers_total!=buffers)
| |||
{
| |||
Shutdown();
| |||
result=CreateBuffers(m_symbol,m_period,buffers);
| |||
if(result)
| |||
{
| |||
//--- create buffers
| |||
for(int i=0;i<m_buffers_total;i++)
| |||
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
| |||
}
| |||
}
| |||
//---
| |||
return(result);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get type of specified parameter of creation |
| |||
//+------------------------------------------------------------------+
| |||
ENUM_DATATYPE CiCustom::ParamType(const int ind) const
| |||
{
| |||
if(ind>=m_num_params)
| |||
return(WRONG_VALUE);
| |||
//---
| |||
return(m_params[ind].type);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get specified parameter of creatiob as a long value |
| |||
//+------------------------------------------------------------------+
| |||
long CiCustom::ParamLong(const int ind) const
| |||
{
| |||
if(ind<m_num_params)
| |||
{
| |||
switch(m_params[ind].type)
| |||
{
| |||
case TYPE_BOOL:
| |||
case TYPE_CHAR:
| |||
case TYPE_UCHAR:
| |||
case TYPE_SHORT:
| |||
case TYPE_USHORT:
| |||
case TYPE_INT:
| |||
case TYPE_UINT:
| |||
case TYPE_COLOR:
| |||
case TYPE_LONG:
| |||
case TYPE_ULONG:
| |||
case TYPE_DATETIME:
| |||
return(m_params[ind].integer_value);
| |||
case TYPE_STRING:
| |||
case TYPE_DOUBLE:
| |||
case TYPE_FLOAT:
| |||
case TYPE_VECTOR:
| |||
case TYPE_VECTORF:
| |||
case TYPE_VECTORC:
| |||
case TYPE_VECTORCF:
| |||
case TYPE_MATRIX:
| |||
case TYPE_MATRIXF:
| |||
case TYPE_MATRIXC:
| |||
case TYPE_MATRIXCF:
| |||
break;
| |||
}
| |||
}
| |||
//---
| |||
return(0);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get specified parameter of creation as a double value |
| |||
//+------------------------------------------------------------------+
| |||
double CiCustom::ParamDouble(const int ind) const
| |||
{
| |||
if(ind>=m_num_params)
| |||
return(EMPTY_VALUE);
| |||
switch(m_params[ind].type)
| |||
{
| |||
case TYPE_DOUBLE:
| |||
case TYPE_FLOAT:
| |||
break;
| |||
default:
| |||
return(EMPTY_VALUE);
| |||
}
| |||
//---
| |||
return(m_params[ind].double_value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get specified parameter of creation as a string value |
| |||
//+------------------------------------------------------------------+
| |||
string CiCustom::ParamString(const int ind) const
| |||
{
| |||
if(ind>=m_num_params || m_params[ind].type!=TYPE_STRING)
| |||
return("");
| |||
//---
| |||
return(m_params[ind].string_value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with universal parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiCustom::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
| |||
{
| |||
int i;
| |||
//--- tune
| |||
if(m_buffers_total==0)
| |||
m_buffers_total=256;
| |||
if(CreateBuffers(symbol,period,m_buffers_total))
| |||
{
| |||
//--- string of status of drawing
| |||
m_name ="Custom "+params[0].string_value;
| |||
m_status="("+symbol+","+PeriodDescription();
| |||
for(i=1;i<num_params;i++)
| |||
{
| |||
switch(params[i].type)
| |||
{
| |||
case TYPE_BOOL:
| |||
m_status=m_status+","+((params[i].integer_value)?"true":"false");
| |||
break;
| |||
case TYPE_CHAR:
| |||
case TYPE_UCHAR:
| |||
case TYPE_SHORT:
| |||
case TYPE_USHORT:
| |||
case TYPE_INT:
| |||
case TYPE_UINT:
| |||
case TYPE_LONG:
| |||
case TYPE_ULONG:
| |||
m_status=m_status+","+IntegerToString(params[i].integer_value);
| |||
break;
| |||
case TYPE_COLOR:
| |||
m_status=m_status+","+ColorToString((color)params[i].integer_value);
| |||
break;
| |||
case TYPE_DATETIME:
| |||
m_status=m_status+","+TimeToString(params[i].integer_value);
| |||
break;
| |||
case TYPE_FLOAT:
| |||
case TYPE_DOUBLE:
| |||
m_status=m_status+","+DoubleToString(params[i].double_value);
| |||
break;
| |||
case TYPE_STRING:
| |||
m_status=m_status+",'"+params[i].string_value+"'";
| |||
break;
| |||
case TYPE_VECTOR:
| |||
case TYPE_VECTORF:
| |||
case TYPE_VECTORC:
| |||
case TYPE_VECTORCF:
| |||
case TYPE_MATRIX:
| |||
case TYPE_MATRIXF:
| |||
case TYPE_MATRIXC:
| |||
case TYPE_MATRIXCF:
| |||
m_status=m_status+",<NA>";
| |||
break;
| |||
}
| |||
}
| |||
m_status=m_status+") H="+IntegerToString(m_handle);
| |||
//--- save settings
| |||
ArrayResize(m_params,num_params);
| |||
for(i=0;i<num_params;i++)
| |||
{
| |||
m_params[i].type =params[i].type;
| |||
m_params[i].integer_value=params[i].integer_value;
| |||
m_params[i].double_value =params[i].double_value;
| |||
m_params[i].string_value =params[i].string_value;
| |||
}
| |||
m_num_params=num_params;
| |||
//--- create buffers
| |||
for(i=0;i<m_buffers_total;i++)
| |||
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//--- error
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
|