Características del lenguaje mql5, sutilezas y técnicas - página 152

 
Slava:

¿Hay alguna? ¿Está seguro de que hay uno? ¿En qué camino se encuentra?

¿Cómo puedo reproducirlo?

Coloque el script en los favoritos del Navegador.

void OnStart() {}


Compilar la versión incorrecta.

void OnStart() {} 123


Reinicie el Terminal e intente editar el script desde Favoritos.

 
Vladimir Simakov:

Los promotores. Se necesita una explicación. ¿Qué creer? ¿Los documentos o la aplicación? Hasta ahora aparece un comportamiento indefinido.

@fxsaber, no te recomiendo que lo uses antes de las explicaciones oficiales, quizás lo arreglen.

La documentación está atrasada, vamos a arreglarla.

No recomiendo inicializar las variables estáticas con expresiones, si es posible utiliza una constante.

Porque cuando se utiliza una expresión no constante, el compilador genera el siguiente 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);
  }


Hay una sobrecarga, cada llamada comprobará la bandera __Implicit_myStaticVar_initialized

Para el caso constante, obtendrá el siguiente 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);
  }

No hay gastos generales.

 
Ilyas:

Gracias, ahora entiendo lo de la sobrecarga.

 
Puede escribir fácilmente valores de precios no normalizados en caracteres personalizados. A continuación, una simple comprobación.
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 
 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL5 MT5 MetaTrader 5".
 
RickD:
... La cuestión es diferente. Tal vez hay un error en MQL5, tenemos que tratar con él, pero posponerlo al tema para los novatos no ayuda a resolver la situación rápidamente.

Por favor, lea el título del tema.

 
Artyom Trishkin:

Por favor, lea el título del hilo.

¿Y dónde ves la contradicción? La situación descrita puede ser una característica del lenguaje, o un error. Eso es lo que querías averiguar.

 
RickD:

¿Y dónde ves la contradicción? La situación descrita podría ser una característica del lenguaje, o podría ser un error. Eso es lo que querías averiguar.

No. Primero se averigua si es un error o una peculiaridad - entonces se publica exactamente, y exclusivamente una peculiaridad. El tema es sólo sobre las características.

 

@Ilyas@Slava@Renat Fatkhullin

mql tiene soporte para palabras clave no documentadas para las funciones

__inline
__forceinline

¿Es razonable utilizarlos?
En caso afirmativo, ¿cuándo los aceptará el compilador?

 

En la ayuda de ArrayReverse:

La funciónArraySetAsSeries() no mueve físicamente los elementos del array, sino que sólo invierte la dirección de indexación hacia atrás para organizar el acceso a los elementos como en unaserie temporal. La función ArrayReverse() mueve físicamente los elementos del array para que éste se "invierta".

Pero este código demuestra lo contrario:

  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)     =================
Razón de la queja: