Удаление отложенного ордера - страница 4

 
liana:

Я уже это читала. Там же ничего нет о предупреждениях. Ошибок нет, только предупреждение. А так как сама функция написаная FAQ наверняка правильная, то у меня и возникает вопрос - где искать концы?

int time=0;
string Symb;
int closePending;
int Total, Ticket;
int MagickNum=567; 
double Lts;

int start() 
{   
 Symb=Symbol();
 Total=0;
 Lts =0.1;
 for(int i=0; i<=OrdersTotal(); i++)
 {      
  if (OrderSelect(i,SELECT_BY_POS))
     { 
      if (OrderSymbol()==Symb)
         {
          if (OrderType()<2)
             {             
              Total++;
             }  
          }    
      }
  }            
      if (Total>1)
         { 
          return;
         }               
      else
         {    
          Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,0,Bid-40*Point,"",MagickNum,0,Red);  
          Ticket=OrderSend(Symb,OP_SELLSTOP,Lts,Ask-80*Point,3,0,0,"SellStop",MagickNum,0,Green); 
         }
  return;
}
    
void closePending(int MagickNum=0)
{
int i,time=0;
double prof;
   for(i=OrdersHistoryTotal()-1;i>=0;i--){//?????????? ??? ???????? ??????
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//??????? ? ???????? ????? ?? ??????
         if(OrderSymbol()!=Symbol()){continue;}//?????? ?? ??????? (???? ?? ???, ?? ??????????)
         if(MagickNum!=0&&OrderMagicNumber()!=MagickNum){continue;}//?????? ?? ??????, ???? ?? ????
         if(OrderType()>1){continue;}//???????? ?????????? - ??????????
         if(OrderCloseTime()>time){//???? ????? ????????? ?? ??????? ???????? ?? ?????????? ?????
            time = OrderCloseTime();
            prof = OrderProfit();//?????????? ??????
         }
      }
   }
   if(prof<0){return;}// ???? ?????? ????????????? (?? ??) ?????? ?? ??????
   if(time==0){return;}// ???? ????? ??????????????? ???????? ?? ?????? - ?? ?????
   // ???? ??? ??????? ??????? ?????????? ? ????????? ???????????(??)
   for(i=OrdersTotal();i>=0;i--){//?????????? ??? ???????? ?????? ??????
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){//??????? ? ???????? ????? ?? ??????
         if(OrderSymbol()!=Symbol()){continue;}//?????? ?? ??????? (???? ?? ???, ?? ??????????)
         if(MagickNum!=0&&OrderMagicNumber()!=MagickNum){continue;}//?????? ?? ??????, ???? ?? ????
         if(OrderType()<2){continue;}//?? ?????????? - ??????????
         OrderDelete(OrderTicket());// ??? ??? ???????? =  ??????????, ???????.      
      }
   }
   return (0);
}

 

И все-таки я не до конца понимаю эту строку
for(int i=0; i<=OrdersTotal(); i++)

Может кто-нибудь ее объяснить, как для тех кто в танке? :))

 
Roll:

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

Вызов функции (обращение к функции) - это запись, исполнение которой приводит к исполнению функции."

это вы с кем сейчас говорили? :)))

(Ну не понимаю я, хоть убей)

Описание функции состоит из двух основных частей - заголовка функции и тела функции.

Заголовок функции содержит указание типа возвращаемого значения, название функции и список формальных параметров, обрамлённый круглыми скобками. Если функция не должна возвращать никакого значения, то её тип обозначают void.

Это наш случай, правильно? И ....?

 
liana:

Почему-то предупреждает:


Function "ClosePending" is not referenced and will be removed from exp-file
Функция "ClosePending" не определена (нет ссылки) и будет удалена из exp-file


Почему так?

Перевод -- В связи с тем, что вызова функции нет, её описание будет удалено.
 

Аааа, то есть Void - это не вызов?

Там написано:
Оператор вызова функции - Название_функции (Список_параметров );
Убираю Void - ничего не происходит.

Ну я совсем запуталась. SOOOOS

 

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

1) штудируем Функции

2) Вам надо понять как работает MQL программа, для этого штудируем описание ее работы : Выполнение программ

3) Вам надо понять, что стандартные функции init(); deini(); start(); это такие же функции как и остальные, просто терминал знает только о них, и вызывает их в вот этой последовательности Специальные функции

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

 
int time=0;
string Symb;
int closePending;
int Total, Ticket;
int MagickNum=567; 
double Lts;

int start() 
{   
 Symb=Symbol();
 Total=0;
 Lts =0.1;
 for(int i=0; i<=OrdersTotal(); i++)
 {      
  if (OrderSelect(i,SELECT_BY_POS))
     { 
      if (OrderSymbol()==Symb)
         {
          if (OrderType()<2)
             {             
              Total++;
             }  
          }    
      }
  }            
      if (Total>1)
         { 
          closePending();
          return;
         }               
      else
         {    
          Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,0,Bid-40*Point,"",MagickNum,0,Red);  
          Ticket=OrderSend(Symb,OP_SELLSTOP,Lts,Ask-80*Point,3,0,0,"SellStop",MagickNum,0,Green); 
         }
  return;
}
    
void closePending(int MagickNum=0)
{
int i,time=0;
double prof;
   for(i=OrdersHistoryTotal()-1;i>=0;i--){//?????????? ??? ???????? ??????
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//??????? ? ???????? ????? ?? ??????
         if(OrderSymbol()!=Symbol()){continue;}//?????? ?? ??????? (???? ?? ???, ?? ??????????)
         if(MagickNum!=0&&OrderMagicNumber()!=MagickNum){continue;}//?????? ?? ??????, ???? ?? ????
         if(OrderType()>1){continue;}//???????? ?????????? - ??????????
         if(OrderCloseTime()>time){//???? ????? ????????? ?? ??????? ???????? ?? ?????????? ?????
            time = OrderCloseTime();
            prof = OrderProfit();//?????????? ??????
         }
      }
   }
   if(prof<0){return;}// ???? ?????? ????????????? (?? ??) ?????? ?? ??????
   if(time==0){return;}// ???? ????? ??????????????? ???????? ?? ?????? - ?? ?????
   // ???? ??? ??????? ??????? ?????????? ? ????????? ???????????(??)
   for(i=OrdersTotal();i>=0;i--){//?????????? ??? ???????? ?????? ??????
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){//??????? ? ???????? ????? ?? ??????
         if(OrderSymbol()!=Symbol()){continue;}//?????? ?? ??????? (???? ?? ???, ?? ??????????)
         if(MagickNum!=0&&OrderMagicNumber()!=MagickNum){continue;}//?????? ?? ??????, ???? ?? ????
         if(OrderType()<2){continue;}//?? ?????????? - ??????????
         OrderDelete(OrderTicket());// ??? ??? ???????? =  ??????????, ???????.      
      }
   }
   return (0);
}
 
liana:

И все-таки я не до конца понимаю эту строку
for(int i=0; i<=OrdersTotal(); i++)

Может кто-нибудь ее объяснить, как для тех кто в танке? :))


Перевожу, просто читаем :

для (переменная целого типа имя:= i. от i=0 (нуля), до количества ордеров i<(включительно)= OrdersTotal()<= стандартная функция, которая возвращает количество открытых сейчас ордеров. i++;<= увеличиваем значение переменной на 1 (простой инкремент) на каждой итерации (пока не достигнем максимального значения) OrdersTotal()

 
FAQ:

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

1) штудируем Функции

2) Вам надо понять как работает MQL программа, для этого штудируем описание ее работы : Выполнение программ

3) Вам надо понять, что стандартные функции init(); deini(); start(); это такие же функции как и остальные, просто терминал знает только о них, и вызывает их в вот этой последовательности Специальные функции

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



Спасибо, сейчас попробую поразбираться в этом.
 

Вразумите пожалуйста меня ещё.

Я так поняла, что есть функции которые возвращают значение:

int closePending(int MagickNum=0)
{
...
return(значение); // какое? 
}

И есть функции, которые не возвращают:

void closePending(int MagickNum=0)
{
...
}

Уважаемый FAQ, скажите пожалуйста, почему в функции void которую вы мне написали есть return;? Ведь Void не должна возвращать значения?
И если значение должно возвращаться, то что именно? return (OrderDelete);? или что-то еще?

И ещё вы написали:

"Вы можете написать все необходимые инструкции внутри стандартных функций (линейное программирование), и тогда интерпретатор терминала будет их исполнять, или записать их внутри собственных (пользовательских) функций, и потом вызывать их в теле самой программы(стандартной функции), при этом когда интерпретатор встретит строку с именем вашей функции, он будет искать ее в описательной части (за пределами стандартных функций), и исполнять ее код"

Значит ли это, что:

int closePending(0)
{
...
return(значение); 
}

Нужно каким-то образом поместить в тело

int start() 
{ ...

return(0); 
}

А затем вне этого поместить:

void closePending(int MagickNum=0)
{
...
}
Причина обращения: