Search code examples
mql4

MQL4 Send objects array as function parameter


I had the function as a class member with an array of my custom object as a parameter:

class Stochastic { ... some class which sent into initializeStochastics method as param };

class StochasticInitializer {
    public:
        Properties *properties[8];

    public:
        StochasticInitializer(void) {
           this.properties = ... 
        }

    public:
        void initializeStochastics(Stochastic& *stochastics[]) { // This param is my problem
            for (int i = 0 ;i < ArraySize(properties); i++) {
                if (properties[i].enabled) {
                    stochastics[i] = new Stochastic(properties[i]);
                }
            }
        }
};

My errors:

'&' - comma expected
']' - declaration without type
']' - comma expected
'initializeStochastics' - wrong parameters count
'stochastics' - undeclared identifier

I take syntax from here, but perhaps it solution for MQL5.

Can I send an array of class instances as a method parameter in MQL4? If "yes" - how, if no - it answers too.


Solution

  • Everything works (almost works) just decide whether you are going to create an global array or with pointer access (need to delete it after you finish). Here is example of pointers. Also, please provide MCVE next time, because someone needs to write all that useless stuff like properties&stoch classes to make it testable.

    class Properties
      {
    public:
       bool  enabled;
       int   periodK;
       Properties(bool _enabled,int k):enabled(_enabled),periodK(k){}
      ~Properties(){}
      };
    class Stochastic
      {
    public:
       int   periodK;
    
       Stochastic(){}
      ~Stochastic(){}
       Stochastic(Properties *prop):periodK(prop.periodK){}
    
       double get(const int shift,const int buffer=0)const{return iStochastic(_Symbol,0,periodK,3,3,MODE_SMA,STO_LOWHIGH,buffer,shift);}
      };
    class StochasticInitializer
      {
    public:
       Properties *properties[8];
    
       StochasticInitializer()
         {
          Deinit();
          properties[0]=new Properties(true,5);
          properties[1]=new Properties(true,13);
          properties[2]=new Properties(true,14);
          properties[3]=new Properties(true,15);
          properties[4]=new Properties(true,16);
          properties[5]=new Properties(true,17);
          properties[6]=new Properties(true,18);
          properties[7]=new Properties(false,19);
         }
      ~StochasticInitializer(){Deinit();}
       void        Deinit(const int reason=0){   for(int i=0;i<ArraySize(properties);i++)delete(properties[i]);   }
       void        initializeStochastics(Stochastic *&stochastics[])// THIS IS WHAT YOU NEED IN CASE OF POINTERS
         {
          for(int i=0;i<ArraySize(properties);i++)
            {
             if(properties[i].enabled)
               {
                stochastics[i]=new Stochastic(properties[i]);
               }
            }
         }
      };
    StochasticInitializer initializer;
    void OnTick()
        {
           Stochastic *array[8];    //THIS IS ARRAY OF POINTERS
           initializer.initializeStochastics(array);
           for(int i=0;i<ArraySize(array);i++)
             {
              printf("%i %s: %d %s",__LINE__,__FILE__,i,CheckPointer(array[i])==POINTER_INVALID ? "null" : (string)array[i].periodK);
             }
           for(int i=ArraySize(array)-1;i>=0;i--)delete(array[i]);//DELETING POINTERS
           ExpertRemove();
        }