Discussão sobre a documentação MQL4 - página 18

 
Bem... Do meu ponto de vista, essa é a resposta certa:

nulo SendMail( assunto, string some_text)
Envia um e-mail para o endereço especificado na janela de configurações na guia Mail.
A função não funciona em modo de teste. Esta função também não pode ser chamada a partir dos indicadores do usuário.
O envio pode ser proibido nas configurações, também o endereço de e-mail pode não ser especificado. A função GetLastError() deve ser chamada para obter as informações de erro.
[...]

No indicador, é verdade, não verifiquei... :)

Z.U. Eu me oponho ao título do tópico e proponho renomeá-lo para algo como isto: "Melhoria da documentação MQL4: remoção de inexatidões e deficiências". Algo parecido com isso.
 
No exemplo para a função OrderSelect(), encontrei tal expressão:
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
Depois vi isso também em outros lugares na documentação.

Por favor, explique, é apenas um estilo de programação?
Se não for, qual a razão para usar a operação de comparação de variáveis lógicas?
Por que uma expressão mais simples não é usada?
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx:
Por que não é utilizada uma expressão mais simples:

A primeira expressão é intuitivamente mais compreensível e não controversa, especialmente para iniciantes, embora a segunda expressão seja utilizada de forma mais ampla, provavelmente.
 
o que é um parâmetro formal e o que ele tem a ver com parâmetros passados por referência?
 
Muitas vezes as funções para o cálculo de valores exigem alguns parâmetros como entrada. Por exemplo, se observarmos a função OrderSend(), ela tem muitos desses parâmetros:
  • Símbolo
  • Tipo de pedido
  • Volume de posição em lotes
  • O preço da descoberta
  • Slippage em pips
e assim por diante. Os parâmetros passados para a função podem ser de dois tipos: os que não mudam em nada durante o funcionamento da função chamada e os que podem ser processados na mesma.
Por exemplo, vamos considerar a seguinte função:

//+------------------------------------------------------------------+
//|  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;   
  }
Três parâmetros são passados para SplitString(): um array ArrayRes por referência (precedido por um ampersand &) e dois parâmetros formais InputStrung (a cadeia a ser dividida em partes) e divisor (que é o divisor para a divisão).
Quando a função for executada, a matriz ArraRes conterá várias cordas. A função em si na MQL4 não pode retornar tipos complexos (por exemplo, array), mas ao usar a passagem dos parâmetros por referência, evitamos esta restrição.

O roteiro completo é o seguinte:

//+------------------------------------------------------------------+
//|                                                        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);
  }
//+------------------------------------------------------------------+
Execute-o em seu ambiente e veja o resultado.
 
Aqui está outro infeliz pedaço de documentação

pedido duploFecharPreço( )
Devolve o preço de fechamento do pedido selecionado.
A ordem deve ser pré-selecionada usando OrderSelect().
Exemplo:
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==verdadeiro) { 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());

A descrição está na função OrderClosePrice, enquanto o exemplo está na função OrderClosePrice.
É provavelmente por isso que 99% dos consultores especializados que analisamos fazem uma análise absolutamente desnecessária do tipo de pedido
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 0);
Quando você poderia simplesmente escrever
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)
 
Sim, esse é um ponto que eu peguei na semana passada. Eu acho que algo assim :

 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());
 
Citação

Três parâmetros são passados para SplitString(): matriz ArrayRes por referência (com ampersand & na frente) e dois parâmetros formais InputStrung (a cadeia a ser analisada) e divisor (que é o divisor para análise).
Quando a função for executada, a matriz ArraRes conterá várias cordas. A função em si na MQL4 não pode retornar tipos complexos (por exemplo, array), mas ao usar a passagem dos parâmetros por referência, evitamos esta restrição.
------

Eu entendo isso. Não entendo porque você os chamou de "formais". Estes parâmetros são passados apenas por diversão, puramente formal? Não existe tal coisa em C.

Por que a descrição dos tipos de parâmetros é descrita na seção "Variáveis" e não na seção "Funções"?
 
cout:
Eu entendo isso. Não entendo porque você os chama de "formais". São parâmetros que são simplesmente passados de um lado para o outro, puramente formais? Não existe tal coisa em C.


Porque as variáveis passadas para uma função são passadas para lá formalmente, não como variáveis, mas como seus valores. As variáveis podem ser manipuladas (seus valores alterados), enquanto que tais manipulações com valores não têm sentido.
Aqui está outra versão deste exemplo:

//+------------------------------------------------------------------+
//|                                                        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);
  }
//+------------------------------------------------------------------+
 
Portanto, chamá-los de "Passagem de parâmetros por valor".
Formalmente significa que nada depende de seu valor, por exemplo, reservado para uso futuro :). Mas os parâmetros passados por valor dependem de algo, caso contrário seriam chamados formais :).