4

据我所知,MQL4 中不存在函数指针。

作为一种解决方法,我使用:

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

然后在传递回调的源中:

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

现在 mcbi 可以按如下方式传递:

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

并且接收者可以回调为:

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

有没有更简单的方法在 mql4 中传递函数回调?

4

2 回答 2

5

实际上有一种方法,在 MQL4 中使用函数指针。这是一个例子:

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
}
于 2019-05-15T17:38:36.890 回答
0

不,幸运的是没有。( . . . . . . . . 但是 MQL4 语言语法令人毛骨悚然 * )

MQL4运行时执行引擎 (MT4) 具有相当脆弱的进程/线程处理,并且添加更多(和更智能)构造(超出基本的{ OnTimer() | OnTick() | OnCalculate() }事件绑定回调)对主要 MT4 职责的已经没有保证的实时执行构成相当大的威胁。虽然“新”-MQL4.56789 可能会提供黑客这样做,但可能有更安全的卸载策略来分发并让 MT4 遗留处理程序从外部处理集群接收“预烘焙”结果,而不是尝试在一岁可怜的圣诞树上挂越来越多的小玩意儿。

要意识到这种避免危险的方法是多么粗暴,只需注意原始OnTimer()使用 1 秒的分辨率(是的,世界上有 1.000.000.000ns步,其中流提供者以纳秒为单位标记事件......)

* ):的,自从"new"-MQL4引入以来,原始语言中有许多隐身模式的变化MQL4。每次更新后,最好查看“新”帮助文件,因为可能会有新选项和令人讨厌的惊喜。维护一个MQL4数百人*年的代码库,这确实是一次非常具有破坏性的经历。

于 2015-09-17T01:11:04.763 回答