Обсуждение документации MQL4 - страница 18

 
Дык... Как мне видится правильный ответ:

void SendMail( string subject, string some_text)
Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта".
Функция не работает в режиме тестирования. Из пользовательских индикаторов также нельзя вызывать эту функцию.
Отсылка может быть запрещена в настройках, также может быть не указан адрес электронной почты. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
[...]

В индикаторе, признаюсь, не проверял... :)

З.Ы. Протестую против названия темы и предлагаю ее переименовать, например, так: "Улучшение встроенной документации MQL4: устранение неточностей и недоработок". Что-то в этом роде.
 
В примере для функции OrderSelect() встретил такое выражение:
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
Потом встречал подобное и в других местах документации.

Объясните пожалуйста, это просто стиль программирования такой ?
Если нет, то чем вызвана необходимость использования операции сравнения для логических переменных ?
Почему не используется более простое выражение:
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx:
Почему не используется более простое выражение:

Первое выражение интуитивно более понятно и не вызывает никаких разночтений особенно для начинающих, хотя второе выражение используется более широко наверное.
 
что такое формальный параметр и какое он имеет отношение к параметрам, передаваемым по ссылке?
 
Часто функции для вычисления значений требуют на входе какие-то параметры. Например, если посмотреть функцию OrderSend() , то ей переадется куча таких параметров :
  • Символ
  • Тип ордера
  • Объем позиции в лотах
  • Цена открытия
  • Проскальзывание в пунтках
и так далее. Параметры , передаваемые в функцию, бывают двух типов - те, которые никак не изменяются при работе вызванной функции, и те, которые могут обрабатываться в ней.
Например, рассмотрим такую функцию:

//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   return;   
  }
В SplitString() передаются три параметра: массив ArrayRes по ссылке (впереди стоит амперсанд &) и два формальных параметра InputStrung (строка, которую будем разбирать на запчасти) и строка splitter (которая является разделителм при разборке).
После работы этой функции массив ArraRes будет содержать в себе несколько строк. Сама функция в MQL4 не имеет возможности возвращать сложные типы (например, массив), но используя передачу параметров по ссылке, мы обходим это огрнаничение.

Полный скрипт такой :

//+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   return;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string strInfo="aae|aer3|dzse|faw323";
   string strResult[] ;
   
   SplitString(strResult,strInfo,"|");
   
   int N=ArraySize(strResult);
   if (N>0)
      {
      for (int i=0;i<N;i++) Print("strResult[",i,"]=",strResult[i]);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Запустите у себя и посмотрите на результат работы.
 
Вот еще неудачный кусок документации

double OrderClosePrice( )
Возвращает цену закрытия выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Пример:
  if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderOpenTime();
     if(ctm>0) Print("Open time for the order 10 ", ctm);
     ctm=OrderCloseTime();
     if(ctm>0) Print("Close time for the order 10 ", ctm);
    }
  else
    Print("OrderSelect failed error code is",GetLastError());

Описание на функцию OrderClosePrice, а пример на функцию OrderClosePrice.
Наверное поэтому в 99% просмотренных экспертов делается совершенно не нужный анализ на тип ордера
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 0);
Когда можно просто написать
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)
 
Да, этот момент я уже выловил на прошлой неделе. Думаю, что то вроде этого :

 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime  ctm= OrderOpenTime();if(ctm>0)
     Print("Open time for the order 10 ", TimeToStr(ctm)); 
     double price=OrderClosePrice();
     if(price>0) Print("Close price for the order 10 ", DoubleToStr(price,MarketInfo(OrderSymbol(),MODE_DIGITS)));
    }
  else
    Print("OrderSelect failed error code is",GetLastError());


 
 
Цитата
------
В SplitString() передаются три параметра: массив ArrayRes по ссылке (впереди стоит амперсанд &) и два формальных параметра InputStrung (строка, которую будем разбирать на запчасти) и строка splitter (которая является разделителм при разборке).
После работы этой функции массив ArraRes будет содержать в себе несколько строк. Сама функция в MQL4 не имеет возможности возвращать сложные типы (например, массив), но используя передачу параметров по ссылке, мы обходим это огрнаничение.
------

Это я понимаю. Я не понимаю почему вы их назвали "формальными". Это параметры, которые передаются просто так, чисто формально? Нет такого в Си.

Почему описание типов параметров описывается в разделе "Переменные", а не в разделе "Функции"?
 
cout:
Это я понимаю. Я не понимаю почему вы их назвали "формальными". Это параметры, которые передаются просто так, чисто формально? Нет такого в Си.


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

//+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   InputString="Входная строка";
   splitter="разделитель";
   Print("InputString=",InputString,"    splitter=",splitter);
   return;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string strInfo="aae|aer3|dzse|faw323";
   string strResult[] ;
   string devider="|";
   SplitString(strResult,strInfo,devider);
   
   int N=ArraySize(strResult);
   if (N>0)
      {
      for (int i=0;i<N;i++) Print("strResult[",i,"]=",strResult[i]);
      }
   Print("strInfo=",strInfo,"    devider=",devider);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Ну так и назовите их "Передача параметров по значению".
Формально - значит, что от его значения ничего не зависит, например, зарезервированный для будущего использования :). Но ведь от параметров, переданных по значению, что-то зависит, иначе они бы назывались формальными :).
Причина обращения: