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