indicatorparameters_demo

Author: Copyright 2012, MetaQuotes Software Corp.
0 Views
0 Downloads
0 Favorites
indicatorparameters_demo
//+------------------------------------------------------------------+
//|                                     IndicatorParameters_Demo.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| indicator_info                                                   |
//+------------------------------------------------------------------+
struct indicator_info
  {
   int               win;
   int               subwin;
   int               index;
   string            name;
   int               handle;
  };
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   indicator_info ind_info_new[];
   static indicator_info ind_info_old[];
   static int ind_total=0;
   static int ind_total_old=0;

//--- chart event change
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- save current indicator list to ind_info_new[] array
      GetIndicatorsInfo(ind_info_new,ind_total);
      //--- checking changes
      if(ind_total!=ind_total_old)
        {
         CompareStates(ind_info_new,ind_info_old);
        }
      //--- save current indicator list to ind_info_old[] array
      GetIndicatorsInfo(ind_info_old,ind_total_old);
     }
//---
  }
//+------------------------------------------------------------------+
//| Compare information about indicators                             |
//+------------------------------------------------------------------+
void CompareStates(indicator_info &new_info[],indicator_info &old_info[])
  {
//--- checking: indicator has been deleted from chart
   if(ArraySize(old_info)>0)
     {
      for(int i=0; i<ArraySize(old_info); i++)
        {
         if(FindIndicator(new_info,old_info[i].name,old_info[i].handle)==false)
           {
            Print("- deleted: win=",old_info[i].win," subwin=",old_info[i].subwin,
                  " name=",old_info[i].name," handle=",old_info[i].handle);
           }
        }
     }
//--- checking: indicator has been added on chart
   if(ArraySize(new_info)>0)
     {
      for(int i=0; i<ArraySize(new_info); i++)
        {
         //--- find it in the old_info[] array
         if(FindIndicator(old_info,new_info[i].name,new_info[i].handle)==false)
           {
            Print("+ added: win=",new_info[i].win," subwin=",new_info[i].subwin,
                  " name=",new_info[i].name," handle=",new_info[i].handle);
            Print(GetParametersInfo(new_info[i].win,new_info[i].index));
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Finds the information about indicator in ind[] array             |
//+------------------------------------------------------------------+
bool FindIndicator(indicator_info &ind[],string name,int handle)
  {
   for(int i=0; i<ArraySize(ind); i++)
     {
      if(ind[i].name==name && ind[i].handle==handle) { return(true); }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| Adds the information about indicator to ind[] array              |
//+------------------------------------------------------------------+
bool AddIndicatorInfo(indicator_info &ind[],int win,int subwin,string name,int handle,int index)
  {
   if(FindIndicator(ind,name,handle)) return(false);
   int cnt=ArraySize(ind);
   ArrayResize(ind,cnt+1);
   ind[cnt].win=win;
   ind[cnt].subwin=subwin;
   ind[cnt].name=name;
   ind[cnt].handle=handle;
   ind[cnt].index=index;
   return(true);
  }
//+------------------------------------------------------------------+
//| Gets the information about all indicators on the chart           |
//+------------------------------------------------------------------+
void GetIndicatorsInfo(indicator_info &ind[],int &indicators_total)
  {
//--- total indicator windows
   int subwindows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   string s="CHART_WINDOWS_TOTAL="+IntegerToString(subwindows)+"\n";
   ArrayResize(ind,0);

   indicators_total=0;
   for(int i=0; i<subwindows; i++)
     {
      int indicators=ChartIndicatorsTotal(0,i);
      if(indicators>0)
        {
         indicators_total+=indicators;
         for(int j=0; j<indicators; j++)
           {
            //--- get indicator name
            string name=ChartIndicatorName(0,i,j);
            //--- get indicator handle
            int handle=ChartIndicatorGet(0,i,name);
            //--- add the information to ind[] array
            AddIndicatorInfo(ind,i,j,name,handle,j);
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Get the information about indicator parameters                   |
//+------------------------------------------------------------------+
string GetParametersInfo(int sub_window,int ind_index)
  {
//---
   string info="";
//--- get indicator short name by index
   string name=ChartIndicatorName(0,sub_window,ind_index);
//--- get indicator handle
   int handle=ChartIndicatorGet(0,sub_window,name);
//---
   MqlParam parameters[];
   ENUM_INDICATOR indicator_type;
   int params=IndicatorParameters(handle,indicator_type,parameters);
//--- prepare header
   info=name+" => "+EnumToString(ENUM_INDICATOR(indicator_type))+"\r\n";
   for(int i=0;i<params;i++)
     {
      info+=StringFormat("%d: type=%s, long_value=%d, double_value=%G,string_value=%s\r\n",
                         i,
                         EnumToString((ENUM_DATATYPE)parameters[i].type),
                         parameters[i].integer_value,
                         parameters[i].double_value,
                         parameters[i].string_value
                         );
     }
//--- return the information about indicator parameters
   return(info);
  }
//+------------------------------------------------------------------+

Comments