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));
|
|
}
|
|
//+------------------------------------------------------------------+
|