Вопрос MQL

 

В этой теме я буду задавать вопросы по данному языку и по некоторым кодам. 

https://book.mql4.com/ru/build/conditions

Функция вычисляет торговые критерии. Функция возвращает следующие значения:

10 - сработал торговый критерий для открытия рыночного ордера Buy;
20 - сработал торговый критерий для открытия рыночного ордера Sell; 
11 - сработал торговый критерий для закрытия рыночного ордера Buy;
21 - сработал торговый критерий для закрытия рыночного ордера Sell;

   if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)
      return(10);                      // Открытие Buy    
   if(M_0<S_0 &&  M_0>Opn && St_M_0<St_S_0 && St_S_0>St_max)
      return(20);                      // Открытие Sell 
   if(M_0<S_0 &&  M_0>Cls && St_M_0<St_S_0 && St_S_0>St_max)
      return(11);                      // Закрытие Buy    
   if(M_0>S_0 && -M_0>Cls && St_M_0>St_S_0 && St_S_0<St_min)
      return(21);                      // Закрытие Sell  
return 10 20 11 21 возвращаемые значения

почему так зациклена программа на возвращаемых значениях для чего так сделано?

 
Seric29:

В этой теме я буду задавать вопросы по данному языку и по некоторым кодам. 

https://book.mql4.com/ru/build/conditions

...

На данном ресурсе есть две ветки с вопросами новичков и ответами на них:

https://www.mql5.com/ru/forum/160587

https://www.mql5.com/ru/forum/160683

Больше уже не нужно.

Пишите, пожалуйста, в любую из них.

 
Seric29:

Сколько вы берёте за написание советника?

Цены разные у всех. Вот тут создаёте заявку, и узнаёте цены. Какие условия подойдут, с тем и работаете.

 
Seric29:  почему так зациклена программа на возвращаемых значениях для чего так сделано?

Представьте, что эта Функция это Диспетчер, который даёт распоряжения.
Распоряжения зашифрованы (чтобы враги не догадались)
И вот программа обращается к этому Диспетчеру - Чо мне делать то?
Диспетчер проанализирует ситуацию и вернёт зашифрованный ответ.

Так вот "вернёт" это и есть return
а "
зашифрованный ответ" внутри скобок и есть указание что делать 

 
Andrei Fandeev:

Представьте, что эта Функция это Диспетчер, который даёт распоряжения.
Распоряжения зашифрованы (чтобы враги не догадались)
И вот программа обращается к этому Диспетчеру - Чо мне делать то?
Диспетчер проанализирует ситуацию и вернёт зашифрованный ответ.

Так вот "вернёт" это и есть return
а "
зашифрованный ответ" внутри скобок и есть указание что делать 

Бывают значения по умолчанию а бывает нужно записывать самому. Возвращаемые значения есть всегда как определить чему они равны эти значения? К примеру у меня есть такой код

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int Period_MA_1=6;
input int Period_MA_3=1;
input double Lots=0.1;
void OnTick()
  {
hfjfu();
  }

void hfjfu()
 
  {
   double MA_1;
   MA_1=iMA(Symbol(),0,6,0,1,0,0);
   double MA_3;
   MA_3=iMA(Symbol(),0,1,0,1,0,0);
int ticket=0;
   
     {
      if(MA_3 > MA_1)
       ticket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,_Digits),0,0,0,NULL,0,0,Green);
      if(MA_3 < MA_1)
        ticket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,_Digits),0,0,0,NULL,0,0,Red);
         
     
     }
   return;
  }

в моём случае возвращаемым значением будет имя переменной ticket почему именно так функция hfjfu() имеет тип void в справочнике сказано что этот тип может быть без возвращаемого правда я наоборот записал.

 
Seric29:

в моём случае возвращаемым значением будет имя переменной ticket

Вернуть имя переменной без особых ухищрений весьма затруднительно. Да и не нужно никому иметь имя переменной в качестве возвращаемого значения. Обычно возвращают значение переменной. В приведенном коде функция hfjfu() ничего не возвращает (у нее тип void). Поэтому указание команды return в конце ее выполнения не имеет никакого смысла. Если убрать эту строку, то ничего не изменится.

почему именно так функция hfjfu() имеет тип void в справочнике сказано что этот тип может быть без возвращаемого правда я наоборот записал.

Чтобы функция вернула результат, нужно указать ее тип отличным от void:

