[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 269

 
yosuf:
Спасибо, там по ссылке, указан вариант программного решения вопроса, а я не не знаю, что делать. С чем это связано и как мне решить этот вопрос? Почему целый месяц советник работал нормально, а теперь глючит? Если ошибка была в коде? Получается, ветка не для новичков, если обременяет ответы на вопросы. Я расстроен.

Я в своём советнике сразу же после старта написал такое:

//--- Section A: start - checking.
   if (!IsExpertEnabled())
      {Comment("Expert is NOT working. Check the reason."); return(0);}
   if (!IsConnected())
      {Comment("No connection!"); return(0);}
   if (IsTradeContextBusy())
      {Comment("Trade flow is busy. Wait..."); Sleep(5*1000); return(0);}
   if (AccountFreeMargin()<1000*Lot_super)
      {Comment("No money to trade. Free Margin = ",AccountFreeMargin()); Sleep(20*1000); return(0);}
//--- Section A: end - checking.

Попробуйте, может пригодится и вам кое-что из этого.

 
drknn:


1. Ок. Объявлена int start(). Я всегда возвращал ноль. В кодах видел и команду return(-1), и даже return(-2). Как правильно выбирать этот код?

2. Ну и возникает естественный впрос, можно ли объявлять start() советника/индикатора/скрипта не типа int(), а произвольного другого и что потом возвращать в терминал? Иными словами, что делает терминал со значением, которое ему возвращает return() ?

1. Как Вы решаете, что должна возвратить обычная функция?

2. Можно любой тип, как у обычной функции. Терминал ничего не делает с возвращемыми значениями. Он их игнорирует.

Специальные функции

 
Zhunko:

1. А как Вы решаете, что должна возвратить обычная функция?

2. Можно любой тип, как у обычной функции. Терминал ничего не делает с возвращемыми значениями. Он их игнорирует.


1. Чтоб решить что именно должна возвратить обычная функция, я должен знать, зачем основному коду именно такая величина. Напрмер, если нужно принять решение об окрытии бай-ордера при наличии сигнала, я напишу функцию, которая возвратит количество уже открытых бай-ордеров. В зависимости от того сколько их там, код будет принимать решение следуя вложенной в код логике. Я не знаю, какая логика обработки кода возврата вложена в терминал. Сегодня просматривал статью про создание семафора и наткнулся на код возврата (-2). Удивился, задал тут вопрос. Только и всего. ( https://www.mql5.com/ru/articles/1412 - статья тут).

2. Терминал игнорирует возвращаемые значения. Это точно? Если это так, то тогда опять возникает законный вопрос, почему при создании советника/индикатора/скрипта разработчик вложил в шаблон именно int, ведь логичнее было вложить туда void - тогда терминалу и игнорировать ни чего бы не пришлось - мы бы тогда выиграли 1 такт процессорного времени? Может всё же есть какая-то логика, в том, ЧТО возвращать в ретурне из функций int init(), int deinit() и int start()? По моему, Рош где-то кому-то это уже объяснял - там помнится было описание когда нужно возвращать ноль, а когда (-1). Вот это-то объяснение я и искал. Жаль найти не удалось...

P.S.

return(-2) автор статьи использует в своих целях. Но факт остаётся фактом - иногда функция start() завершается кодом возврата величины, отличной от нуля. И это делает далеко не 1 человек. Вот эту то логику и хотелось бы понять.

 

Похоже, что там в тексте

Предопределенные функции могут иметь параметры. Однако при вызове этих функций клиентским терминалом никакие параметры переданы извне не будут, а будут использованы умолчательные значения.

речь идёт о параметрах, поступающих в функцию, а не о параметрах, возвращаемых ею.

 
спасибо за ответ!
drknn:
Это счётчик ордеров. Ну, бывает так, например, что нужно узнать в коде, есть ли в рынке, например, бай-ордера по определённой валютной паре и с определёным магикнумбером. Если есть, например, то открывать ещё бай-ордер, например нельзя. То есть счётчик ордеров нужен для принятия решения.
 
paladin80:

Я в своём советнике сразу же после старта написал такое:

Попробуйте, может пригодится и вам кое-что из этого.

Спасибо, обнаружил ошибку. Когда советник зациклился, по причине указанной в статье (вышеприведенная ссылка), я закрыл его и запустил вновь, но забыл изменить магик ордеров с 123 на 124 и два разнонапрвленных советника получили одинаковые магики и стали соревноваться, кто быстрее открывает ордер. Если первым открывается. допустим, "СЕЛЛ", естественно, уже не открывался "БАЙ" или наоборот. Как только изменил магик второго, обновленного, советника, оба стали работать нормально. Если повторится ошибка, воспользуюсь Вашим советом. Спасибо за ответы.
 

как можно понять эти строки:

return orders volume

if(buys>0) return(buys);

else return(-sells);

} ?

 

Пишем скрипт:

int start(){
  Print("Попытка ретурна 136");
  return(136);
}

кидаем на график и смотри журнал:

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(тут 111 - это имя скрипта). Видим строку " uninit reason 0 " - по всей видимости терминал ждал нуля!

Пробуем то же самое с (-1) :

int start(){
  Print("Попытка ретурна -1");
  return(-1);
}

Результат тот же самый:

2012.07.20 12:08:19 111 NZDUSD,M15: removed
2012.07.20 12:08:19 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:08:19 111 NZDUSD,M15: Попытка ретурна -1

2012.07.20 12:08:19 111 NZDUSD,M15: loaded successfully

Видать терминалу не безразлично, ноль возвращается, или нет.

P.S.

А вообще в инете наткнулся на такой ответ:

return 0 - программа закончила свою работу без ошибок
return 1 - или выше номер, программа закончала свою работу с ошибкой и возвращает код ошибки для обработки далее.

В любой операционной системе любая программа всегда возвращает код ошибки.

Беда лишь в том, что наш ретурн возвращает код не в операционку, а в терминал. Это оставляет вопрос открытым.

 
drknn:

Пишем скрипт:

кидаем на график и смотри журнал:

(тут 111 - это имя скрипта). Видим строку " uninit reason 0 " - по всей видимости терминал ждал нуля!

Пробуеем то же самое с (-1) :

Результат тот же самый:

Видать терминалу не безразлично, ноль возвращается, или нет.


uninit reason это - код причины завершения эксперта

https://docs.mql4.com/ru/constants/uninit

 
Вы немного путаете, UNINIT REASON не имеет никакого отношения к ретурнам относительно стандартных функций. Напишите советник и по вызывайте из "старта" "инит" с разными результатам возврата и посмотрите. Собственно https://docs.mql4.com/ru/basis/functions/special в доке все отлично написано. Просто еще раз внимательно перечитайте.