4

As far as i have seen function pointers do not exist in MQL4.

As a workaround i use:

// included for both caller as callee side
class Callback{
   public: virtual void callback(){ return; }
}

Then in the source where a callback is passed from:

class mycb : Callback{
   public: virtual void callback(){
     // call to whatever function needs to be called back in this source
   }mcbi;

now mcbi can be passed as follows:

 afunction(){
    fie_to_receive_callback((Callback *)mycbi);
 }      

and the receiver can callback as:

 fie_to_receive_callback(mycb *mcbi){
    mcbi.callback(); // call the callback function
  }

is there a simpler way to pass a function callback in mql4 ?

user3666197
  • 1
  • 6
  • 43
  • 77
Joel Box
  • 411
  • 5
  • 12

2 Answers2

5

Actually there is a way, using function pointers in MQL4. Here is an example:

typedef int(*MyFuncType)(int,int);

int addition (int a, int b)
{ return (a+b); }

int subtraction (int a, int b)
{ return (a-b); }

int operation (int x, int y, MyFuncType myfunc)
{
   int g;
   g = myfunc(x,y);
   return (g);
}

int OnInit()
{
   int m,n;
   m = operation (7, 5, addition);
   n = operation (20, m, subtraction);
   Print(n);
   return(INIT_FAILED);  //just to close the expert
}
seasick
  • 429
  • 3
  • 14
Investing TS
  • 128
  • 2
  • 11
0

No. Fortunately there is not. ( . . . . . . . however MQL4 language syntax creeps * )

MQL4 Runtime Execution Engine ( MT4 ) has rather fragile process/thread handling and adding more ( and smarter ) constructs ( beyond rudimentary { OnTimer() | OnTick() | OnCalculate() } event-bound callbacks ) constitutes rather a threat to the already unguaranteed RealTime Execution of the main MT4-duties. While "New"-MQL4.56789 may provide hacks into doing so, there might be safer rather an off-loading strategy to go distributed and let MT4-legacy handlers receive "pre-baked" results from external processing Cluster, rather than trying to hang more and more and more flittering gadgets on a-years-old-poor-Xmas-tree.

To realise how brute this danger-avoidance is, just notice that original OnTimer() used 1 second resolution ( yes 1.000.000.000 ns steps in the world, where stream-providers label events in nano-seconds ... )

* ): Yes, since "new"-MQL4 introduction, there were many stealth-mode changes in the original MQL4-language. After each update it is more than recommendable to review "new"-Help file, as there might be both new options & nasty surprises. Maintaining an MQL4 Code-Base with more than a few hundreds man*years, this is indeed a very devastating experience.

user3666197
  • 1
  • 6
  • 43
  • 77