424 lines
17 KiB
MQL5
424 lines
17 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Volumes.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "Indicator.mqh"
| |||
//+------------------------------------------------------------------+
| |||
//| Class CiAD. |
| |||
//| Purpose: Class of the "Accumulation/Distribution" indicator. |
| |||
//| Derives from class CIndicator. |
| |||
//+------------------------------------------------------------------+
| |||
class CiAD : public CIndicator
| |||
{
| |||
protected:
| |||
ENUM_APPLIED_VOLUME m_applied; // applied volume
| |||
| |||
public:
| |||
CiAD(void);
| |||
~CiAD(void);
| |||
//--- methods of access to protected data
| |||
ENUM_APPLIED_VOLUME Applied(void) const { return(m_applied); }
| |||
//--- method of creation
| |||
bool Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
//--- methods of access to indicator data
| |||
double Main(const int index) const;
| |||
//--- method of identifying
| |||
virtual int Type(void) const { return(IND_AD); }
| |||
| |||
protected:
| |||
//--- methods of tuning
| |||
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
| |||
bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CiAD::CiAD(void) : m_applied(WRONG_VALUE)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CiAD::~CiAD(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create the "Accumulation/Distribution" indicator |
| |||
//+------------------------------------------------------------------+
| |||
bool CiAD::Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
//--- check history
| |||
if(!SetSymbolPeriod(symbol,period))
| |||
return(false);
| |||
//--- create
| |||
m_handle=iAD(symbol,period,applied);
| |||
//--- check result
| |||
if(m_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//--- indicator successfully created
| |||
if(!Initialize(symbol,period,applied))
| |||
{
| |||
//--- initialization failed
| |||
IndicatorRelease(m_handle);
| |||
m_handle=INVALID_HANDLE;
| |||
return(false);
| |||
}
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with universal parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiAD::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
| |||
{
| |||
return(Initialize(symbol,period,(ENUM_APPLIED_VOLUME)params[0].integer_value));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with special parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiAD::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
if(CreateBuffers(symbol,period,1))
| |||
{
| |||
//--- string of status of drawing
| |||
m_name ="AD";
| |||
m_status="("+symbol+","+PeriodDescription()+","+VolumeDescription(applied)+") H="+IntegerToString(m_handle);
| |||
//--- save settings
| |||
m_applied=applied;
| |||
//--- create buffers
| |||
((CIndicatorBuffer*)At(0)).Name("MAIN_LINE");
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//--- error
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Access to buffer of "Accumulation/Distribution" |
| |||
//+------------------------------------------------------------------+
| |||
double CiAD::Main(const int index) const
| |||
{
| |||
CIndicatorBuffer *buffer=At(0);
| |||
//--- check
| |||
if(buffer==NULL)
| |||
return(EMPTY_VALUE);
| |||
//---
| |||
return(buffer.At(index));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Class CiMFI. |
| |||
//| Purpose: Class of the "Money Flow Index" indicator. |
| |||
//| Derives from class CIndicator. |
| |||
//+------------------------------------------------------------------+
| |||
class CiMFI : public CIndicator
| |||
{
| |||
protected:
| |||
int m_ma_period;
| |||
ENUM_APPLIED_VOLUME m_applied;
| |||
| |||
public:
| |||
CiMFI(void);
| |||
~CiMFI(void);
| |||
//--- methods of access to protected data
| |||
int MaPeriod(void) const { return(m_ma_period); }
| |||
ENUM_APPLIED_VOLUME Applied(void) const { return(m_applied); }
| |||
//--- method of creation
| |||
bool Create(const string symbol,const ENUM_TIMEFRAMES period,
| |||
const int ma_period,const ENUM_APPLIED_VOLUME applied);
| |||
//--- methods of access to indicator data
| |||
double Main(const int index) const;
| |||
//--- method of identifying
| |||
virtual int Type(void) const { return(IND_MFI); }
| |||
| |||
protected:
| |||
//--- methods of tuning
| |||
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
| |||
bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,
| |||
const int ma_period,const ENUM_APPLIED_VOLUME applied);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CiMFI::CiMFI(void) : m_ma_period(-1),
| |||
m_applied(WRONG_VALUE)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CiMFI::~CiMFI(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create the "Money Flow Index" indicator |
| |||
//+------------------------------------------------------------------+
| |||
bool CiMFI::Create(const string symbol,const ENUM_TIMEFRAMES period,
| |||
const int ma_period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
//--- check history
| |||
if(!SetSymbolPeriod(symbol,period))
| |||
return(false);
| |||
//--- create
| |||
m_handle=iMFI(symbol,period,ma_period,applied);
| |||
//--- check result
| |||
if(m_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//--- indicator successfully created
| |||
if(!Initialize(symbol,period,ma_period,applied))
| |||
{
| |||
//--- initialization failed
| |||
IndicatorRelease(m_handle);
| |||
m_handle=INVALID_HANDLE;
| |||
return(false);
| |||
}
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with universal parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiMFI::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
| |||
{
| |||
return(Initialize(symbol,period,(int)params[0].integer_value,(ENUM_APPLIED_VOLUME)params[1].integer_value));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with special parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiMFI::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
| |||
const int ma_period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
if(CreateBuffers(symbol,period,1))
| |||
{
| |||
//--- string of status of drawing
| |||
m_name ="MFI";
| |||
m_status="("+symbol+","+PeriodDescription()+","+
| |||
IntegerToString(ma_period)+","+VolumeDescription(applied)+","+") H="+IntegerToString(m_handle);
| |||
//--- save settings
| |||
m_ma_period=ma_period;
| |||
m_applied =applied;
| |||
//--- create buffers
| |||
((CIndicatorBuffer*)At(0)).Name("MAIN_LINE");
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//--- error
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Access to buffer of "Money Flow Index" |
| |||
//+------------------------------------------------------------------+
| |||
double CiMFI::Main(const int index) const
| |||
{
| |||
CIndicatorBuffer *buffer=At(0);
| |||
//--- check
| |||
if(buffer==NULL)
| |||
return(EMPTY_VALUE);
| |||
//---
| |||
return(buffer.At(index));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Class CiOBV. |
| |||
//| Purpose: Class of the "On Balance Volume" indicator. |
| |||
//| Derives from class CIndicator. |
| |||
//+------------------------------------------------------------------+
| |||
class CiOBV : public CIndicator
| |||
{
| |||
protected:
| |||
ENUM_APPLIED_VOLUME m_applied;
| |||
| |||
public:
| |||
CiOBV(void);
| |||
~CiOBV(void);
| |||
//--- methods of access to protected data
| |||
ENUM_APPLIED_VOLUME Applied(void) const { return(m_applied); }
| |||
//--- method create
| |||
bool Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
//--- methods of access to indicator data
| |||
double Main(const int index) const;
| |||
//--- method of identifying
| |||
virtual int Type(void) const { return(IND_OBV); }
| |||
| |||
protected:
| |||
//--- methods of tuning
| |||
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
| |||
bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CiOBV::CiOBV(void) : m_applied(WRONG_VALUE)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CiOBV::~CiOBV(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create the "On Balance Volume" indicator |
| |||
//+------------------------------------------------------------------+
| |||
bool CiOBV::Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
//--- check history
| |||
if(!SetSymbolPeriod(symbol,period))
| |||
return(false);
| |||
//--- create
| |||
m_handle=iOBV(symbol,period,applied);
| |||
//--- check result
| |||
if(m_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//--- indicator successfully created
| |||
if(!Initialize(symbol,period,applied))
| |||
{
| |||
//--- initialization failed
| |||
IndicatorRelease(m_handle);
| |||
m_handle=INVALID_HANDLE;
| |||
return(false);
| |||
}
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with universal parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiOBV::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
| |||
{
| |||
return(Initialize(symbol,period,(ENUM_APPLIED_VOLUME)params[0].integer_value));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with special parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiOBV::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
if(CreateBuffers(symbol,period,1))
| |||
{
| |||
//--- string of status of drawing
| |||
m_name ="OBV";
| |||
m_status="("+symbol+","+PeriodDescription()+","+VolumeDescription(applied)+","+") H="+IntegerToString(m_handle);
| |||
//--- save settings
| |||
m_applied=applied;
| |||
//--- create buffers
| |||
((CIndicatorBuffer*)At(0)).Name("MAIN_LINE");
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//--- error
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Access to buffer of "On Balance Volume" |
| |||
//+------------------------------------------------------------------+
| |||
double CiOBV::Main(const int index) const
| |||
{
| |||
CIndicatorBuffer *buffer=At(0);
| |||
//--- check
| |||
if(buffer==NULL)
| |||
return(EMPTY_VALUE);
| |||
//---
| |||
return(buffer.At(index));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Class CiVolumes. |
| |||
//| Purpose: Class of the "Volumes" indicator. |
| |||
//| Derives from class CIndicator. |
| |||
//+------------------------------------------------------------------+
| |||
class CiVolumes : public CIndicator
| |||
{
| |||
protected:
| |||
ENUM_APPLIED_VOLUME m_applied;
| |||
| |||
public:
| |||
CiVolumes(void);
| |||
~CiVolumes(void);
| |||
//--- methods of access to protected data
| |||
ENUM_APPLIED_VOLUME Applied(void) const { return(m_applied); }
| |||
//--- method create
| |||
bool Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
//--- methods of access to indicator data
| |||
double Main(const int index) const;
| |||
//--- method of identifying
| |||
virtual int Type(void) const { return(IND_VOLUMES); }
| |||
| |||
protected:
| |||
//--- methods of tuning
| |||
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
| |||
bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CiVolumes::CiVolumes(void) : m_applied(WRONG_VALUE)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CiVolumes::~CiVolumes(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create the "Volumes" indicator |
| |||
//+------------------------------------------------------------------+
| |||
bool CiVolumes::Create(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
//--- check history
| |||
if(!SetSymbolPeriod(symbol,period))
| |||
return(false);
| |||
//--- create
| |||
m_handle=iVolumes(symbol,period,applied);
| |||
//--- check result
| |||
if(m_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//--- indicator successfully created
| |||
if(!Initialize(symbol,period,applied))
| |||
{
| |||
//--- initialization failed
| |||
IndicatorRelease(m_handle);
| |||
m_handle=INVALID_HANDLE;
| |||
return(false);
| |||
}
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with universal parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiVolumes::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
| |||
{
| |||
return(Initialize(symbol,period,(ENUM_APPLIED_VOLUME)params[0].integer_value));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Initialize the indicator with special parameters |
| |||
//+------------------------------------------------------------------+
| |||
bool CiVolumes::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const ENUM_APPLIED_VOLUME applied)
| |||
{
| |||
if(CreateBuffers(symbol,period,1))
| |||
{
| |||
//--- string of status of drawing
| |||
m_name ="Volumes";
| |||
m_status="("+symbol+","+PeriodDescription()+","+VolumeDescription(applied)+","+") H="+IntegerToString(m_handle);
| |||
//--- save settings
| |||
m_applied=applied;
| |||
//--- create buffers
| |||
((CIndicatorBuffer*)At(0)).Name("MAIN_LINE");
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//--- error
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Access to buffer of "Volumes" |
| |||
//+------------------------------------------------------------------+
| |||
double CiVolumes::Main(const int index) const
| |||
{
| |||
CIndicatorBuffer *buffer=At(0);
| |||
//--- check
| |||
if(buffer==NULL)
| |||
return(EMPTY_VALUE);
| |||
//---
| |||
return(buffer.At(index));
| |||
}
| |||
//+------------------------------------------------------------------+
|