Características da linguagem mql5, subtilezas e técnicas - página 152

 
Slava:

Existe algum? Tem a certeza de que está lá? Em que caminho se encontra?

Como posso reproduzi-lo?

Coloque o guião nos favoritos do Navigator.

void OnStart() {}


Compilar a versão errada.

void OnStart() {} 123


Reinicie o Terminal e tente editar o guião a partir dos Favoritos.

 
Vladimir Simakov:

Desenvolvedores. É necessária uma explicação. Em que acreditar? Os documentos ou a implementação? Até agora, parece haver um comportamento indefinido.

@fxsaber, não o recomendo a sua utilização antes das explicações oficiais, talvez eles o consertem.

A documentação está em atraso, vamos corrigi-la.

Não recomendo a inicialização de variáveis estáticas com expressões, se possível utilizar uma constante.

Porque quando se utiliza uma expressão não-constante, o compilador gera o seguinte código

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=value;    
   
   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
bool __Implicit_myStaticVar_initialized=false;
int  __Implicit_myStaticVar=0;

//--- исходная функция
int func(int value)
  {
   if(!__Implicit_myStaticVar_initialized)
     {
      __Implicit_myStaticVar_initialized=true;
      __Implicit_myStaticVar=value;
     }

   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }


Há uma sobrecarga, cada chamada irá verificar a bandeira __Implicit_myStaticVar_inicializada

Para o caso constante, receberá o seguinte código

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=10;

   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
int  __Implicit_myStaticVar=10;

int func(int value)
  {
   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }

Não há despesas gerais.

 
Ilyas:

Obrigado, agora compreendo as despesas gerais.

 
Pode facilmente escrever valores de preços não normalizados em caracteres personalizados. Abaixo está uma simples verificação.
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) PRINT(A);

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    ISNORM(Tick.bid)
    ISNORM(Tick.ask)
    ISNORM(Tick.last)
  }
}


Resultado

2019.12.11 06:46:56.458 2019.10.09 23:59:00   Tick.last = 1.8151900000000002 NormalizeDouble(Tick.last,_Digits) = 1.8151900000000000 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.bid = 1.8151100000000003 NormalizeDouble(Tick.bid,_Digits) = 1.8151100000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.bid = 1.8151200000000002 NormalizeDouble(Tick.bid,_Digits) = 1.8151199999999999 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL5 MT5 MetaTrader 5".
 
RickD:
... A questão é diferente. Talvez haja um bug na MQL5, precisamos de lidar com ele, mas adiá-lo para o tópico para novatos não nos ajuda a descobri-lo suficientemente cedo.

Por favor, leia o título do tópico.

 
Artyom Trishkin:

Por favor, leia o título do fio.

E onde vê a contradição? A situação descrita pode ser uma característica da língua, ou um bug. Era isso que queria descobrir.

 
RickD:

E onde vê a contradição? A situação descrita pode ser uma característica da língua, ou pode ser um bug. Era isso que queria descobrir.

Não. Primeiro descobre-se se se trata de um insecto ou de uma peculiaridade - depois é afixado exactamente, e exclusivamente uma peculiaridade. O tema é apenas sobre características.

 

@Ilyas@Slava@Renat Fatkhullin

mql tem apoio para palavras-chave não documentadas para funções

__inline
__forceinline

É razoável utilizá-los?
Em caso afirmativo, quando é que o compilador as aceitará?

 

No ArrayReverse ajuda:

A funçãoArraySetAsSeries() não move fisicamente os elementos da matriz, mas apenas inverte a direcção de indexação para trás para organizar o acesso aos elementos como numasérie temporal. A função ArrayReverse() move fisicamente os itens da matriz para que a matriz seja "invertida".

Mas este código prova o oposto:

  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  //ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     1970.01.01 00:00:00 - последний элемент
(EURUSD,H1)     =================
  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  //ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     1970.01.01 00:09:19 - последний элемент
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     =================