Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 201

 
Alexsandr San:

Вам для мт4 или мт5? тот код который я выставлял - я удалил. не сразу заметил что тут обсуждают мт4 

 MQL4 

 
Speculator:

 MQL4 

Вот тут, много чего хорошего есть https://www.mql5.com/ru/forum/131859/page6#comment_3359705
 
Здравствуйте, можно ли в MT4 получать уведомления на телефон/почту при выключенном терминале, но с подключенным VPS сервером?
 
Alexsandr San:
 

Советую - много хорошего можно найти https://www.mql5.com/ru/forum/131859/page6#comment_3359705

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 
Можно ли, применяя макросы, каким-то образом увидеть, во что развернётся получившийся код?
 

Более конкретный и, возможно, интересный вопрос:

я использую в разных функциях одну и ту же конструкцию

if(FileReadStruct(handle,temp_rate)!=60)
{
  IsError=true;
  Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError());
  return;
}

Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:

return(0);

Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?

 
Yurij Kozhevnikov:

Более конкретный и, возможно, интересный вопрос:

я использую в разных функциях одну и ту же конструкцию

Однако, одни функции имеют тип void, а другие возвращают значение, поэтому из них я возвращаю ноль:

Могу ли я сделать такой волшебный макрос, который в каждом случае подставлял бы мне нужный вариант?

Использование return в макросе - есть взведенный пистолет, направленный себе в ногу, а в купе с if - он превращается в пушку))) Но если очень хочется, то:

#define CHECK_READ(dHndl,dRate,dRet)  do \
if(FileReadStruct(dHndl,dRate)!=60){    \
  IsError=true;   \
  Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); \
  return dRet;} while(false)
  
...
CHECK_READ(handle,temp_rate,);
...
CHECK_READ(handle,temp_rate,0);
...

Не проверял, но должно работать. Заодно пушку обратно в пистолет превратил)))

 

Спасибо!

То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в

return ;

а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.

return(x);
return x; //равноценны

А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?

 
Yurij Kozhevnikov:

Спасибо!

То есть я передаю последним параметром или значение для return, или пустоту, которая превратится в

а пробел ничего не значит. Ну конечно, как я забыл, что его можно использовать и без моих любимых скобок.

А не подскажите заодно, зачем эта конструкция засунута внутрь цикла, который может выполниться только один раз? Это пушка, превращённая обратно в пистолет? Возможны ситуации типа бесконечной рекурсии или что-то в этом роде?

if (condition) CHECK_READ(h,r,0); else CHECK_READ(h,r,1);
Разверните макрос без do-while обертки и посмотрите, что получится)))
 
Vladimir Simakov:
if (condition) CHECK_READ(h,r,0); else CHECK_READ(h,r,1);
Разверните макрос без do-while обертки и посмотрите, что получится)))
if (condition) if(FileReadStruct(h,r)!=60){   
  IsError=true;   
  Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); 
  return 0;}; else if(FileReadStruct(dHndl,dRate)!=60){    
  IsError=true;   
  Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); 
  return dRet;};

=

if (condition) 
 if(FileReadStruct(h,r)!=60)
 {   
  IsError=true;   
  Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); 
  return 0;
 }; 
 else 
  if(FileReadStruct(dHndl,dRate)!=60)
  {    
   IsError=true;   
   Print(__FUNCSIG__," Не удалось прочитать данные из файла по причине ошибки ",GetLastError()); 
   return dRet;
  };

Кажется, так, если я правильно понял принцип подстановки.

Лишние точки с запятой после фигурных скобок. И непонятно, к чему теперь относится else.

Жаль, что нет, видимо, простого способа автоматизировать разворачивание макросов, чтобы посмотреть, что получится. Разве что замутить собственный скрипт.

Спасибо! Не зря после while в макросе нет точки с запятой.

Причина обращения: