Указатель функции MQL4 / решение обратного вызова функции

Насколько я видел, указатели на функции не существуют в 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?


person Joel Box    schedule 06.04.2015    source источник


Ответы (2)


На самом деле есть способ, используя указатели на функции в 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
}
person Investing TS    schedule 15.05.2019

Нет. К счастью, нет.( . . . . . . . . однако синтаксис языка MQL4 ползает * )

MQL4 Runtime Execution Engine (MT4) имеет довольно ненадежную обработку процессов/потоков, и добавление большего количества (и более умных) конструкций (помимо рудиментарных { OnTimer() | OnTick() | OnCalculate() } событийно-привязанных обратных вызовов) представляет скорее угрозу для уже негарантированного выполнения основных функций MT4 в реальном времени. В то время как «Новый»-MQL4.56789 может предоставить хаки для этого, может быть более безопасной стратегией разгрузки, чтобы перейти к распределению и позволить устаревшим обработчикам MT4 получать «заранее запеченные» результаты из внешнего кластера обработки, а не пытаться вешать все больше и больше порхающих гаджетов на бедную-летнюю-елку.

Чтобы понять, насколько грубым является это предотвращение опасности, просто обратите внимание, что исходное OnTimer() использовало разрешение в 1 секунду (да, 1 000 000 000 ns шагов в мире, где поставщики потоков обозначают события в наносекундах...)

* ): Да, с момента введения "new"-MQL4 в исходный MQL4 язык было внесено много скрытых изменений. После каждого обновления более чем рекомендуется просматривать «новый» файл справки, так как могут быть как новые опции, так и неприятные сюрпризы. Поддержание базы кода MQL4 за несколько сотен человеко-лет — это действительно очень разрушительный опыт.

person user3666197    schedule 17.09.2015