int hfjfu()
 
  {
   double MA_1;
   MA_1=iMA(Symbol(),0,6,0,1,0,0);
   double MA_3;
   MA_3=iMA(Symbol(),0,1,0,1,0,0);
   int ticket=0;
   
   if(MA_3 > MA_1)
     ticket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,_Digits),0,0,0,NULL,0,0,Green);
   if(MA_3 < MA_1)
     ticket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,_Digits),0,0,0,NULL,0,0,Red);

   return ticket;
  }
 
Ihor Herasko:

Вернуть имя переменной без особых ухищрений весьма затруднительно. Да и не нужно никому иметь имя переменной в качестве возвращаемого значения. Обычно возвращают значение переменной. В приведенном коде функция hfjfu() ничего не возвращает (у нее тип void). Поэтому указание команды return в конце ее выполнения не имеет никакого смысла. Если убрать эту строку, то ничего не изменится.

Чтобы функция вернула результат, нужно указать ее тип отличным от void:

int ticket=0; выступает в качестве переменной на которую ссылается программа если нужно произвести расчёты или просто учесть дополнительные 
данные или параметры при исполнении?
int ticket=0; может носить любое имя хоть кракозябру пиши?
почему нужно писать ticket=OrderSend(Symbol(),O.... а нельзя просто написать OrderSend(Symbol(),O....
если этого не написать выбивается ошибка что нет возвращаемого значения поэтому мне и подсказали создать 
переменную int ticket и написать ticket=OrderSend тогда программа ссылается на параметры int ticket т. е. на переменную в качестве обращения если
я правильно понимаю происходящее?
 
Seric29:

Написав ticket=OrderSend(...  вы помещаете в переменную ticket (программисты называют это присваиванием) результат выполнения функции OrderSend(...  Имя переменной может быть почти любое, есть определенные ограничения. Если написать просто OrderSend(... то компилятор выдаст ПРЕДУПРЕЖДЕНИЕ, что результат выполнения функции надо проверить. Если хотите общаться с программистами - то надо знать термины и выражения: Присвоить переменной значение, тип переменной, тип функции, компилятор выдает предупреждения и ошибки, ...

 
Seric29:

Не ошибка а предупреждение.

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

В вашем случае   OrderSend(.......) возвращает в случае успеха тикет установленного ордера(позиции),

в противном -1 то есть по какой то ошибке сервер отклонил ваш запрос на установку поз. или ордера,

что бы дальше произвести проверку

   ticket=OrderSend(................................);
      if(ticket>0)
        {
       if(UseSound) PlaySound(SoundSuccess); //  успех играет музыка
        } 
       else 
        {
       err=GetLastError();                   //ошибка
       PlaySound(SoundError); 
       }                                    //тоже играет музыка
                                            //но другая

  как то так

 
STARIJ:

Написав ticket=OrderSend(...  вы помещаете в переменную ticket (программисты называют это присваиванием) результат выполнения функции OrderSend(...  Имя переменной может быть почти любое, есть определенные ограничения. Если написать просто OrderSend(... то компилятор выдаст ПРЕДУПРЕЖДЕНИЕ, что результат выполнения функции надо проверить. Если хотите общаться с программистами - то надо знать термины и выражения: Присвоить переменной значение, тип переменной, тип функции, компилятор выдает предупреждения и ошибки, ...

В общем тёмный лес. Присваивать значение переменной какое там может быть значение в спрвочнике этот феномен не разъясняется или я плохо читал для чего это, короче бесполезно этим заниматься если не выучишь всё наизусть. Человек снял ролик в 13 году и он проста записал OrderSend и то что в скобках и откомпелировал и у него всё заработало я так сделал не заработало появилась эта ошибка а потом мне показал человек как исправить и я спрашиваю что за такие записи для чего как какую смысловую нагрузку они несут. Какой там может быть результат разработчики сами себе придумали задачу если условие способно оно должно выполняться если нет то пусть программа выдаст ошибка типа неправильно записан код.

 
Alekseu Fedotov:

Не ошибка а предупреждение.

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

В вашем случае   OrderSend(.......) возвращает в случае успеха тикет установленного ордера(позиции),

в противном -1 то есть по какой то ошибке сервер отклонил ваш запрос на установку поз. или ордера,

что бы дальше произвести проверку

  как то так

if(ticket>0) если текет больше 0 играет музыка. А что он может быть меньше 0. Ценовая динамика не может носить отрицательный характер.
if(ticket>0) это форма записи кода вашей идеи о том что при определённых условиях будет играть музыка.

 Ваш код не работает выбивается ошибка. 
Причина обращения: