﻿//+------------------------------------------------------------------+
//|                                             IndicatorCatalog.mqh |
//|                                  Copyright 2025, MetaQuotes Ltd. |
//|                          https://www.mql5.com/en/users/lynnchris |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com/en/users/lynnchris"
#property version   "1.00"

#ifndef _INDICATOR_CATALOG_MQH
#define _INDICATOR_CATALOG_MQH

#include <Indicators\Indicators.mqh>

//--- Structure to hold each indicator's name and enum type
struct SIndicatorInfo
  {
   string            name;       
   ENUM_INDICATOR    type;       
  };

//+------------------------------------------------------------------+
//| Catalog of built-in indicators                                   |
//+------------------------------------------------------------------+
class CIndicatorCatalog
  {
private:
   SIndicatorInfo    m_indicators[];   
public:
                     CIndicatorCatalog();
                    ~CIndicatorCatalog() {}
   int               Count() const { return ArraySize(m_indicators); }
   bool              GetInfo(const int index, SIndicatorInfo &out) const;
  };

//+------------------------------------------------------------------+
//| Constructor – fills the catalog using a macro                    |
//+------------------------------------------------------------------+
CIndicatorCatalog::CIndicatorCatalog()
  {
   ArrayResize(m_indicators, 0);
   int idx = 0;

//--- Helper macro: adds one indicator to the array
#define ADD_INDICATOR(enum_name, display_name) \
   { \
      ArrayResize(m_indicators, idx + 1); \
      m_indicators[idx].name = display_name; \
      m_indicators[idx].type = enum_name; \
      idx++; \
   }

//--- All built-in MT5 indicators (as of build 4000+)
   ADD_INDICATOR(IND_AC, "Accelerator Oscillator")
   ADD_INDICATOR(IND_AD, "Accumulation/Distribution")
   ADD_INDICATOR(IND_ADX, "Average Directional Movement Index")
   ADD_INDICATOR(IND_ADXW, "ADX Welles Wilder")
   ADD_INDICATOR(IND_ALLIGATOR, "Alligator")
   ADD_INDICATOR(IND_AMA, "Adaptive Moving Average")
   ADD_INDICATOR(IND_AO, "Awesome Oscillator")
   ADD_INDICATOR(IND_ATR, "Average True Range")
   ADD_INDICATOR(IND_BANDS, "Bollinger Bands")
   ADD_INDICATOR(IND_BEARS, "Bears Power")
   ADD_INDICATOR(IND_BULLS, "Bulls Power")
   ADD_INDICATOR(IND_BWMFI, "Market Facilitation Index")
   ADD_INDICATOR(IND_CCI, "Commodity Channel Index")
   ADD_INDICATOR(IND_CHAIKIN, "Chaikin Oscillator")
   ADD_INDICATOR(IND_DEMA, "Double Exponential Moving Average")
   ADD_INDICATOR(IND_DEMARKER, "DeMarker")
   ADD_INDICATOR(IND_ENVELOPES, "Envelopes")
   ADD_INDICATOR(IND_FORCE, "Force Index")
   ADD_INDICATOR(IND_FRACTALS, "Fractals")
   ADD_INDICATOR(IND_GATOR, "Gator Oscillator")
   ADD_INDICATOR(IND_ICHIMOKU, "Ichimoku Kinko Hyo")
   ADD_INDICATOR(IND_MA, "Moving Average")
   ADD_INDICATOR(IND_MACD, "MACD")
   ADD_INDICATOR(IND_MFI, "Money Flow Index")
   ADD_INDICATOR(IND_MOMENTUM, "Momentum")
   ADD_INDICATOR(IND_OBV, "On Balance Volume")
   ADD_INDICATOR(IND_OSMA, "OSMA")
   ADD_INDICATOR(IND_RSI, "Relative Strength Index")
   ADD_INDICATOR(IND_RVI, "Relative Vigor Index")
   ADD_INDICATOR(IND_SAR, "Parabolic SAR")
   ADD_INDICATOR(IND_STDDEV, "Standard Deviation")
   ADD_INDICATOR(IND_STOCHASTIC, "Stochastic Oscillator")
   ADD_INDICATOR(IND_TEMA, "Triple Exponential Moving Average")
   ADD_INDICATOR(IND_TRIX, "TRIX")
   ADD_INDICATOR(IND_VIDYA, "Variable Index Dynamic Average")
   ADD_INDICATOR(IND_VOLUMES, "Volumes")
   ADD_INDICATOR(IND_WPR, "Williams' Percent Range")

#undef ADD_INDICATOR   
  }

//+------------------------------------------------------------------+
//| Gets indicator info by index; returns false if out of bounds     |
//+------------------------------------------------------------------+
bool CIndicatorCatalog::GetInfo(const int index, SIndicatorInfo &out) const
  {
   if(index < 0 || index >= ArraySize(m_indicators))
      return(false);
   out = m_indicators[index];
   return(true);
  }

#endif // _INDICATOR_CATALOG_MQH
//+------------------------------------------------------------------+
